diff options
373 files changed, 27715 insertions, 7729 deletions
@@ -33,7 +33,7 @@ Alexander Klimov <ask@wisdom.weizmann.ac.il> Alexander Smishlajev <als@turnhere.com> Alexey Mahotkin <alexm@netli.com> Alexey V. Barantsev <barancev@kazbek.ispras.ru> -Allen Smith <easmith@beatrice.rutgers.edu> +Allen Smith <allens@cpan.org> Ambrose Kofi Laing Ananth Kesari <HYanantha@novell.com> Andreas Klussmann <andreas@infosys.heitec.de> @@ -78,7 +78,7 @@ Brad Appleton <bradapp@enteract.com> Brad Howerter <bhower@wgc.woodward.com> Brad Hughes <brad@tgsmc.com> Brad Lanam <bll@gentoo.com> -Brendan O'Dea <bod@compusol.com.au> +Brendan O'Dea <bod@debian.org> Brent B. Powers <powers@ml.com> Brent Dax <brentdax@cpan.org> Brian Callaghan <callagh@itginc.com> @@ -128,7 +128,7 @@ Clinton A. Pierce <clintp@geeksalad.org> Colin Kuskie <ckuskie@cadence.com> Colin McMillen <mcmi0073@tc.umn.edu> Colin Meyer <cmeyer@helvella.org> -Colin Watson <colin@zeus.com> +Colin Watson <colinw@zeus.com> Conrad Augustin Conrad E. Kimball <cek@tblv021.ca.boeing.com> Coral <coral@moonlight.crystalflame.net> @@ -186,7 +186,6 @@ Dean Roehrich <roehrich@cray.com> deekoo <deekoo@tentacle.net> Dennis Marsa <dennism@cyrix.com> Diab Jerius <dj@head-cfa.harvard.edu> -dive <dive@ender.com> dLux <dlux@spam.sch.bme.hu> Dominic Dunlop <domo@computer.org> Dominique Dumont <Dominique_Dumont@grenoble.hp.com> @@ -415,7 +414,7 @@ Kevin White <klwhite@magnus.acs.ohio-state.edu> Kim Frutiger Kingpin <mthurn@copper.dulles.tasc.com> Kirrily Robert <skud@infotrope.net> -Kragen Sitaker <kragen@dnaco.net> +Kragen Sitaker <kragen@pobox.com> Krishna Sethuraman <krishna@sgi.com> Kurt D. Starsinic <kstar@wolfetech.com> Kyriakos Georgiou @@ -538,7 +537,7 @@ Paul Hoffman <phoffman@proper.com> Paul Holser <Paul.Holser.pholser@nortelnetworks.com> Paul Johnson <paul@pjcj.net> Paul Lindner <lindner@inuus.com> -Paul Marquess <paul_marquess@yahoo.co.uk> +Paul Marquess <paul.marquess@btinternet.com> Paul Moore <Paul.Moore@uk.origin-it.com> Paul Rogers <Paul.Rogers@Central.Sun.COM> Paul Saab <ps@yahoo-inc.com> @@ -621,6 +620,7 @@ Scott Gifford <sgifford@tir.com> Scott Henry <scotth@sgi.com> Scott L. Miller <Scott.L.Miller@Compaq.com> Sean Dague <sean@dague.net> +Sean Davis <dive@ender.com> Sean M. Burke <sburke@cpan.org> Sean Robinson <robinson_s@sc.maricopa.edu> Sean Sheedy <seans@ncube.com> @@ -637,7 +637,7 @@ Slaven Rezic <eserte@cs.tu-berlin.de> Spider Boardman <spider@orb.nashua.nh.us> Stas Bekman <stas@stason.org> Steffen Mueller <xyey9001@sneakemail.com> -Stephane Payrard <stef@francenet.fr> +Stéphane Payrard <stef@mongueurs.net> Stephanie Beals <bealzy@us.ibm.com> Stephen McCamant <alias@mcs.com> Stephen O. Lidie <lusol@turkey.cc.Lehigh.EDU> @@ -709,7 +709,7 @@ Vishal Bhatia <vishal@deja.com> Vlad Harchev <hvv@hippo.ru> Vladimir Alexiev <vladimir@cs.ualberta.ca> W. Phillip Moore <wpm@ms.com> -Walt Mankowski <waltman@netaxs.com> +Walt Mankowski <waltman@pobox.com> Walter Briscoe <w.briscoe@ponl.com> Warren Hyde <whyde@pezz.sps.mot.com> Warren Jones <wjones@tc.fluke.com> @@ -1116,6 +1116,7 @@ defvoidused='' voidflags='' pm_apiversion='' xs_apiversion='' +gccansipedantic='' yacc='' yaccflags='' CONFIG='' @@ -2152,11 +2153,12 @@ for dir in \$*; do elif test -f \$dir/\$thing.exe; then if test -n "$DJGPP"; then echo \$dir/\$thing.exe - else + exit 0 + elif test "$eunicefix" != ":"; then : on Eunice apparently echo \$dir/\$thing + exit 0 fi - exit 0 fi ;; esac @@ -3852,14 +3854,17 @@ case "$ccname" in '') ccname="$cc" ;; esac -# gcc 3.1 complains about adding -Idirectories that it already knows about, +# gcc 3.* complain about adding -Idirectories that they already know about, # so we will take those off from locincpth. case "$gccversion" in 3*) echo "main(){}">try.c - for incdir in `$cc -v -c try.c 2>&1 | \ - sed '1,/^#include <\.\.\.>/d;/^End of search list/,$d;s/^ //'` ; do - locincpth=`echo $locincpth | sed s!$incdir!!` + for incdir in $locincpth; do + warn=`$cc $ccflags -I$incdir -c try.c 2>&1 | \ + grep '^cc1: warning: changing search order '` + if test "X$warn" != X; then + locincpth=`echo " $locincpth " | sed "s! $incdir ! !"` + fi done $rm -f try try.* esac @@ -5417,7 +5422,7 @@ case "$usenm" in esac case "$dflt" in '') - if $test "$osname" = aix -a ! -f /lib/syscalls.exp; then + if $test "$osname" = aix -a "X$PASE" != "$Xdefine" -a ! -f /lib/syscalls.exp; then echo " " echo "Whoops! This is an AIX system without /lib/syscalls.exp!" >&4 echo "'nm' won't be sufficient on this sytem." >&4 @@ -5764,11 +5769,19 @@ else fi fi nm_extract="$com" -if $test -f /lib/syscalls.exp; then +case "$PASE" in +define) + echo " " + echo "Since you are compiling for PASE, extracting more symbols from libc.a...">&4 + dump -Tv /lib/libc.a | awk '$7 == "/unix" {print $5 " " $8}' | grep "^SV" | awk '{print $2}' >> libc.list + ;; +*) if $test -f /lib/syscalls.exp; then echo " " echo "Also extracting names from /lib/syscalls.exp for good ole AIX..." >&4 $sed -n 's/^\([^ ]*\)[ ]*syscall[0-9]*[ ]*$/\1/p' /lib/syscalls.exp >>libc.list -fi + fi + ;; +esac ;; esac $rm -f libnames libpath @@ -6355,9 +6368,9 @@ else $cat <<EOM In some special cases, particularly when building $package for distribution, -it is convenient to distinguish between the directory in which files should -be installed from the directory ($prefix) in which they -will eventually reside. For most users, these two directories are the same. +it is convenient to distinguish the directory in which files should be +installed from the directory ($prefix) in which they will +eventually reside. For most users, these two directories are the same. EOM case "$installprefix" in @@ -7385,13 +7398,33 @@ echo " " if $test -d /usr/bin -a "X$installbin" != X/usr/bin; then $cat <<EOM Many scripts expect perl to be installed as /usr/bin/perl. -I can install the perl you are about to compile also as /usr/bin/perl -(in addition to $installbin/perl). + +If you want to, I can install the perl you are about to compile +as /usr/bin/perl (in addition to $bin/perl). EOM - case "$installusrbinperl" in - "$undef"|[nN]*) dflt='n';; - *) dflt='y';; - esac + if test -f /usr/bin/perl; then + $cat <<EOM + +However, please note that because you already have a /usr/bin/perl, +overwriting that with a new Perl would very probably cause problems. +Therefore I'm assuming you don't want to do that (unless you insist). + +EOM + case "$installusrbinperl" in + "$define"|[yY]*) dflt='y';; + *) dflt='n';; + esac + else + $cat <<EOM + +Since you don't have a /usr/bin/perl I'm assuming creating one is okay. + +EOM + case "$installusrbinperl" in + "$undef"|[nN]*) dflt='n';; + *) dflt='y';; + esac + fi rp="Do you want to install perl as /usr/bin/perl?" . ./myread case "$ans" in @@ -19424,7 +19457,19 @@ Note that DynaLoader is always built and need not be mentioned here. EOM case "$dynamic_ext" in - '') dflt="$avail_ext" ;; + '') + : Exclude those listed in static_ext + dflt='' + for xxx in $avail_ext; do + case " $static_ext " in + *" $xxx "*) ;; + *) dflt="$dflt $xxx" ;; + esac + done + set X $dflt + shift + dflt="$*" + ;; *) dflt="$dynamic_ext" # Perhaps we are reusing an old out-of-date config.sh. case "$hint" in @@ -20579,6 +20624,7 @@ vi='$vi' voidflags='$voidflags' xlibpth='$xlibpth' xs_apiversion='$xs_apiversion' +gccansipedantic='$gccansipedantic' yacc='$yacc' yaccflags='$yaccflags' zcat='$zcat' @@ -712,6 +712,14 @@ If you decide to use ithreads, the 'threads' module allows their use, and the 'Thread' module offers an interface to both 5005threads and ithreads (whichever has been configured). +When building threaded for certain library calls like the getgr*() and +the getpw*() there is a dynamically sized result buffer: the buffer +starts small but Perl will keep growing the buffer until the result fits. +To get a fixed upper limit you will have to recompile Perl with +PERL_REENTRANT_MAXSIZE defined to be the number of bytes you want. +One way to do this is to run Configure with +C<-Accflags=-DPERL_REENTRANT_MAXSIZE=65536> + =head2 Large file support. Since Perl 5.6.0, Perl has supported large files (files larger than @@ -1550,10 +1558,22 @@ referring to __inet_* symbols, check to see whether BIND 8.1 is installed. It installs a /usr/local/include/arpa/inet.h that refers to these symbols. Versions of BIND later than 8.1 do not install inet.h in that location and avoid the errors. You should probably update to a -newer version of BIND. If you can't, you can either link with the -updated resolver library provided with BIND 8.1 or rename -/usr/local/bin/arpa/inet.h during the Perl build and test process to -avoid the problem. +newer version of BIND (and remove the files the old one left behind). +If you can't, you can either link with the updated resolver library provided +with BIND 8.1 or rename /usr/local/bin/arpa/inet.h during the Perl build and +test process to avoid the problem. + +=item *_r() prototype NOT found + +On a related note, if you see a bunch of complaints like the above about +reentrant functions - specifically networking-related ones - being present +but without prototypes available, check to see if BIND 8.1 (or possibly +other BIND 8 versions) is (or has been) installed. They install +header files such as netdb.h into places such as /usr/local/include (or into +another directory as specified at build/install time), at least optionally. +Remove them or put them in someplace that isn't in the C preprocessor's +header file include search path (determined by -I options plus defaults, +normally /usr/include). =item #error "No DATAMODEL_NATIVE specified" @@ -203,41 +203,42 @@ ext/DynaLoader/Makefile.PL Dynamic Loader makefile writer ext/DynaLoader/README Dynamic Loader notes and intro ext/DynaLoader/XSLoader_pm.PL Simple XS Loader perl module ext/Encode/AUTHORS List of authors -ext/Encode/bin/enc2xs Encode module generator -ext/Encode/bin/piconv iconv by perl +ext/Encode/bin/enc2xs Encode module generator +ext/Encode/bin/piconv iconv by perl ext/Encode/bin/ucm2table Table Generator for testing -ext/Encode/bin/ucmlint A UCM Lint utility -ext/Encode/bin/unidump Unicode Dump like hexdump(1) -ext/Encode/Byte/Byte.pm Encode extension -ext/Encode/Byte/Makefile.PL Encode extension +ext/Encode/bin/ucmlint A UCM Lint utility +ext/Encode/bin/ucmsort A UCM sort utility +ext/Encode/bin/unidump Unicode Dump like hexdump(1) +ext/Encode/Byte/Byte.pm Encode extension +ext/Encode/Byte/Makefile.PL Encode extension ext/Encode/Changes Change Log ext/Encode/CN/CN.pm Encode extension ext/Encode/CN/Makefile.PL Encode extension -ext/Encode/EBCDIC/EBCDIC.pm Encode extension -ext/Encode/EBCDIC/Makefile.PL Encode extension +ext/Encode/EBCDIC/EBCDIC.pm Encode extension +ext/Encode/EBCDIC/Makefile.PL Encode extension ext/Encode/encengine.c Encode extension -ext/Encode/Encode.pm Mother of all Encode extensions +ext/Encode/Encode.pm Mother of all Encode extensions ext/Encode/Encode.xs Encode extension -ext/Encode/Encode/Changes.e2x Skeleton file for enc2xs +ext/Encode/Encode/Changes.e2x Skeleton file for enc2xs ext/Encode/Encode/ConfigLocal_PM.e2x Skeleton file for enc2xs -ext/Encode/Encode/encode.h Encode extension header file +ext/Encode/Encode/encode.h Encode extension header file ext/Encode/Encode/Makefile_PL.e2x Skeleton file for enc2xs -ext/Encode/Encode/README.e2x Skeleton file for enc2xs -ext/Encode/Encode/_PM.e2x Skeleton file for enc2xs -ext/Encode/Encode/_T.e2x Skeleton file for enc2xs -ext/Encode/encoding.pm Perl Pragmactic Module +ext/Encode/Encode/README.e2x Skeleton file for enc2xs +ext/Encode/Encode/_PM.e2x Skeleton file for enc2xs +ext/Encode/Encode/_T.e2x Skeleton file for enc2xs +ext/Encode/encoding.pm Perl Pragmactic Module ext/Encode/JP/JP.pm Encode extension ext/Encode/JP/Makefile.PL Encode extension ext/Encode/KR/KR.pm Encode extension -ext/Encode/KR/Makefile.PL Encode extension -ext/Encode/lib/Encode/Alias.pm Encode extension +ext/Encode/KR/Makefile.PL Encode extension +ext/Encode/lib/Encode/Alias.pm Encode extension ext/Encode/lib/Encode/CJKConstants.pm Encode extension ext/Encode/lib/Encode/CN/HZ.pm Encode extension -ext/Encode/lib/Encode/Config.pm Encode configuration module -ext/Encode/lib/Encode/Encoder.pm OO Encoder +ext/Encode/lib/Encode/Config.pm Encode configuration module +ext/Encode/lib/Encode/Encoder.pm OO Encoder ext/Encode/lib/Encode/Encoding.pm Encode extension ext/Encode/lib/Encode/Guess.pm Encode Extension -ext/Encode/lib/Encode/JP/H2Z.pm Encode extension +ext/Encode/lib/Encode/JP/H2Z.pm Encode extension ext/Encode/lib/Encode/JP/JIS7.pm Encode extension ext/Encode/lib/Encode/KR/2022_KR.pm Encode extension ext/Encode/lib/Encode/MIME/Header.pm Encode extension @@ -246,37 +247,38 @@ ext/Encode/lib/Encode/Supported.pod Documents for supported encodings ext/Encode/Makefile.PL Encode extension makefile writer ext/Encode/MANIFEST Encode extension ext/Encode/README Encode extension -ext/Encode/Symbol/Makefile.PL Encode extension -ext/Encode/Symbol/Symbol.pm Encode extension -ext/Encode/t/Aliases.t test script -ext/Encode/t/at-cn.t test script -ext/Encode/t/at-tw.t test script +ext/Encode/Symbol/Makefile.PL Encode extension +ext/Encode/Symbol/Symbol.pm Encode extension +ext/Encode/t/Aliases.t test script +ext/Encode/t/at-cn.t test script +ext/Encode/t/at-tw.t test script ext/Encode/t/big5-eten.enc test data ext/Encode/t/big5-eten.utf test data ext/Encode/t/big5-hkscs.enc test data ext/Encode/t/big5-hkscs.utf test data -ext/Encode/t/CJKT.t test script -ext/Encode/t/Encode.t test script -ext/Encode/t/Encoder.t test script -ext/Encode/t/encoding.t test script -ext/Encode/t/fallback.t test script -ext/Encode/t/gb2312.enc test data -ext/Encode/t/gb2312.utf test data -ext/Encode/t/grow.t test script -ext/Encode/t/guess.t test script +ext/Encode/t/CJKT.t test script +ext/Encode/t/Encode.t test script +ext/Encode/t/Encoder.t test script +ext/Encode/t/encoding.t test script +ext/Encode/t/fallback.t test script +ext/Encode/t/gb2312.enc test data +ext/Encode/t/gb2312.utf test data +ext/Encode/t/grow.t test script +ext/Encode/t/guess.t test script ext/Encode/t/jisx0201.enc test data ext/Encode/t/jisx0201.utf test data ext/Encode/t/jisx0208.enc test data ext/Encode/t/jisx0208.utf test data ext/Encode/t/jisx0212.enc test data ext/Encode/t/jisx0212.utf test data -ext/Encode/t/jperl.t test script +ext/Encode/t/jperl.t test script ext/Encode/t/ksc5601.enc test data ext/Encode/t/ksc5601.utf test data ext/Encode/t/mime-header.t test script -ext/Encode/t/perlio.t test script +ext/Encode/t/perlio.t test script +ext/Encode/t/rt.pl test script ext/Encode/t/unibench.pl benchmark script -ext/Encode/t/Unicode.t test script +ext/Encode/t/Unicode.t test script ext/Encode/TW/Makefile.PL Encode extension ext/Encode/TW/TW.pm Encode extension ext/Encode/ucm/8859-1.ucm Unicode Character Map @@ -474,6 +476,7 @@ ext/List/Util/README Util extension ext/List/Util/t/blessed.t Scalar::Util ext/List/Util/t/dualvar.t Scalar::Util ext/List/Util/t/first.t List::Util +ext/List/Util/t/isvstring.t Scalar::Util ext/List/Util/t/max.t List::Util ext/List/Util/t/maxstr.t List::Util ext/List/Util/t/min.t List::Util @@ -481,6 +484,7 @@ ext/List/Util/t/minstr.t List::Util ext/List/Util/t/openhan.t Scalar::Util ext/List/Util/t/readonly.t Scalar::Util ext/List/Util/t/reduce.t List::Util +ext/List/Util/t/refaddr.t Scalar::Util ext/List/Util/t/reftype.t Scalar::Util ext/List/Util/t/shuffle.t List::Util ext/List/Util/t/sum.t List::Util @@ -570,6 +574,7 @@ ext/re/re.t see if re pragma works ext/re/re.xs re extension external subroutines ext/Safe/safe1.t See if Safe works ext/Safe/safe2.t See if Safe works +ext/Safe/safe3.t See if Safe works ext/SDBM_File/Makefile.PL SDBM extension makefile writer ext/SDBM_File/sdbm.t See if SDBM_File works ext/SDBM_File/sdbm/biblio SDBM kit @@ -680,6 +685,7 @@ ext/threads/shared/t/0nothread.t Tests for basic shared array functionality. ext/threads/shared/t/av_refs.t Tests for arrays containing references ext/threads/shared/t/av_simple.t Tests for basic shared array functionality. ext/threads/shared/t/cond.t Test condition variables +ext/threads/shared/t/disabled.t Test threads::shared when threads are disabled. ext/threads/shared/t/hv_refs.t Test shared hashes containing references ext/threads/shared/t/hv_simple.t Tests for basic shared hash functionality. ext/threads/shared/t/no_share.t Tests for disabled share on variables. @@ -706,6 +712,7 @@ ext/Time/HiRes/HiRes.pm Time::HiRes extension ext/Time/HiRes/HiRes.t Test for Time::HiRes ext/Time/HiRes/HiRes.xs Time::HiRes extension ext/Time/HiRes/Makefile.PL Time::HiRes extension +ext/Time/HiRes/typemap Time::HiRes extension ext/Unicode/Normalize/Changes Unicode::Normalize ext/Unicode/Normalize/Makefile.PL Unicode::Normalize ext/Unicode/Normalize/mkheader Unicode::Normalize @@ -807,6 +814,7 @@ hints/openbsd.sh Hints for named architecture hints/opus.sh Hints for named architecture hints/os2.sh Hints for named architecture hints/os390.sh Hints for named architecture +hints/os400.sh Hints for named architecture hints/posix-bc.sh Hints for named architecture hints/powerux.sh Hints for named architecture hints/qnx.sh Hints for named architecture @@ -927,9 +935,15 @@ lib/bigint.pl An arbitrary precision integer arithmetic package lib/bigint.pm bignum lib/bigintpl.t See if bigint.pl works lib/bignum.pm bignum +lib/bignum/t/bn_lite.t See if bignum works +lib/bignum/t/br_lite.t See if bignum works lib/bignum/t/bigint.t See if bignum works lib/bignum/t/bignum.t See if bignum works lib/bignum/t/bigrat.t See if bignum works +lib/bignum/t/biinfnan.t See if bignum works +lib/bignum/t/bninfnan.t See if bignum works +lib/bignum/t/brinfnan.t See if bignum works +lib/bignum/t/infnan.inc See if bignum works lib/bignum/t/option_a.t See if bignum works lib/bignum/t/option_l.t See if bignum works lib/bignum/t/option_p.t See if bignum works @@ -1219,6 +1233,7 @@ lib/Math/BigFloat.pm An arbitrary precision floating-point arithmetic package lib/Math/BigFloat/Trace.pm bignum tracing lib/Math/BigInt.pm An arbitrary precision integer arithmetic package lib/Math/BigInt/Calc.pm Pure Perl module to support Math::BigInt +lib/Math/BigInt/Scalar.pm Pure Perl module to support Math::BigInt lib/Math/BigInt/t/bare_mbf.t Test MBF under Math::BigInt::BareCalc lib/Math/BigInt/t/bare_mbi.t Test MBI under Math::BigInt::BareCalc lib/Math/BigInt/t/bare_mif.t Rounding tests under BareCalc @@ -1227,6 +1242,7 @@ lib/Math/BigInt/t/bigfltpm.t See if BigFloat.pm works lib/Math/BigInt/t/bigintc.t See if BigInt/Calc.pm works lib/Math/BigInt/t/bigintpm.inc Shared tests for bigintpm.t and sub_mbi.t lib/Math/BigInt/t/bigintpm.t See if BigInt.pm works +lib/Math/BigInt/t/bigints.t See if BigInt.pm works lib/Math/BigInt/t/calling.t Test calling conventions lib/Math/BigInt/t/config.t Test Math::BigInt->config() lib/Math/BigInt/t/constant.t Test Math::BigInt/BigFloat under :constant @@ -1251,6 +1267,7 @@ lib/Math/BigInt/t/use_lib4.t Test combinations of Math::BigInt and BigFloat lib/Math/BigInt/t/with_sub.t Test use Math::BigFloat with => package lib/Math/BigInt/Trace.pm bignum tracing lib/Math/BigRat.pm Math::BigRat +lib/Math/BigRat/t/big_ap.t Math::BigRat test lib/Math/BigRat/t/bigfltpm.inc Math::BigRat test lib/Math/BigRat/t/bigfltrt.t Math::BigRat test lib/Math/BigRat/t/bigrat.t Math::BigRat test @@ -1318,14 +1335,18 @@ lib/Net/NNTP.pm libnet lib/Net/Ping.pm Hello, anybody home? lib/Net/Ping/Changes Net::Ping lib/Net/Ping/README Net::Ping -lib/Net/Ping/t/100_load.t Ping Net::Ping -lib/Net/Ping/t/110_icmp_inst.t Ping Net::Ping -lib/Net/Ping/t/120_udp_inst.t Ping Net::Ping -lib/Net/Ping/t/130_tcp_inst.t Ping Net::Ping +lib/Net/Ping/t/100_load.t Ping Net::Ping +lib/Net/Ping/t/110_icmp_inst.t Ping Net::Ping +lib/Net/Ping/t/120_udp_inst.t Ping Net::Ping +lib/Net/Ping/t/130_tcp_inst.t Ping Net::Ping lib/Net/Ping/t/140_stream_inst.t Ping Net::Ping -lib/Net/Ping/t/200_ping_tcp.t Ping Net::Ping -lib/Net/Ping/t/250_ping_hires.t Ping Net::Ping +lib/Net/Ping/t/150_syn_inst.t Ping Net::Ping +lib/Net/Ping/t/200_ping_tcp.t Ping Net::Ping +lib/Net/Ping/t/250_ping_hires.t Ping Net::Ping lib/Net/Ping/t/300_ping_stream.t Ping Net::Ping +lib/Net/Ping/t/300_ping_stream.t Ping Net::Ping +lib/Net/Ping/t/400_ping_syn.t Ping Net::Ping +lib/Net/Ping/t/450_service.t Ping Net::Ping lib/Net/POP3.pm libnet lib/Net/protoent.pm By-name interface to Perl's builtin getproto* lib/Net/protoent.t See if Net::protoent works @@ -1394,6 +1415,7 @@ lib/Pod/t/parselink.t podlators test lib/Pod/t/pod2html-lib.pl pod2html testing library lib/Pod/t/Select.t See if Pod::Select works lib/Pod/t/text-errors.t podlators test +lib/Pod/t/text-options.t podlators test lib/Pod/t/text.t podlators test lib/Pod/t/Usage.t See if Pod::Usage works lib/Pod/t/utils.t Test for Pod::ParseUtils @@ -1466,6 +1488,7 @@ lib/Test/Simple/t/bad_plan.t Test::Builder plan() test lib/Test/Simple/t/buffer.t Test::Builder buffering test lib/Test/Simple/t/Builder.t Test::Builder tests lib/Test/Simple/t/curr_test.t Test::Builder->curr_test tests +lib/Test/Simple/t/details.t Test::Builder tests lib/Test/Simple/t/diag.t Test::More diag() test lib/Test/Simple/t/exit.t Test::Simple test, exit codes lib/Test/Simple/t/extra.t Test::Simple test @@ -1473,8 +1496,12 @@ lib/Test/Simple/t/fail-like.t Test::More test, like() failures lib/Test/Simple/t/fail-more.t Test::More test, tests failing lib/Test/Simple/t/fail.t Test::Simple test, test failures lib/Test/Simple/t/filehandles.t Test::Simple test, STDOUT can be played with +lib/Test/Simple/t/fork.t Test::More fork tests +lib/Test/Simple/t/has_plan.t Test::Builder->plan tests +lib/Test/Simple/t/has_plan2.t Test::More->plan tests lib/Test/Simple/t/import.t Test::More test, importing functions lib/Test/Simple/t/is_deeply.t Test::More test, is_deeply() +lib/Test/Simple/t/ok_obj.t Test::Builder object tests lib/Test/Simple/t/maybe_regex.t Test::Builder->maybe_regex() tests lib/Test/Simple/t/missing.t Test::Simple test, missing tests lib/Test/Simple/t/More.t Test::More test, basic stuff @@ -1593,6 +1620,7 @@ lib/Unicode/Collate.pm Unicode::Collate lib/Unicode/Collate/Changes Unicode::Collate lib/Unicode/Collate/keys.txt Unicode::Collate lib/Unicode/Collate/README Unicode::Collate +lib/Unicode/Collate/t/index.t Unicode::Collate lib/Unicode/Collate/t/test.t Unicode::Collate lib/Unicode/README Explanation what happened to lib/unicode. lib/Unicode/UCD.pm Unicode character database @@ -2127,6 +2155,7 @@ pod/perl56delta.pod Changes from 5.005 to 5.6 pod/perl570delta.pod Changes from 5.6 to 5.7.0 pod/perl571delta.pod Changes from 5.7.0 to 5.7.1 pod/perl572delta.pod Changes from 5.7.1 to 5.7.2 +pod/perl573delta.pod Changes from 5.7.2 to 5.7.3 pod/perl58delta.pod Changes from 5.6 to 5.8.0 pod/perlapi.pod Perl API documentation (autogenerated) pod/perlapio.pod PerlIO IO API info @@ -2279,6 +2308,7 @@ README.mpeix Notes about MPE/iX port README.netware Notes about NetWare port README.os2 Notes about OS/2 port README.os390 Notes about OS/390 (nee MVS) port +README.os400 Notes about OS/400 port README.plan9 Notes about Plan9 port README.qnx Notes about QNX port README.solaris Notes about Solaris port @@ -2326,6 +2356,7 @@ t/comp/cpp.t See if C preprocessor works t/comp/decl.t See if declarations work t/comp/hints.t See if %^H works t/comp/multiline.t See if multiline strings work +t/comp/our.t Tests for our declaration t/comp/package.t See if packages work t/comp/proto.t See if function prototypes work t/comp/redef.t See if we get correct warnings on redefined subs @@ -2416,6 +2447,7 @@ t/lib/Test/Simple/sample_tests/extras.plx for exit.t t/lib/Test/Simple/sample_tests/five_fail.plx for exit.t t/lib/Test/Simple/sample_tests/last_minute_death.plx for exit.t t/lib/Test/Simple/sample_tests/one_fail.plx for exit.t +t/lib/Test/Simple/sample_tests/pre_plan_death.plx for exit.t t/lib/Test/Simple/sample_tests/require.plx for exit.t t/lib/Test/Simple/sample_tests/success.plx for exit.t t/lib/Test/Simple/sample_tests/too_few.plx for exit.t @@ -2492,6 +2524,7 @@ t/op/fh.t See if filehandles work t/op/filetest.t See if file tests work t/op/flip.t See if range operator works t/op/fork.t See if fork works +t/op/getpid.t See if $$ and getppid work with threads t/op/glob.t See if <*> works t/op/gmagic.t See if GMAGIC works t/op/goto.t See if goto works @@ -2553,6 +2586,7 @@ t/op/splice.t See if splice works t/op/split.t See if split works t/op/sprintf.t See if sprintf works t/op/srand.t See if srand works +t/op/stash.t See if %:: stashes work t/op/stat.t See if stat works t/op/study.t See if study works t/op/subst.t See if substitution works diff --git a/Porting/Glossary b/Porting/Glossary index 1ceb4dddbd..9cec029211 100644 --- a/Porting/Glossary +++ b/Porting/Glossary @@ -8,6 +8,25 @@ programs (e.g. I_UNISTD) are already described in config_h.SH. [`configpm' generates pod documentation for Config.pm from this file--please try to keep the formatting regular.] +Mcc (Loc.U): + This variable is used internally by Configure to determine the + full pathname (if any) of the Mcc program. After Configure runs, + the value is reset to a plain "Mcc" and is not useful. + +PERL_REVISION (Oldsyms.U): + In a Perl version number such as 5.6.2, this is the 5. + This value is manually set in patchlevel.h + +PERL_SUBVERSION (Oldsyms.U): + In a Perl version number such as 5.6.2, this is the 2. + Values greater than 50 represent potentially unstable + development subversions. + This value is manually set in patchlevel.h + +PERL_VERSION (Oldsyms.U): + In a Perl version number such as 5.6.2, this is the 6. + This value is manually set in patchlevel.h + _a (Unix.U): This variable defines the extension used for ordinary library files. For unix, it is '.a'. The '.' is included. Other possible @@ -367,6 +386,88 @@ ctime_r_proto (d_ctime_r.U): REENTRANT_PROTO_T_ABC macros of reentr.h if d_ctime_r is defined. +d_Gconvert (d_gconvert.U): + This variable holds what Gconvert is defined as to convert + floating point numbers into strings. By default, Configure + sets this macro to use the first of gconvert, gcvt, or sprintf + that pass sprintf-%g-like behaviour tests. If perl is using + long doubles, the macro uses the first of the following + functions that pass Configure's tests: qgcvt, sprintf (if + Configure knows how to make sprintf format long doubles--see + sPRIgldbl), gconvert, gcvt, and sprintf (casting to double). + The gconvert_preference and gconvert_ld_preference variables + can be used to alter Configure's preferences, for doubles and + long doubles, respectively. If present, they contain a + space-separated list of one or more of the above function + names in the order they should be tried. + + d_Gconvert may be set to override Configure with a platform- + specific function. If this function expects a double, a + different value may need to be set by the uselongdouble.cbu + call-back unit so that long doubles can be formatted without + loss of precision. + +d_PRIEUldbl (longdblfio.U): + This variable conditionally defines the PERL_PRIfldbl symbol, which + indiciates that stdio has a symbol to print long doubles. + The 'U' in the name is to separate this from d_PRIeldbl so that even + case-blind systems can see the difference. + +d_PRIFUldbl (longdblfio.U): + This variable conditionally defines the PERL_PRIfldbl symbol, which + indiciates that stdio has a symbol to print long doubles. + The 'U' in the name is to separate this from d_PRIfldbl so that even + case-blind systems can see the difference. + +d_PRIGUldbl (longdblfio.U): + This variable conditionally defines the PERL_PRIfldbl symbol, which + indiciates that stdio has a symbol to print long doubles. + The 'U' in the name is to separate this from d_PRIgldbl so that even + case-blind systems can see the difference. + +d_PRIXU64 (quadfio.U): + This variable conditionally defines the PERL_PRIXU64 symbol, which + indiciates that stdio has a symbol to print 64-bit hExADECimAl numbers. + The 'U' in the name is to separate this from d_PRIx64 so that even + case-blind systems can see the difference. + +d_PRId64 (quadfio.U): + This variable conditionally defines the PERL_PRId64 symbol, which + indiciates that stdio has a symbol to print 64-bit decimal numbers. + +d_PRIeldbl (longdblfio.U): + This variable conditionally defines the PERL_PRIfldbl symbol, which + indiciates that stdio has a symbol to print long doubles. + +d_PRIfldbl (longdblfio.U): + This variable conditionally defines the PERL_PRIfldbl symbol, which + indiciates that stdio has a symbol to print long doubles. + +d_PRIgldbl (longdblfio.U): + This variable conditionally defines the PERL_PRIfldbl symbol, which + indiciates that stdio has a symbol to print long doubles. + +d_PRIi64 (quadfio.U): + This variable conditionally defines the PERL_PRIi64 symbol, which + indiciates that stdio has a symbol to print 64-bit decimal numbers. + +d_PRIo64 (quadfio.U): + This variable conditionally defines the PERL_PRIo64 symbol, which + indiciates that stdio has a symbol to print 64-bit octal numbers. + +d_PRIu64 (quadfio.U): + This variable conditionally defines the PERL_PRIu64 symbol, which + indiciates that stdio has a symbol to print 64-bit unsigned decimal + numbers. + +d_PRIx64 (quadfio.U): + This variable conditionally defines the PERL_PRIx64 symbol, which + indiciates that stdio has a symbol to print 64-bit hexadecimal numbers. + +d_SCNfldbl (longdblfio.U): + This variable conditionally defines the PERL_PRIfldbl symbol, which + indiciates that stdio has a symbol to scan long doubles. + d__fwalk (d__fwalk.U): This variable conditionally defines HAS__FWALK if _fwalk() is available to apply a function to all the file handles. @@ -759,27 +860,6 @@ d_ftime (d_ftime.U): that the ftime() routine exists. The ftime() routine is basically a sub-second accuracy clock. -d_Gconvert (d_gconvert.U): - This variable holds what Gconvert is defined as to convert - floating point numbers into strings. By default, Configure - sets this macro to use the first of gconvert, gcvt, or sprintf - that pass sprintf-%g-like behaviour tests. If perl is using - long doubles, the macro uses the first of the following - functions that pass Configure's tests: qgcvt, sprintf (if - Configure knows how to make sprintf format long doubles--see - sPRIgldbl), gconvert, gcvt, and sprintf (casting to double). - The gconvert_preference and gconvert_ld_preference variables - can be used to alter Configure's preferences, for doubles and - long doubles, respectively. If present, they contain a - space-separated list of one or more of the above function - names in the order they should be tried. - - d_Gconvert may be set to override Configure with a platform- - specific function. If this function expects a double, a - different value may need to be set by the uselongdouble.cbu - call-back unit so that long doubles can be formatted without - loss of precision. - d_getcwd (d_getcwd.U): This variable conditionally defines the HAS_GETCWD symbol, which indicates to the C program that the getcwd() routine is available @@ -1247,6 +1327,12 @@ d_modfl_pow32_bug (d_modfl.U): and 1.150000. The bug has been seen in certain versions of glibc, release 2.2.2 is known to be okay. +d_modflproto (d_modfl.U): + This symbol, if defined, indicates that the system provides + a prototype for the modfl() function. Otherwise, it is up + to the program to supply one. C99 says it should be + long double modfl(long double, long double *); + d_mprotect (d_mprotect.U): This variable conditionally defines HAS_MPROTECT if mprotect() is available to modify the access protection of a memory mapped file. @@ -1383,63 +1469,6 @@ d_portable (d_portable.U): indicates to the C program that it should not assume that it is running on the machine it was compiled on. -d_PRId64 (quadfio.U): - This variable conditionally defines the PERL_PRId64 symbol, which - indiciates that stdio has a symbol to print 64-bit decimal numbers. - -d_PRIeldbl (longdblfio.U): - This variable conditionally defines the PERL_PRIfldbl symbol, which - indiciates that stdio has a symbol to print long doubles. - -d_PRIEUldbl (longdblfio.U): - This variable conditionally defines the PERL_PRIfldbl symbol, which - indiciates that stdio has a symbol to print long doubles. - The 'U' in the name is to separate this from d_PRIeldbl so that even - case-blind systems can see the difference. - -d_PRIfldbl (longdblfio.U): - This variable conditionally defines the PERL_PRIfldbl symbol, which - indiciates that stdio has a symbol to print long doubles. - -d_PRIFUldbl (longdblfio.U): - This variable conditionally defines the PERL_PRIfldbl symbol, which - indiciates that stdio has a symbol to print long doubles. - The 'U' in the name is to separate this from d_PRIfldbl so that even - case-blind systems can see the difference. - -d_PRIgldbl (longdblfio.U): - This variable conditionally defines the PERL_PRIfldbl symbol, which - indiciates that stdio has a symbol to print long doubles. - -d_PRIGUldbl (longdblfio.U): - This variable conditionally defines the PERL_PRIfldbl symbol, which - indiciates that stdio has a symbol to print long doubles. - The 'U' in the name is to separate this from d_PRIgldbl so that even - case-blind systems can see the difference. - -d_PRIi64 (quadfio.U): - This variable conditionally defines the PERL_PRIi64 symbol, which - indiciates that stdio has a symbol to print 64-bit decimal numbers. - -d_PRIo64 (quadfio.U): - This variable conditionally defines the PERL_PRIo64 symbol, which - indiciates that stdio has a symbol to print 64-bit octal numbers. - -d_PRIu64 (quadfio.U): - This variable conditionally defines the PERL_PRIu64 symbol, which - indiciates that stdio has a symbol to print 64-bit unsigned decimal - numbers. - -d_PRIx64 (quadfio.U): - This variable conditionally defines the PERL_PRIx64 symbol, which - indiciates that stdio has a symbol to print 64-bit hexadecimal numbers. - -d_PRIXU64 (quadfio.U): - This variable conditionally defines the PERL_PRIXU64 symbol, which - indiciates that stdio has a symbol to print 64-bit hExADECimAl numbers. - The 'U' in the name is to separate this from d_PRIx64 so that even - case-blind systems can see the difference. - d_procselfexe (d_procselfexe.U): Defined if $procselfexe is symlink to the absolute pathname of the executing program. @@ -1570,10 +1599,6 @@ d_scm_rights (d_socket.U): which indicates that the SCM_RIGHTS is available. #ifdef is not enough because it may be an enum, glibc has been known to do this. -d_SCNfldbl (longdblfio.U): - This variable conditionally defines the PERL_PRIfldbl symbol, which - indiciates that stdio has a symbol to scan long doubles. - d_seekdir (d_readdir.U): This variable conditionally defines HAS_SEEKDIR if seekdir() is available. @@ -2322,6 +2347,10 @@ extensions (Extensions.U): extras (Extras.U): This variable holds a list of extra modules to install. +fflushNULL (fflushall.U): + This symbol, if defined, tells that fflush(NULL) does flush + all pending stdio output. + fflushall (fflushall.U): This symbol, if defined, tells that to flush all pending stdio output one must loop through all @@ -2329,10 +2358,6 @@ fflushall (fflushall.U): Note that if fflushNULL is defined, fflushall will not even be probed for and will be left undefined. -fflushNULL (fflushall.U): - This symbol, if defined, tells that fflush(NULL) does flush - all pending stdio output. - find (Loc.U): This variable is defined but not used by Configure. The value is a plain '' and is not useful. @@ -3296,9 +3321,12 @@ make_set_make (make.U): This variable contains the string to be included in Makefile.SH so that MAKE is set if needed, and not if not needed. Possible values are: + make_set_make='#' # If your make program handles this for you, + make_set_make="MAKE=$make" # if it doesn't. - I used a comment character so that we can distinguish a + + This uses a comment character to distinguish a 'set' value (from a previous config.sh or Configure '-D' option) from an uncomputed value. @@ -3347,11 +3375,6 @@ man3ext (man3dir.U): have: one of 'n', 'l', or '3'. The Makefile must supply the '.'. See man3dir. -Mcc (Loc.U): - This variable is used internally by Configure to determine the - full pathname (if any) of the Mcc program. After Configure runs, - the value is reset to a plain "Mcc" and is not useful. - mips_type (usrinc.U): This variable holds the environment type for the mips system. Possible values are "BSD 4.3" and "System V". @@ -3467,6 +3490,18 @@ nroff (Loc.U): full pathname (if any) of the nroff program. After Configure runs, the value is reset to a plain "nroff" and is not useful. +nvEUformat (perlxvf.U): + This variable contains the format string used for printing + a Perl NV using %E-ish floating point format. + +nvFUformat (perlxvf.U): + This variable confains the format string used for printing + a Perl NV using %F-ish floating point format. + +nvGUformat (perlxvf.U): + This variable contains the format string used for printing + a Perl NV using %G-ish floating point format. + nv_preserves_uv_bits (perlxv.U): This variable indicates how many of bits type uvtype a variable nvtype can preserve. @@ -3475,26 +3510,14 @@ nveformat (perlxvf.U): This variable contains the format string used for printing a Perl NV using %e-ish floating point format. -nvEUformat (perlxvf.U): - This variable contains the format string used for printing - a Perl NV using %E-ish floating point format. - nvfformat (perlxvf.U): This variable confains the format string used for printing a Perl NV using %f-ish floating point format. -nvFUformat (perlxvf.U): - This variable confains the format string used for printing - a Perl NV using %F-ish floating point format. - nvgformat (perlxvf.U): This variable contains the format string used for printing a Perl NV using %g-ish floating point format. -nvGUformat (perlxvf.U): - This variable contains the format string used for printing - a Perl NV using %G-ish floating point format. - nvsize (perlxv.U): This variable is the size of an NV in bytes. @@ -3593,20 +3616,6 @@ perl_patchlevel (patchlevel.U): the maintenance versus development dichotomy except by also being increasing. -PERL_REVISION (Oldsyms.U): - In a Perl version number such as 5.6.2, this is the 5. - This value is manually set in patchlevel.h - -PERL_SUBVERSION (Oldsyms.U): - In a Perl version number such as 5.6.2, this is the 2. - Values greater than 50 represent potentially unstable - development subversions. - This value is manually set in patchlevel.h - -PERL_VERSION (Oldsyms.U): - In a Perl version number such as 5.6.2, this is the 6. - This value is manually set in patchlevel.h - perladmin (perladmin.U): Electronic mail address of the perl5 administrator. @@ -3777,6 +3786,66 @@ runnm (usenm.U): nm extraction should be performed or not, according to the value of usenm and the flags on the Configure command line. +sPRIEUldbl (longdblfio.U): + This variable, if defined, contains the string used by stdio to + format long doubles (format 'E') for output. + The 'U' in the name is to separate this from sPRIeldbl so that even + case-blind systems can see the difference. + +sPRIFUldbl (longdblfio.U): + This variable, if defined, contains the string used by stdio to + format long doubles (format 'F') for output. + The 'U' in the name is to separate this from sPRIfldbl so that even + case-blind systems can see the difference. + +sPRIGUldbl (longdblfio.U): + This variable, if defined, contains the string used by stdio to + format long doubles (format 'G') for output. + The 'U' in the name is to separate this from sPRIgldbl so that even + case-blind systems can see the difference. + +sPRIXU64 (quadfio.U): + This variable, if defined, contains the string used by stdio to + format 64-bit hExADECimAl numbers (format 'X') for output. + The 'U' in the name is to separate this from sPRIx64 so that even + case-blind systems can see the difference. + +sPRId64 (quadfio.U): + This variable, if defined, contains the string used by stdio to + format 64-bit decimal numbers (format 'd') for output. + +sPRIeldbl (longdblfio.U): + This variable, if defined, contains the string used by stdio to + format long doubles (format 'e') for output. + +sPRIfldbl (longdblfio.U): + This variable, if defined, contains the string used by stdio to + format long doubles (format 'f') for output. + +sPRIgldbl (longdblfio.U): + This variable, if defined, contains the string used by stdio to + format long doubles (format 'g') for output. + +sPRIi64 (quadfio.U): + This variable, if defined, contains the string used by stdio to + format 64-bit decimal numbers (format 'i') for output. + +sPRIo64 (quadfio.U): + This variable, if defined, contains the string used by stdio to + format 64-bit octal numbers (format 'o') for output. + +sPRIu64 (quadfio.U): + This variable, if defined, contains the string used by stdio to + format 64-bit unsigned decimal numbers (format 'u') for output. + +sPRIx64 (quadfio.U): + This variable, if defined, contains the string used by stdio to + format 64-bit hexadecimal numbers (format 'x') for output. + +sSCNfldbl (longdblfio.U): + This variable, if defined, contains the string used by stdio to + format long doubles (format 'f') for input. + sched_yield (d_pthread_y.U): This variable defines the way to yield the execution of the current thread. @@ -4046,62 +4115,6 @@ spitshell (spitshell.U): This variable contains the command necessary to spit out a runnable shell on this system. It is either cat or a grep '-v' for # comments. -sPRId64 (quadfio.U): - This variable, if defined, contains the string used by stdio to - format 64-bit decimal numbers (format 'd') for output. - -sPRIeldbl (longdblfio.U): - This variable, if defined, contains the string used by stdio to - format long doubles (format 'e') for output. - -sPRIEUldbl (longdblfio.U): - This variable, if defined, contains the string used by stdio to - format long doubles (format 'E') for output. - The 'U' in the name is to separate this from sPRIeldbl so that even - case-blind systems can see the difference. - -sPRIfldbl (longdblfio.U): - This variable, if defined, contains the string used by stdio to - format long doubles (format 'f') for output. - -sPRIFUldbl (longdblfio.U): - This variable, if defined, contains the string used by stdio to - format long doubles (format 'F') for output. - The 'U' in the name is to separate this from sPRIfldbl so that even - case-blind systems can see the difference. - -sPRIgldbl (longdblfio.U): - This variable, if defined, contains the string used by stdio to - format long doubles (format 'g') for output. - -sPRIGUldbl (longdblfio.U): - This variable, if defined, contains the string used by stdio to - format long doubles (format 'G') for output. - The 'U' in the name is to separate this from sPRIgldbl so that even - case-blind systems can see the difference. - -sPRIi64 (quadfio.U): - This variable, if defined, contains the string used by stdio to - format 64-bit decimal numbers (format 'i') for output. - -sPRIo64 (quadfio.U): - This variable, if defined, contains the string used by stdio to - format 64-bit octal numbers (format 'o') for output. - -sPRIu64 (quadfio.U): - This variable, if defined, contains the string used by stdio to - format 64-bit unsigned decimal numbers (format 'u') for output. - -sPRIx64 (quadfio.U): - This variable, if defined, contains the string used by stdio to - format 64-bit hexadecimal numbers (format 'x') for output. - -sPRIXU64 (quadfio.U): - This variable, if defined, contains the string used by stdio to - format 64-bit hExADECimAl numbers (format 'X') for output. - The 'U' in the name is to separate this from sPRIx64 so that even - case-blind systems can see the difference. - srand48_r_proto (d_srand48_r.U): This variable encodes the prototype of srand48_r. It is zero if d_srand48_r is undef, and one of the @@ -4119,10 +4132,6 @@ src (src.U): the Makefile to use this variable and set VPATH accordingly to find the sources remotely. -sSCNfldbl (longdblfio.U): - This variable, if defined, contains the string used by stdio to - format long doubles (format 'f') for input. - ssizetype (ssizetype.U): This variable defines ssizetype to be something like ssize_t, long or int. It is used by functions that return a count @@ -4432,8 +4441,8 @@ usesfio (d_sfio.U): d_sfio without running into a "WHOA THERE". useshrplib (libperl.U): - This variable is set to 'yes' if the user wishes - to build a shared libperl, and 'no' otherwise. + This variable is set to 'true' if the user wishes + to build a shared libperl, and 'false' otherwise. usesocks (usesocks.U): This variable conditionally defines the USE_SOCKS symbol, @@ -4460,6 +4469,10 @@ uuname (Loc.U): This variable is defined but not used by Configure. The value is a plain '' and is not useful. +uvXUformat (perlxvf.U): + This variable contains the format string used for printing + a Perl UV as an unsigned hexadecimal integer in uppercase ABCDEF. + uvoformat (perlxvf.U): This variable contains the format string used for printing a Perl UV as an unsigned octal integer. @@ -4478,10 +4491,6 @@ uvxformat (perlxvf.U): This variable contains the format string used for printing a Perl UV as an unsigned hexadecimal integer in lowercase abcdef. -uvXUformat (perlxvf.U): - This variable contains the format string used for printing - a Perl UV as an unsigned hexadecimal integer in uppercase ABCDEF. - vendorarch (vendorarch.U): This variable contains the value of the PERL_VENDORARCH symbol. It may have a ~ on the front. diff --git a/Porting/patching.pod b/Porting/patching.pod index 14b39e2087..4176b3f4d8 100644 --- a/Porting/patching.pod +++ b/Porting/patching.pod @@ -63,6 +63,10 @@ respectively, unified diffs (where the changed line appears immediately next to the original) and context diffs (where several lines surrounding the changes are included). See the manpage for diff for more details. +When GNU diff is available, the pumpkins would prefer you use C<-u -p> +(--unified --show-c-function) as arguments for optimal control. The +examples below will only use -u. + The preferred method for creating a unified diff suitable for feeding to the patch program is: @@ -92,8 +96,15 @@ diffs. Some examples using GNU diff: % diff -bu a/file b/file # show function name in every hunk (safer, more informative) + % diff -u -p old/file new/file % diff -u -F '^[_a-zA-Z0-9]+ *(' old/file new/file + # show sub name in perl files and modules + % diff -u -F '^sub' old/file.pm new/file.pm + + # show header in doc patches + % diff -u -F '^=head' old/file.pod new/file.pod + =item Derived Files Many files in the distribution are derivative--avoid patching them. @@ -344,6 +355,11 @@ found in the headers). This helps reconcile differing paths between the machine the patch was created on and the machine on which it is being applied. +Be sure to use the Larry Wall version of patch. Some Operating Systems +(HP-UX amongst those) have a patch command that does something completely +different. The correct version of patch will show Larry's name several +times when invoked as patch --version. + =item Cut and paste B<Never> cut and paste a patch into your editor. This usually clobbers @@ -383,12 +399,14 @@ to apply as possible. Keep that in mind. 8-) =head1 Last Modified -Last modified 21 January 1999 +Last modified 22 August 2002 +H.Merijn Brand <h.m.brand@hccnet.nl> +Prev modified 21 January 1999 Daniel Grisinger <dgris@dimensional.com> =head1 Author and Copyright Information -Copyright (c) 1998, 1999 Daniel Grisinger +Copyright (c) 1998-2002 Daniel Grisinger Adapted from a posting to perl5-porters by Tim Bunce (Tim.Bunce@ig.co.uk). diff --git a/Porting/pumpkin.pod b/Porting/pumpkin.pod index cff54cdf10..1962f3eecb 100644 --- a/Porting/pumpkin.pod +++ b/Porting/pumpkin.pod @@ -43,7 +43,7 @@ to perl5-porters-request@perl.org . Archives of the list are held at: - http://www.rosat.mpe-garching.mpg.de/mailing-lists/perl-porters/ + http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/ =head1 How are Perl Releases Numbered? @@ -103,7 +103,7 @@ always match the regular expression: C<$1> in the pattern is always an even number for maintenance versions, and odd for developer releases. -In the past it has been observed that pumkings tend to invent new +In the past it has been observed that pumpkings tend to invent new naming conventions on the fly. If you are a pumpking, before you invent a new name for any of the three types of perl distributions, please inform the guys from the CPAN who are doing indexing and @@ -159,6 +159,8 @@ settled elsewhere. If feasible, try to keep filenames 8.3-compliant to humor those poor souls that get joy from running Perl under such dire limitations. There's a script, check83.pl, for keeping your nose 8.3-clean. +In a similar vein, do not create files or directories which differ only +in case (upper versus lower). =head2 Seek consensus on major changes @@ -590,19 +592,19 @@ to change the version number near the top of the F<Changes> file. =head2 Todo -The F<Todo> file contains a roughly-catgorized unordered list of -aspects of Perl that could use enhancement, features that could be -added, areas that could be cleaned up, and so on. During your term as -pumpkin-holder, you will probably address some of these issues, and -perhaps identify others which, while you decide not to address them -this time around, may be tackled in the future. Update the file -reflect the situation as it stands when you hand over the pumpkin. +The F<pod/perltodo.pod> file contains a roughly-categorized unordered +list of aspects of Perl that could use enhancement, features that could +be added, areas that could be cleaned up, and so on. During your term +as pumpkin-holder, you will probably address some of these issues, and +perhaps identify others which, while you decide not to address them this +time around, may be tackled in the future. Update the file to reflect +the situation as it stands when you hand over the pumpkin. You might like, early in your pumpkin-holding career, to see if you can find champions for partiticular issues on the to-do list: an issue owned is an issue more likely to be resolved. -There are also some more porting-specific L<Todo> items later in this +There are also some more porting-specific L</Todo> items later in this file. =head2 OS/2-specific updates @@ -769,6 +771,48 @@ clean up, and print warnings from the log files (-Wformat support by Robin Barker.) +=item gcc -ansi -pedantic + +Configure -Dgccansipedantic [ -Dcc=gcc ] will enable (via the cflags script, +not $Config{ccflags}) the gcc strict ANSI C flags -ansi and -pedantic for +the compilation of the core files on platforms where it knows it can +do so (like Linux, see cflags.SH for the full list), and on some +platforms only one (Solaris can do only -pedantic, not -ansi). +The flag -DPERL_GCC_PEDANTIC also gets added, since gcc does not add +any internal cpp flag to signify that -pedantic is being used, as it +does for -ansi (__STRICT_ANSI__). + +Note that the -ansi and -pedantic are enabled only for version 3 (and +later) of gcc, since even gcc version 2.95.4 finds lots of seemingly +false "value computed not used" errors from Perl. + +The -ansi and -pedantic are useful in catching at least the following +nonportable practices: + +=over 4 + +=item * + +gcc-specific extensions + +=item * + +lvalue casts + +=item * + +// C++ comments + +=item * + +enum trailing commas + +=back + +The -Dgccansipedantic should be used only when cleaning up the code, +not for production builds, since otherwise gcc cannot inline certain +things. + =back =head1 Running Purify @@ -1216,12 +1260,18 @@ a mail message from Larry: probably have been named something to do with overriding though. Since it's undocumented we could still change it... :-) -Given that it's already there, you can use it to override -distribution modules. If you do +Given that it's already there, you can use it to override distribution modules. +One way to do that is to add - sh Configure -Dccflags='-DAPPLLIB_EXP=/my/override' + ccflags="$ccflags -DAPPLLIB_EXP=\"/my/override\"" + +to your config.over file. (You have to be particularly careful to get the +double quotes in. APPLLIB_EXP must be a valid C string. It might +actually be easier to just #define it yourself in perl.c.) -then perl.c will put /my/override ahead of ARCHLIB and PRIVLIB. +Then perl.c will put /my/override ahead of ARCHLIB and PRIVLIB. Perl will +also search architecture-specific and version-specific subdirectories of +APPLLIB_EXP. =head2 Shared libperl.so location @@ -1277,9 +1327,11 @@ Anyway, all this leads to quite obscure failures that are sure to drive casual users crazy. Even experienced users will get confused :-). Upon reflection, I'd say leave libperl.so in $archlib. -=item 4. +=back + +=head2 Indentation style -Indentation style: over the years Perl has become a mishmash of +Over the years Perl has become a mishmash of various indentation styles, but the original "Larry style" can probably be restored with (GNU) indent somewhat like this: @@ -1292,8 +1344,6 @@ of consecutive assignments, which would truly wreck the layout in places like sv.c:Perl_sv_upgrade() or sv.c:Perl_clone_using(). Similarly nicely aligned &&s, ||s and ==s would not be respected. -=back - =head1 Upload Your Work to CPAN You can upload your work to CPAN if you have a CPAN id. Check out diff --git a/Porting/repository.pod b/Porting/repository.pod index db2e1842b1..5cc2d993fc 100644 --- a/Porting/repository.pod +++ b/Porting/repository.pod @@ -199,7 +199,7 @@ the section above on the B<-L 1666:127.0.0.1:1666> option to ssh. The value of this is the name by which Perforce knows your host's workspace. You need to pick a name (normally, your -Perforce username, a dash, and your hostname) +Perforce username, a dash, and your host's short name) when you first start using the perl repository and then stick with it. @@ -258,9 +258,10 @@ The C<p4 users> command lists all currently known users. Once these three environment variables are set, you can use the perforce p4 client exactly as described in its documentation. After setting these variables and connecting to the repository -for the first time, you should use the C<p4 user> and -C<p4 client> commands to tell perforce the details of your -new username and your new client workspace specifications. +for the first time, you should use the C<p4 user> command to +set a valid email address for yourself. Also use the C<p4 client> +command to specify your workspace specifications for each +individual client from which you will interact with the repository. =head1 Ending a Repository Session diff --git a/README.aix b/README.aix index 1370cdcae7..ef8dfd126c 100644 --- a/README.aix +++ b/README.aix @@ -170,6 +170,10 @@ fill in its choices Follow the messages ... and you're done. +If you like a more web-like approach, a good start point can be +http://www14.software.ibm.com/webapp/download/downloadaz.jsp and click +"C for AIX", and follow the instructions. + =head2 Using GNU's gcc for building perl Using gcc-3.0 (tested with 3.0.4) now works out of the box, as do diff --git a/README.amiga b/README.amiga index 00c4ff1822..f558ac3d60 100644 --- a/README.amiga +++ b/README.amiga @@ -26,7 +26,7 @@ be read I<as is>: either as F<README.amiga>, or F<pod/perlamiga.pod>. A recent version of perl for the Amiga can be found at the Geek Gadgets section of the Aminet: - http://www.aminet.net/~aminet/dirs/dev_gg.html + http://www.aminet.net/~aminet/dev/gg/index.html =cut @@ -4,8 +4,8 @@ specially designed to be readable as is. The following documentation is written in EUC-CN encoding. -?ç¹?ÄãÓÃÒ»°ãµÄÎÄ×Ö±à¼Æ÷ÔÄÀÀÕâ·ÝÎļþ, ÇëºöÂÔÎÄÖÐÆæÌصÄ×¢¼Ç×Ö·û. -Õâ·ÝÎļþÊÇÒÔ POD (¼òÃ÷Îļþ¸ñʽ) д³É; ÕâÖÖ¸ñʽÊÇΪÁËÄÜ?ÃÈËÖ±½Ó¶ÁÈ?, +Èç¹ûÄãÓÃÒ»°ãµÄÎÄ×Ö±à¼Æ÷ÔÄÀÀÕâ·ÝÎļþ, ÇëºöÂÔÎÄÖÐÆæÌصÄ×¢¼Ç×Ö·û. +Õâ·ÝÎļþÊÇÒÔ POD (¼òÃ÷Îļþ¸ñʽ) д³É; ÕâÖÖ¸ñʽÊÇΪÁËÄÜÈÃÈËÖ±½ÓÔĶÁ, ¶øÌرðÉè¼ÆµÄ. ¹ØÓڴ˸ñʽµÄ½øÒ»²½ÐÅÏ¢, Çë²Î¿¼ perlpod ÏßÉÏÎļþ. =head1 NAME @@ -17,15 +17,15 @@ perlcn - ¼òÌåÖÐÎÄ Perl Ö¸ÄÏ »¶ÓÀ´µ½ Perl µÄÌìµØ! ´Ó 5.8.0 °æ¿ªÊ¼, Perl ¾ß±¸ÁËÍêÉÆµÄ Unicode (ͳһÂë) Ö§Ô®, -Ò²Á¬´øÖ§Ô®ÁËÐí¶àÀ¶¡ÓïϵÒÔÍâµÄ±àÂ뷽ʽ; CJK (ÖÐ?Õº?) ±ãÊÇÆäÖеÄÒ»²¿·Ý. +Ò²Á¬´øÖ§Ô®ÁËÐí¶àÀ¶¡ÓïϵÒÔÍâµÄ±àÂ뷽ʽ; CJK (ÖÐÈÕº«) ±ãÊÇÆäÖеÄÒ»²¿·Ý. Unicode Êǹú¼ÊÐԵıê×¼, ÊÔͼº¸ÇÊÀ½çÉÏËùÓеÄ×Ö·û: Î÷·½ÊÀ½ç, ¶«·½ÊÀ½ç, ÒÔ¼°Á½Õß¼äµÄÒ»ÇÐ (Ï£À°ÎÄ, ÐðÀûÑÇÎÄ, ÑÇÀ²®ÎÄ, Ï£²®À´ÎÄ, Ó¡¶ÈÎÄ, -Ó¡µØ°²ÎÄ, µÈµÈ). ËüÒ²?ÝÄÉÁ˶àÖÖ×÷ҵϵͳÓëƽÌ? (?? PC ¼°Âó½ðËþ). +Ó¡µØ°²ÎÄ, µÈµÈ). ËüÒ²ÈÝÄÉÁ˶àÖÖ×÷ҵϵͳÓëƽ̨ (Èç PC ¼°Âó½ðËþ). Perl ±¾ÉíÒÔ Unicode ½øÐвÙ×÷. Õâ±íʾ Perl ÄÚ²¿µÄ×Ö·û´®Êý¾Ý¿ÉÓà Unicode -±íʾ; Perl µÄº¯Ê½ÓëËã·û (Àý?çÕ?¹æ±íʾʽ±È¶Ô) Ò²ÄÜ¶Ô Unicode ½øÐвÙ×÷. -ÔÚÊä?ë¼°Êä³öÊ?, ΪÁË´¦ÀíÒÔ Unicode ֮ǰµÄ±àÂ뷽ʽ´æ·ÅµÄÊý¾Ý, Perl -ÌṩÁË Encode Õâ¸öÄ£¿é, ¿ÉÒÔ?ÃÄãÇáÒ׵ضÁÈ¡¼°Ð´Èë¾ÉÓеıàÂëÊ?¾Ý. +±íʾ; Perl µÄº¯Ê½ÓëËã·û (ÀýÈçÕý¹æ±íʾʽ±È¶Ô) Ò²ÄÜ¶Ô Unicode ½øÐвÙ×÷. +ÔÚÊäÈë¼°Êä³öʱ, ΪÁË´¦ÀíÒÔ Unicode ֮ǰµÄ±àÂ뷽ʽ´æ·ÅµÄÊý¾Ý, Perl +ÌṩÁË Encode Õâ¸öÄ£¿é, ¿ÉÒÔÈÃÄãÇáÒ׵ضÁÈ¡¼°Ð´Èë¾ÉÓеıàÂëÊý¾Ý. Encode ÑÓÉìÄ£¿éÖ§Ô®ÏÂÁмòÌåÖÐÎĵıàÂ뷽ʽ ('gb2312' ±íʾ 'euc-cn'): @@ -36,19 +36,19 @@ Encode ÑÓÉìÄ£¿éÖ§Ô®ÏÂÁмòÌåÖÐÎĵıàÂ뷽ʽ ('gb2312' ±íʾ 'euc-cn'): cp936 ×ÖÂëÒ³ 936, Ò²¿ÉÒÔÓà 'GBK' (À©³ä¹ú±êÂë) Ö¸Ã÷ hz 7 ±ÈÌØÒݳöʽ GB2312 ±àÂë -¾ÙÀýÀ´Ëµ, ½« EUC-CN ±àÂëµÄÎĵµ×ª³É Unicode, ìóÐè¼ü?ëÏÂÁÐÖ¸Á?: +¾ÙÀýÀ´Ëµ, ½« EUC-CN ±àÂëµÄµµ°¸×ª³É Unicode, ìóÐè¼üÈëÏÂÁÐÖ¸Áî: perl -Mencoding=euc-cn,STDOUT,utf8 -pe1 < file.euc-cn > file.utf8 -Perl Ò²ÄÚ¸½ÁË "piconv", Ò»Ö§Íê?«Ò? Perl д³ÉµÄ×Ö·ûת»»¹¤¾ß³ÌÐò, Ó÷¨?çÏ?: +Perl Ò²ÄÚ¸½ÁË "piconv", Ò»Ö§ÍêÈ«ÒÔ Perl д³ÉµÄ×Ö·ûת»»¹¤¾ß³ÌÐò, Ó÷¨ÈçÏÂ: piconv -f euc-cn -t utf8 < file.euc-cn > file.utf8 piconv -f utf8 -t euc-cn < file.utf8 > file.euc-cn -ÁíÍâ, ÀûÓà encoding Ä£¿é, Äã¿ÉÒÔÇáÒ×д³öÒÔ×Ö·ûΪµ¥Î»µÄ³ÌÐòÂë, ?çÏÂËùÊ?: +ÁíÍâ, ÀûÓà encoding Ä£¿é, Äã¿ÉÒÔÇáÒ×д³öÒÔ×Ö·ûΪµ¥Î»µÄ³ÌÐòÂë, ÈçÏÂËùʾ: #!/usr/bin/env perl - # Æô¶¯ euc-cn ×Ö´®½âÎö; ±ê×¼Êä³ö?ë¼°±ê×¼´íÎó¶¼ÉèÎ? euc-cn ±àÂë + # Æô¶¯ euc-cn ×Ö´®½âÎö; ±ê×¼Êä³öÈë¼°±ê×¼´íÎó¶¼ÉèΪ euc-cn ±àÂë use encoding 'euc-cn', STDIN => 'euc-cn', STDOUT => 'euc-cn'; print length("ÂæÍÕ"); # 2 (Ë«ÒýºÅ±íʾ×Ö·û) print length('ÂæÍÕ'); # 4 (µ¥ÒýºÅ±íʾ×Ö½Ú) @@ -61,7 +61,7 @@ Perl Ò²ÄÚ¸½ÁË "piconv", Ò»Ö§Íê?«Ò? Perl д³ÉµÄ×Ö·ûת»»¹¤¾ß³ÌÐò, Ó÷¨?çÏ?: =head2 ¶îÍâµÄÖÐÎıàÂë -?ç¹?ÐèÒª¸ü¶àµÄÖÐÎıàÂë, ¿ÉÒÔ´Ó CPAN (L<http://www.cpan.org/>) ÏÂÔØ +Èç¹ûÐèÒª¸ü¶àµÄÖÐÎıàÂë, ¿ÉÒÔ´Ó CPAN (L<http://www.cpan.org/>) ÏÂÔØ Encode::HanExtra Ä£¿é. ËüÄ¿Ç°ÌṩÏÂÁбàÂ뷽ʽ: gb18030 À©³ä¹ýµÄ¹ú±êÂë, °üº¬·±ÌåÖÐÎÄ @@ -71,7 +71,7 @@ Encode::HanExtra Ä£¿é. ËüÄ¿Ç°ÌṩÏÂÁбàÂ뷽ʽ: big5-simp Big5 ·±ÌåÖÐÎÄÓë Unicode ¼òÌåÖÐÎÄ»¥×ª gbk-trad GBK ¼òÌåÖÐÎÄÓë Unicode ·±ÌåÖÐÎÄ»¥×ª -?ôÏëÔ? GBK Óë Big5 Ö®¼ä»¥×ª, Çë²Î¿¼¸ÃÄ£¿éÄÚ¸½µÄ b2g.pl Óë g2b.pl Á½Ö§³ÌÐò, +ÈôÏëÔÚ GBK Óë Big5 Ö®¼ä»¥×ª, Çë²Î¿¼¸ÃÄ£¿éÄÚ¸½µÄ b2g.pl Óë g2b.pl Á½Ö§³ÌÐò, »òÔÚ³ÌÐòÄÚʹÓÃÏÂÁÐд·¨: use Encode::HanConvert; @@ -80,7 +80,7 @@ Encode::HanExtra Ä£¿é. ËüÄ¿Ç°ÌṩÏÂÁбàÂ뷽ʽ: =head2 ½øÒ»²½µÄÐÅÏ¢ -Çë²Î¿¼ Perl ÄÚ¸½µÄ´óÁ¿ËµÃ÷Îļþ (²»ÐÒ?«ÊÇÓÃÓ?ÎÄдµÄ), À´Ñ§Ï°¸ü¶à¹ØÓÚ +Çë²Î¿¼ Perl ÄÚ¸½µÄ´óÁ¿ËµÃ÷Îļþ (²»ÐÒÈ«ÊÇÓÃÓ¢ÎÄдµÄ), À´Ñ§Ï°¸ü¶à¹ØÓÚ Perl µÄ֪ʶ, ÒÔ¼° Unicode µÄʹÓ÷½Ê½. ²»¹ý, ÍⲿµÄ×ÊÔ´Ï൱·á¸»: =head2 Ìṩ Perl ×ÊÔ´µÄÍøÖ· diff --git a/README.cygwin b/README.cygwin index 32c9a16ab6..9888b18aee 100644 --- a/README.cygwin +++ b/README.cygwin @@ -260,9 +260,11 @@ The following error occurs because of the Cygwin C<#define> of C<_LONG_DOUBLE>: Guessing which symbols your C compiler and preprocessor define... - try.c:<line#>: parse error + try.c:<line#>: missing binary operator -This failure does not seem to cause any problems. +This failure does not seem to cause any problems. With older gcc +versions, "parse error" is reported instead of "missing binary +operator". =back @@ -276,11 +278,18 @@ Simply run I<make> and wait: Warnings like these are normal: - warning: overriding commands for target <file> - warning: ignoring old commands for target <file> - - dllwrap: no export definition file provided - dllwrap: creating one, but that may not be what you want + perl.c: In function `S_parse_body': + perl.c:1468: warning: implicit declaration of function `init_os_extras' + ... + pp_sys.c:289: warning: `S_emulate_eaccess' defined but not used + ... + perlio.c: In function `perlsio_binmode': + perlio.c:98: warning: implicit declaration of function `setmode' + perlio.c:98: warning: passing arg 1 of `Perl_PerlIO_fileno' from incompatible pointer type + ... + make: [extra.pods] Error 1 (ignored) + ... + make: [extras.make] Error 1 (ignored) =head2 ld2 on Cygwin @@ -337,11 +346,34 @@ these options, these tests will fail (listing not updated yet): lib/sdbm.t 2 op/stat.t 9, 20 (.tmp not an executable extension) -=head2 NDBM_File does not work on FAT filesystems +=head2 NDBM_File and ODBM_File do not work on FAT filesystems + +Do not use NDBM_File or ODBM_File on FAT filesystem. They can be +built on a FAT filesystem, but many tests will fail: + + ../ext/NDBM_File/ndbm.t 13 3328 71 59 83.10% 1-2 4 16-71 + ../ext/ODBM_File/odbm.t 255 65280 ?? ?? % ?? + ../lib/AnyDBM_File.t 2 512 12 2 16.67% 1 4 + ../lib/Memoize/t/errors.t 0 139 11 5 45.45% 7-11 + ../lib/Memoize/t/tie_ndbm.t 13 3328 4 4 100.00% 1-4 + run/fresh_perl.t 97 1 1.03% 91 + +If you intend to run only on FAT (or if using AnyDBM_File on FAT), +run Configure with the -Ui_ndbm and -Ui_dbm options to prevent +NDBM_File and ODBM_File being built. + +With NTFS (and CYGWIN=ntsec), there should be no problems even if +perl was built on FAT. + +=head2 fork() failures in io_* tests -Do not install NDBM_File on FAT filesystem. It can be built on a FAT -filesystem, but many ndbm tests will fail. With NTFS, there should be -no problems either way. +A fork() failure may result in the following tests failing: + + ext/IO/lib/IO/t/io_multihomed.t + ext/IO/lib/IO/t/io_sock.t + ext/IO/lib/IO/t/io_unix.t + +See comment on fork in L<Miscellaneous> below. =head2 Script Portability on Cygwin @@ -411,6 +443,18 @@ Inplace editing C<perl -i> of files doesn't work without doing a backup of the file being edited C<perl -i.bak> because of windowish restrictions, so Perl adds the C<.bak> automatically if you just use C<perl -i>. +Using fork() after loading multiple dlls may fail with an internal cygwin +error like the following: + + C:\CYGWIN\BIN\PERL.EXE: *** couldn't allocate memory 0x10000(4128768) for 'C:\CYGWIN\LIB\PERL5\5.6.1\CYGWIN-MULTI\AUTO\SOCKET\SOCKET.DLL' alignment, Win32 error 8 + + 200 [main] perl 377147 sync_with_child: child -395691(0xB8) died before initialization with status code 0x1 + 1370 [main] perl 377147 sync_with_child: *** child state child loading dlls + +Use the rebase utility to resolve the conflicting dll addresses. +See: http://www.tishler.net/jason/software/rebase/ +and http://sources.redhat.com/ml/cygwin/2002-07/msg00276.html + =back =head1 INSTALL PERL ON CYGWIN @@ -525,4 +569,4 @@ Gerrit Haase <gh@familiehaase.de>. =head1 HISTORY -Last updated: 2002-02-27 +Last updated: 2002-10-07 diff --git a/README.dgux b/README.dgux index accb7384a8..8e2cbf15cd 100644 --- a/README.dgux +++ b/README.dgux @@ -79,7 +79,7 @@ After configuration is done correctly give "make" to compile. =head2 Testing Perl on DG/UX -Issuing a "make test" will run all the tests. +Issuing a "make test" will run all the tests. If the test lib/ftmp-security gives you as a result something like diff --git a/README.dos b/README.dos index 564d54f482..e1d6d33106 100644 --- a/README.dos +++ b/README.dos @@ -313,7 +313,7 @@ will not create a "perl.exe" to replace the one in C<($DJDIR)/bin>. When you are done, the XS-module install process will have added information to your "perllocal" information telling that the perl binary has been replaced, -and what module was installed. you can view this information at any time +and what module was installed. You can view this information at any time by using the command: perl -S perldoc perllocal diff --git a/README.epoc b/README.epoc index 8ce93fe3e4..90e87ebcdf 100644 --- a/README.epoc +++ b/README.epoc @@ -16,7 +16,7 @@ EPOC is an OS for palmtops and mobile phones. For more informations look at: http://www.symbian.com/ This is a port of perl to the epocemx SDK by Eberhard Mattes, which -itselfs uses the SDK by symbian. Essentially epocemx it is a POSIX +itself uses the SDK by symbian. Essentially epocemx it is a POSIX look alike environment for the EPOC OS. For more informations look at: http://www.windhager.de/~mattes/epocemx/ @@ -91,7 +91,7 @@ binmode does not exist. (No CR LF to LF translation for text files) EPOC does not handle the notion of current drive and current directory very well (i.e. not at all, but it tries hard to emulate -one) See PATH. +one). See PATH. =item * diff --git a/README.hpux b/README.hpux index f039633df5..b0536dc5c5 100644 --- a/README.hpux +++ b/README.hpux @@ -38,6 +38,24 @@ files compiled with gcc-2.9-hppa-991112 If you perform a new installation, then Perl will be installed automatically. +=head2 Using perl from HP's porting centre + +HP porting centre tries very hard to keep up with customer demand and +release updates from the Open Source community. Having precompiled +Perl binaries available is obvious. + +The HP porting centres are limited in what systems they are allowed +to port to and they usually choose the two most recent OS versions +available. This means that at the moment of writing, there are only +HPUX-11.00 and 11-20/22 (IA64) ports available on the porting centres. + +HP has asked the porting centre to move Open Source binaries +from /opt to /usr/local, so binaries produced since the start +of July 2002 are located in /usr/local. + +One of HP porting centres URL's is http://hpux.connect.org.uk/ +The port currently available is built with GNU gcc. + =head2 Compiling Perl 5 on HP-UX When compiling Perl, you must use an ANSI C compiler. The C compiler @@ -64,6 +82,17 @@ Motorola chipset. The most recent version of PA-RISC at the time of this document's last update is 2.0. +A complete list of models at the time the OS was built is in the file +/usr/sam/lib/mo/sched.models. The first column corresponds to the last +part of the output of the "model" command. The second column is the +PA-RISC version and the third column is the exact chip type used. +(Start browsing at the bottom to prevent confusion ;-) + + # model + 9000/800/L1000-44 + # grep L1000-44 /usr/sam/lib/mo/sched.models + L1000-44 2.0 PA8500 + =head2 PA-RISC 1.0 The original version of PA-RISC, HP no longer sells any system with this chip. @@ -105,9 +134,18 @@ contain PA-RISC 2.0 chips: D280, D370, D380, D390, D650, J220, J2240, J280, J282, J400, J410, J5000, J5500XM, J5600, J7000, J7600, K250, K260, K260-EG, K270, K360, K370, K380, K450, K460, K460-EG, K460-XP, K470, K570, K580, L1000, - L2000, L3000, N4000, R380, R390, RP2400, RP2430, RP2450, RP2470, - RP5400, RP5430, RP5450, RP5470, RP7400, RP7410, RP8400, SD16000, - SD32000, SD64000, T540, T600, V2000, V2200, V2250, V2500, V2600 + L2000, L3000, N4000, R380, R390, RP2400, RP2405, RP2430, RP2450, + RP2470, RP5400, RP5405, RP5430, RP5450, RP5470, RP7400, RP7405, + RP7410, RP8400, SD16000, SD32000, SD64000, T540, T600, V2000, V2200, + V2250, V2500, V2600 + +Just before HP took over Compaq, some systems were renamed. Visit +http://www.hp.com/products1/servers/server_names.html to see what +the changes are, or will be. + + HP 9000 A-Class servers, now renamed HP Server rp2400 series. + HP 9000 L-Class servers, now renamed HP Server rp5400 series. + HP 9000 N-Class servers, now renamed HP Server rp7400. =head2 Itanium @@ -115,13 +153,7 @@ HP also ships servers with the 128-bit Itanium processor(s). As of the date of this document's last update, the following systems contain Itanium chips (this is very likely to be out of date): - RX4610, RX9610 - -A complete list of models at the time the OS was built is in the file -/opt/langtools/lib/sched.models. The first column corresponds to the -output of the "uname -m" command (without the leading "9000/"). The -second column is the PA-RISC version and the third column is the exact -chip type used. (Start browsing at the bottom to prevent confusion ;-) + RX2600, RX4610, RX5670, RX9610 =head2 Portability Between PA-RISC Versions @@ -260,12 +292,18 @@ When you are going to use the GNU C compiler (gcc), and you don't have gcc yet, you can either build it yourself from the sources (available from e.g. http://www.gnu.ai.mit.edu/software/gcc/releases.html) or fetch a prebuilt binary from the HP porting center. There are two places where -gcc prebuilds can be fetched the first and best (for HP-UX 11 only) is +gcc prebuilds can be fetched; the first and best (for HP-UX 11 only) is http://h21007.www2.hp.com/dspp/tech/tech_TechSoftwareDetailPage_IDX/1,1703,547,00.html the second is http://hpux.cs.utah.edu/hppd/hpux/Gnu/ where you can also find the GNU binutils package. (Browse through the list, because there are often multiple versions of the same package available). +Above mentioned distributions are depots. H.Merijn Brand has made prebuilt +gcc binaries available on https://www.beepz.com/personal/merijn/ for +HP-UX 10.20 and HP-UX 11.00 in both 32- and 64-bit versions. These are +bzipped tar archives that also include recent GNU binutils and GNU gdb. +Read the instructions on that page to rebuild gcc using itself. + Building a 64bit capable gcc from source is possible only when you have the HP C-ANSI C compiler available, which you should use anyway when building perl. @@ -457,8 +495,8 @@ the following: #0 0xc004216c in () from /usr/lib/libc.2 #1 0xc00d7550 in __nss_src_state_destr () from /usr/lib/libc.2 #2 0xc00d7768 in __nss_src_state_destr () from /usr/lib/libc.2 - #3 0xc00d78a8 in nss_delete () from /usr/lib/libc.2 - #4 0xc01126d8 in endpwent () from /usr/lib/libc.2 + #3 0xc00d78a8 in nss_delete () from /usr/lib/libc.2 + #4 0xc01126d8 in endpwent () from /usr/lib/libc.2 #5 0xd1950 in Perl_pp_epwent () from ./perl #6 0x94d3c in Perl_runops_standard () from ./perl #7 0x23728 in S_run_body () from ./perl @@ -469,11 +507,11 @@ The key here is the C<nss_delete> call. One workaround for this bug seems to be to create add to the file F</etc/nsswitch.conf> (at least) the following lines - group: files + group: files passwd: files Whether you are using NIS does not matter. Amazingly enough, -the same bug affects also Solaris. +the same bug also affects Solaris. =head1 AUTHOR @@ -484,6 +522,6 @@ With much assistance regarding shared libraries from Marc Sabatella. =head1 DATE -Version 0.6.6: 2002-05-30 +Version 0.6.7: 2002-09-05 =cut @@ -78,7 +78,7 @@ Perl5.8¤Ç¤Ï¡¢¤³¤ì¤é¤Îµ¡Ç½¤¬¤¹¤Ù¤ÆPerlËÜÂΤÀ¤±¤Ç¼Â¸½¤Ç¤¤ë¾å¤Ë¡¢ÆüËܸì¤Î¤ß¤Ê¤é¤º¾ # jcode.pl require "jcode.pl"; while(<>){ - jcode::convert(*_, 'euc', 'sjis); + jcode::convert(*_, 'euc', 'sjis'); print; } # Jcode.pm @@ -93,7 +93,7 @@ Perl5.8¤Ç¤Ï¡¢¤³¤ì¤é¤Îµ¡Ç½¤¬¤¹¤Ù¤ÆPerlËÜÂΤÀ¤±¤Ç¼Â¸½¤Ç¤¤ë¾å¤Ë¡¢ÆüËܸì¤Î¤ß¤Ê¤é¤º¾ print; } # Perl 5.8 - encoding ¤òÍøÍѤ·¤Æ - use encoding 'euc-jp', STDIN=>'shiftjis' + use encoding 'euc-jp', STDIN => 'shiftjis'; while(<>){ print; } diff --git a/README.mint b/README.mint index df733901b1..82f7509eeb 100644 --- a/README.mint +++ b/README.mint @@ -148,7 +148,7 @@ with op/magic.t and op/stat.t. Maybe you'll find it out. ########################################################################## -Another possible problem may arise from the implementation of the "pwd" +Another possible problem may arise from the implementation of the "pwd" command. It happened to add a carriage return and newline to its output no matter what the setting of $UNIXMODE is. This is quite annoying since many library modules for perl take the output of pwd, chop off the @@ -202,7 +202,7 @@ or extract the original system.o from your libc with module somewhere before you succeed. Anything missing? Yep, I've almost forgotten... -No file in this distribution without a fine saying. Take this one: +No file in this distribution without a fine saying. Take this one: "From a thief you should learn: (1) to work at night; (2) if one cannot gain what one wants in one night to diff --git a/README.netware b/README.netware index 170cd4dfb7..3dd70a6f4c 100644 --- a/README.netware +++ b/README.netware @@ -69,7 +69,7 @@ command prompt. The build process can be stopped after miniperl.exe is created. Then run nmake from NetWare folder through WinNT command prompt. -Currently the following two build types are tested on NetWare +Currently the following two build types are tested on NetWare: =over 4 @@ -120,7 +120,7 @@ ActiveState site. Installation can be done by invoking I<nmake install> from the NetWare folder on a WinNT command prompt after building NetWare Perl by following steps given above. This will copy all the *.pm files and other required files. Documentation files are -not copied.Thus one must first install Windows Perl, Then install +not copied. Thus one must first install Windows Perl, Then install NetWare Perl. Once this is done, do the following to build any extension: @@ -173,7 +173,7 @@ or =item * Note: Some modules downloaded from CPAN may require NetWare related -API in order to build on NetWare.Other modules may however build +API in order to build on NetWare. Other modules may however build smoothly with or without minor changes depending on the type of module. diff --git a/README.os400 b/README.os400 new file mode 100644 index 0000000000..572149b918 --- /dev/null +++ b/README.os400 @@ -0,0 +1,90 @@ +If you read this file _as_is_, just ignore the funny characters you see. +It is written in the POD format (see pod/perlpod.pod) which is specially +designed to be readable as is. + +=head1 NAME + +README.os400 - Perl version 5 on OS/400 + +=head1 DESCRIPTION + +This document describes various features of IBM's OS/400 operating +system that will affect how Perl version 5 (hereafter just Perl) is +compiled and/or runs. + +By far the easiest way to build Perl for OS/400 is to use the PASE +(Portable Application Solutions Environment), for more information see +http://www.iseries.ibm.com/developer/factory/pase/index.html +This environment allows one to use AIX APIs while programming, and it +provides a runtime that allows AIX binaries to execute directly on the +PowerPC iSeries. + +=head2 Compiling Perl for OS/400 PASE + +The recommended way to build Perl for the OS/400 PASE is to build the +Perl 5 source code (release 5.8.1 or later) under AIX. + +The trick is to give a special parameter to the Configure shell script +when running it on AIX: + + sh Configure -DPASE ... + +The default installation directory of Perl under PASE is /QOpenSys/perl. +This can be modified if needed with Configure parameter -Dprefix=/some/dir. + +Starting from OS/400 V5R2 the IBM Visual Age compiler is supported +on OS/400 PASE, so it is possible to build Perl natively on OS/400. +The easier way, however, is to compile in AIX, as just described. + +If building natively on PASE, please do the build under the /QOpenSys +directory, since Perl is happier when built on a case sensitive filesystem. + +=head2 Installing Perl in OS/400 PASE + +If you are compiling on AIX, simply do a "make install" on the AIX box. +Once the install finishes, tar up the /QOpenSys/perl directory. Transfer +the tarball to the OS/400 using FTP with the following commands: + + > binary + > site namefmt 1 + > put perl.tar /QOpenSys + +Once you have it on, simply bring up a PASE shell and extract the tarball. + +If you are compiling in PASE, then "make install" is the only thing you +will need to do. + +The default path for perl binary is /QOpenSys/perl/bin/perl. You'll +want to symlink /QOpenSys/usr/bin/perl to this file so you don't have +to modify your path. + +=head2 Using Perl in OS/400 PASE + +Perl in PASE may be used in the same manner as you would use Perl on AIX. + +Scripts starting with #!/usr/bin/perl should work if you have +/QOpenSys/usr/bin/perl symlinked to your perl binary. This will not +work if you've done a setuid/setgid or have environment variable +PASE_EXEC_QOPENSYS="N". If you have V5R1, you'll need to get the +latest PTFs to have this feature. Scripts starting with +#!/QOpenSys/perl/bin/perl should always work. + +=head2 Perl on ILE + +There exists a port of Perl to the ILE environment. This port, however, +is based quite an old release of Perl, Perl 5.00502 (August 1998). +(As of July 2002 the latest release of Perl is 5.8.0, and even 5.6.1 +has been out since April 2001.) If you need to run Perl on ILE, though, +you may need this older port: http://www.cpan.org/ports/#os400 +Note that any Perl release later than 5.00502 has not been ported to ILE. + +If you need to use Perl in the ILE environment, you may want to consider +using Qp2RunPase() to call the PASE version of Perl. + +=head1 AUTHORS + +Jarkko Hietaniemi <jhi@iki.fi> +Bryan Logan <bryanlog@us.ibm.com> +David Larson <larson1@us.ibm.com> + +=cut diff --git a/README.tru64 b/README.tru64 index 877872c35e..ab21fe0ab0 100644 --- a/README.tru64 +++ b/README.tru64 @@ -63,6 +63,24 @@ patch is expected sometime after perl 5.8.0 is released. If your libc has not yet been patched, you'll get a warning from Configure when selecting long doubles. +=head2 db-hash.t failing on Tru64 + +The Berkeley DB 1.85 coming with the Tru64 is unfortunately buggy. +In general in Tru64 V4.* it seemed to be more stable, but in V5.* +something broke (even though the DB stayed at release 1.85) and +the DB_File extension test db-hash.t may fail by dumping core after +the subtest 21. There really is no good cure as of Tru64 V5.1A expect +installing a newer Berkeley DB and supplying the right directories for +-Dlocincpth=/some/include and -Dloclibpth=/some/lib when running Configure. + +You can also work around the problem by disabling the DB_File by +specifying -Ui_db to Configure, and then using the BerkeleyFile module +from CPAN instead of DB_File. The BerkeleyFile works with Berkeley DB +versions 2.* or greater. + +The Berkeley DB 4.0.14 has been tested with Tru64 V5.1A and found +to work. The latest Berkeley DB can be found from F<http://www.sleepycat.com>. + =head2 64-bit Perl on Tru64 In Tru64 Perl's integers are automatically 64-bit wide, there is diff --git a/README.vmesa b/README.vmesa index 109bf64c62..a9881ec6a4 100644 --- a/README.vmesa +++ b/README.vmesa @@ -37,7 +37,7 @@ To extract an ASCII tar archive on VM/ESA, try this: GNU make for VM/ESA, which may be required for the build of perl, is available from: - http://pucc.princeton.edu/~neale/vmoe.html + http://vm.marist.edu/~neale/vmoe.html =head2 Configure Perl on VM/ESA diff --git a/README.win32 b/README.win32 index e9c56a0b64..826ffa8f98 100644 --- a/README.win32 +++ b/README.win32 @@ -138,15 +138,26 @@ The nmake that comes with the Platform SDK will suffice for building Perl. Make sure you are building within one of the "Build Environment" shells available after you install the Platform SDK from the Start Menu. -=item Mingw32 with GCC +=item MinGW32 with gcc -GCC-2.95.2 binaries can be downloaded from: +The latest release of MinGW (at the time of writing) is 2.0.0, which comes +with gcc-3.2, and can be downloaded here: - ftp://ftp.xraylith.wisc.edu/pub/khan/gnu-win32/mingw32/ + http://sourceforge.net/projects/mingw + +Perl compiles with earlier releases of gcc (2.95 and up) that can be +downloaded from the same place. If you use gcc-3.2, comment out the +line: + + USE_GCC_V3_2 *= define + +in win32\makefile.mk You also need dmake. See L</"Make"> above on how to get it. -The GCC-2.95.2 bundle comes with Mingw32 libraries and headers. +=item MinGW release 1 + +The MinGW-1.1 bundle comes with gcc-2.95.3. Make sure you install the binaries that work with MSVCRT.DLL as indicated in the README for the GCC bundle. You may need to set up a few environment @@ -228,6 +228,49 @@ C<xsubpp>. See L<perlxs/"The VERSIONCHECK: Keyword">. # define XS_VERSION_BOOTCHECK #endif +/* + The DBM_setFilter & DBM_ckFilter macros are only used by + the *DB*_File modules +*/ + +#define DBM_setFilter(db_type,code) \ + { \ + if (db_type) \ + RETVAL = sv_mortalcopy(db_type) ; \ + ST(0) = RETVAL ; \ + if (db_type && (code == &PL_sv_undef)) { \ + SvREFCNT_dec(db_type) ; \ + db_type = NULL ; \ + } \ + else if (code) { \ + if (db_type) \ + sv_setsv(db_type, code) ; \ + else \ + db_type = newSVsv(code) ; \ + } \ + } + +#define DBM_ckFilter(arg,type,name) \ + if (db->type) { \ + if (db->filtering) { \ + croak("recursion detected in %s", name) ; \ + } \ + ENTER ; \ + SAVETMPS ; \ + SAVEINT(db->filtering) ; \ + db->filtering = TRUE ; \ + SAVESPTR(DEFSV) ; \ + DEFSV = arg ; \ + SvTEMP_off(arg) ; \ + PUSHMARK(SP) ; \ + PUTBACK ; \ + (void) perl_call_sv(db->type, G_DISCARD); \ + SPAGAIN ; \ + PUTBACK ; \ + FREETMPS ; \ + LEAVE ; \ + } + #if 1 /* for compatibility */ # define VTBL_sv &PL_vtbl_sv # define VTBL_env &PL_vtbl_env diff --git a/autodoc.pl b/autodoc.pl index 33c22232fa..c898c85d9b 100644 --- a/autodoc.pl +++ b/autodoc.pl @@ -36,7 +36,7 @@ sub walk_table (&@) { while (<IN>) { chomp; next if /^:/; - while (s|\\$||) { + while (s|\\\s*$||) { $_ .= <IN>; chomp; } @@ -69,7 +69,7 @@ FUNC: next FUNC; } $line++; - if ($in =~ /^=for\s+apidoc\s+(.*)\n/) { + if ($in =~ /^=for\s+apidoc\s+(.*?)\s*\n/) { my $proto = $1; $proto = "||$proto" unless $proto =~ /\|/; my($flags, $ret, $name, @args) = split /\|/, $proto; @@ -155,16 +155,20 @@ walk_table { # load documented functions into approriate hash return "" unless $flags =~ /d/; $func =~ s/\t//g; $flags =~ s/p//; # clean up fields from embed.pl $retval =~ s/\t//; - if ($flags =~ /A/) { - my $docref = delete $docfuncs{$func}; + my $docref = delete $docfuncs{$func}; + if ($docref and @$docref) { + if ($flags =~ /A/) { + $docref->[0].="x" if $flags =~ /M/; + $apidocs{$docref->[4]}{$func} = + [$docref->[0] . 'A', $docref->[1], $retval, + $docref->[3], @args]; + } else { + $gutsdocs{$docref->[4]}{$func} = + [$docref->[0], $docref->[1], $retval, $docref->[3], @args]; + } + } + else { warn "no docs for $func\n" unless $docref and @$docref; - $docref->[0].="x" if $flags =~ /M/; - $apidocs{$docref->[4]}{$func} = - [$docref->[0] . 'A', $docref->[1], $retval, $docref->[3], @args]; - } else { - my $docref = delete $docfuncs{$func}; - $gutsdocs{$docref->[4]}{$func} = - [$docref->[0], $docref->[1], $retval, $docref->[3], @args]; } } return ""; @@ -184,23 +184,42 @@ Perl_av_fetch(pTHX_ register AV *av, I32 key, I32 lval) if (!av) return 0; + if (SvRMAGICAL(av)) { + MAGIC *tied_magic = mg_find((SV*)av, PERL_MAGIC_tied); + if (tied_magic || mg_find((SV*)av, PERL_MAGIC_regdata)) { + U32 adjust_index = 1; + + if (tied_magic && key < 0) { + /* Handle negative array indices 20020222 MJD */ + SV **negative_indices_glob = + hv_fetch(SvSTASH(SvRV(SvTIED_obj((SV *)av, + tied_magic))), + NEGATIVE_INDICES_VAR, 16, 0); + + if (negative_indices_glob + && SvTRUE(GvSV(*negative_indices_glob))) + adjust_index = 0; + } + + if (key < 0 && adjust_index) { + key += AvFILL(av) + 1; + if (key < 0) + return 0; + } + + sv = sv_newmortal(); + mg_copy((SV*)av, sv, 0, key); + PL_av_fetch_sv = sv; + return &PL_av_fetch_sv; + } + } + if (key < 0) { key += AvFILL(av) + 1; if (key < 0) return 0; } - if (SvRMAGICAL(av)) { - if (mg_find((SV*)av, PERL_MAGIC_tied) || - mg_find((SV*)av, PERL_MAGIC_regdata)) - { - sv = sv_newmortal(); - mg_copy((SV*)av, sv, 0, key); - PL_av_fetch_sv = sv; - return &PL_av_fetch_sv; - } - } - if (key > AvFILLp(av)) { if (!lval) return 0; @@ -251,6 +270,33 @@ Perl_av_store(pTHX_ register AV *av, I32 key, SV *val) if (!val) val = &PL_sv_undef; + if (SvRMAGICAL(av)) { + MAGIC *tied_magic = mg_find((SV*)av, PERL_MAGIC_tied); + if (tied_magic) { + /* Handle negative array indices 20020222 MJD */ + if (key < 0) { + unsigned adjust_index = 1; + SV **negative_indices_glob = + hv_fetch(SvSTASH(SvRV(SvTIED_obj((SV *)av, + tied_magic))), + NEGATIVE_INDICES_VAR, 16, 0); + if (negative_indices_glob + && SvTRUE(GvSV(*negative_indices_glob))) + adjust_index = 0; + if (adjust_index) { + key += AvFILL(av) + 1; + if (key < 0) + return 0; + } + } + if (val != &PL_sv_undef) { + mg_copy((SV*)av, val, 0, key); + } + return 0; + } + } + + if (key < 0) { key += AvFILL(av) + 1; if (key < 0) @@ -260,15 +306,6 @@ Perl_av_store(pTHX_ register AV *av, I32 key, SV *val) if (SvREADONLY(av) && key >= AvFILL(av)) Perl_croak(aTHX_ PL_no_modify); - if (SvRMAGICAL(av)) { - if (mg_find((SV*)av, PERL_MAGIC_tied)) { - if (val != &PL_sv_undef) { - mg_copy((SV*)av, val, 0, key); - } - return 0; - } - } - if (!AvREAL(av) && AvREIFY(av)) av_reify(av); if (key > AvMAX(av)) @@ -750,26 +787,48 @@ Perl_av_delete(pTHX_ AV *av, I32 key, I32 flags) return Nullsv; if (SvREADONLY(av)) Perl_croak(aTHX_ PL_no_modify); + + if (SvRMAGICAL(av)) { + MAGIC *tied_magic = mg_find((SV*)av, PERL_MAGIC_tied); + SV **svp; + if ((tied_magic || mg_find((SV*)av, PERL_MAGIC_regdata))) { + /* Handle negative array indices 20020222 MJD */ + if (key < 0) { + unsigned adjust_index = 1; + if (tied_magic) { + SV **negative_indices_glob = + hv_fetch(SvSTASH(SvRV(SvTIED_obj((SV *)av, + tied_magic))), + NEGATIVE_INDICES_VAR, 16, 0); + if (negative_indices_glob + && SvTRUE(GvSV(*negative_indices_glob))) + adjust_index = 0; + } + if (adjust_index) { + key += AvFILL(av) + 1; + if (key < 0) + return Nullsv; + } + } + svp = av_fetch(av, key, TRUE); + if (svp) { + sv = *svp; + mg_clear(sv); + if (mg_find(sv, PERL_MAGIC_tiedelem)) { + sv_unmagic(sv, PERL_MAGIC_tiedelem); /* No longer an element */ + return sv; + } + return Nullsv; + } + } + } + if (key < 0) { key += AvFILL(av) + 1; if (key < 0) return Nullsv; } - if (SvRMAGICAL(av)) { - SV **svp; - if ((mg_find((SV*)av, PERL_MAGIC_tied) || - mg_find((SV*)av, PERL_MAGIC_regdata)) - && (svp = av_fetch(av, key, TRUE))) - { - sv = *svp; - mg_clear(sv); - if (mg_find(sv, PERL_MAGIC_tiedelem)) { - sv_unmagic(sv, PERL_MAGIC_tiedelem); /* No longer an element */ - return sv; - } - return Nullsv; /* element cannot be deleted */ - } - } + if (key > AvFILLp(av)) return Nullsv; else { @@ -807,26 +866,48 @@ Perl_av_exists(pTHX_ AV *av, I32 key) { if (!av) return FALSE; + + + if (SvRMAGICAL(av)) { + MAGIC *tied_magic = mg_find((SV*)av, PERL_MAGIC_tied); + if (tied_magic || mg_find((SV*)av, PERL_MAGIC_regdata)) { + SV *sv = sv_newmortal(); + MAGIC *mg; + /* Handle negative array indices 20020222 MJD */ + if (key < 0) { + unsigned adjust_index = 1; + if (tied_magic) { + SV **negative_indices_glob = + hv_fetch(SvSTASH(SvRV(SvTIED_obj((SV *)av, + tied_magic))), + NEGATIVE_INDICES_VAR, 16, 0); + if (negative_indices_glob + && SvTRUE(GvSV(*negative_indices_glob))) + adjust_index = 0; + } + if (adjust_index) { + key += AvFILL(av) + 1; + if (key < 0) + return FALSE; + } + } + + mg_copy((SV*)av, sv, 0, key); + mg = mg_find(sv, PERL_MAGIC_tiedelem); + if (mg) { + magic_existspack(sv, mg); + return (bool)SvTRUE(sv); + } + + } + } + if (key < 0) { key += AvFILL(av) + 1; if (key < 0) return FALSE; } - if (SvRMAGICAL(av)) { - if (mg_find((SV*)av, PERL_MAGIC_tied) || - mg_find((SV*)av, PERL_MAGIC_regdata)) - { - SV *sv = sv_newmortal(); - MAGIC *mg; - - mg_copy((SV*)av, sv, 0, key); - mg = mg_find(sv, PERL_MAGIC_tiedelem); - if (mg) { - magic_existspack(sv, mg); - return (bool)SvTRUE(sv); - } - } - } + if (key <= AvFILLp(av) && AvARRAY(av)[key] != &PL_sv_undef && AvARRAY(av)[key]) { @@ -83,3 +83,4 @@ Same as C<av_len()>. Deprecated, use C<av_len()> instead. #define AvFILL(av) ((SvRMAGICAL((SV *) (av))) \ ? mg_size((SV *) av) : AvFILLp(av)) +#define NEGATIVE_INDICES_VAR "NEGATIVE_INDICES" @@ -123,18 +123,43 @@ for file do *) ;; esac -# Add -Wall for the core and core modules iff gcc and not already -Wall +# Add -Wall for the core modules iff gcc and not already -Wall warn='' case "$gccversion" in '') ;; *) case "$ccflags" in *-Wall*) ;; -# Can't add -ansi here because it will fail e.g. in Solaris. + *) warn="$warn -Wall" ;; + esac + case "$gccansipedantic" in + define) + case "$gccversion" in + [12]*) ;; # gcc versions 1 (gasp!) and 2 are not good for this. + *) case "$osname" in + # Add -ansi -pedantic only for known platforms. + aix|dec_osf|freebsd|hpux|irix|linux) + ansipedantic="-ansi -pedantic" ;; + solaris) +# Can't add -ansi for Solaris. # Off_t/off_t is a struct in Solaris with largefiles, and with -ansi # that struct cannot be compared with a flat integer, such as a STRLEN. # The -ansi will also cause a lot of noise in Solaris because of: # /usr/include/sys/resource.h:148: warning: `struct rlimit64' declared inside parameter list - *) warn='-Wall' ;; + ansipedantic="-pedantic" ;; + esac + for i in $ansipedantic + do + case "$ccflags" in + *$i*) ;; + *) warn="$warn $i" ;; + esac + done + case "$warn$ccflags" in + *-pedantic*) warn="$warn -DPERL_GCC_PEDANTIC" ;; + esac + ;; + esac + ;; esac ;; esac @@ -1,97 +1,172 @@ #!./miniperl -w -# following options are recognized: -# --no-glossary - no glossary file inclusion, for compactness -# --cross=PALTFORM - crosscompiling for PLATFORM -my %opts = ( - # %known_opts enumerates allowed opts as well as specifies default and initial values - my %known_opts = ( - 'cross' => '', - 'glossary' => 1, - ), - # options itself - my %specified_opts = ( - (map {/^--([\-_\w]+)=(.*)$/} @ARGV), # --opt=smth - (map {/^no-?(.*)$/i?($1=>0):($_=>1)} map {/^--([\-_\w]+)$/} @ARGV), # --opt --no-opt --noopt - ), +# commonly used names to put first (and hence lookup fastest) +my %Common = map {($_,$_)} + qw(archname osname osvers prefix libs libpth + dynamic_ext static_ext dlsrc so + cc ccflags cppflags + privlibexp archlibexp installprivlib installarchlib + sharpbang startsh shsharp + ); + +# names of things which may need to have slashes changed to double-colons +my %Extensions = map {($_,$_)} + qw(dynamic_ext static_ext extensions known_extensions); + +# allowed opts as well as specifies default and initial values +my %Allowed_Opts = ( + 'cross' => '', # --cross=PALTFORM - crosscompiling for PLATFORM + 'glossary' => 1, # --no-glossary - no glossary file inclusion, + # for compactness ); -die "option '$_' is not recognized" for grep {!exists $known_opts{$_}} keys %specified_opts; -@ARGV = grep {!/^--/} @ARGV; -my $config_pm; -my $glossary = $ARGV[1] || 'Porting/Glossary'; +sub opts { + # user specified options + my %given_opts = ( + # --opt=smth + (map {/^--([\-_\w]+)=(.*)$/} @ARGV), + # --opt --no-opt --noopt + (map {/^no-?(.*)$/i?($1=>0):($_=>1)} map {/^--([\-_\w]+)$/} @ARGV), + ); + + my %opts = (%Allowed_Opts, %given_opts); + + for my $opt (grep {!exists $Allowed_Opts{$_}} keys %given_opts) { + die "option '$opt' is not recognized"; + } + @ARGV = grep {!/^--/} @ARGV; + + return %opts; +} + + +my %Opts = opts(); -if ($opts{cross}) { +my $Config_PM; +my $Glossary = $ARGV[1] || 'Porting/Glossary'; + +if ($Opts{cross}) { # creating cross-platform config file mkdir "xlib"; - mkdir "xlib/$opts{cross}"; - $config_pm = $ARGV[0] || "xlib/$opts{cross}/Config.pm"; + mkdir "xlib/$Opts{cross}"; + $Config_PM = $ARGV[0] || "xlib/$Opts{cross}/Config.pm"; } else { - $config_pm = $ARGV[0] || 'lib/Config.pm'; + $Config_PM = $ARGV[0] || 'lib/Config.pm'; } -@ARGV = "./config.sh"; -# list names to put first (and hence lookup fastest) -@fast = qw(archname osname osvers prefix libs libpth - dynamic_ext static_ext extensions dlsrc so - sig_name sig_num cc ccflags cppflags - privlibexp archlibexp installprivlib installarchlib - sharpbang startsh shsharp -); - -# names of things which may need to have slashes changed to double-colons -@extensions = qw(dynamic_ext static_ext extensions known_extensions); +open CONFIG, ">$Config_PM" or die "Can't open $Config_PM: $!\n"; +my $myver = sprintf "v%vd", $^V; -open CONFIG, ">$config_pm" or die "Can't open $config_pm: $!\n"; -$myver = sprintf "v%vd", $^V; +printf CONFIG <<'ENDOFBEG', ($myver) x 3; +# This file was created by configpm when Perl was built. Any changes +# made to this file will be lost the next time perl is built. -print CONFIG <<'ENDOFBEG_NOQ', <<"ENDOFBEG"; package Config; -use Exporter (); -@EXPORT = qw(%Config); -@EXPORT_OK = qw(myconfig config_sh config_vars); +@EXPORT = qw(%%Config); +@EXPORT_OK = qw(myconfig config_sh config_vars config_re); + +my %%Export_Cache = map {($_ => 1)} (@EXPORT, @EXPORT_OK); # Define our own import method to avoid pulling in the full Exporter: sub import { - my $pkg = shift; - @_ = @EXPORT unless @_; - my @func = grep {$_ ne '%Config'} @_; - local $Exporter::ExportLevel = 1; - Exporter::import('Config', @func) if @func; - return if @func == @_; - my $callpkg = caller(0); - *{"$callpkg\::Config"} = \%Config; -} + my $pkg = shift; + @_ = @EXPORT unless @_; -ENDOFBEG_NOQ -die "Perl lib version ($myver) doesn't match executable version (\$])" - unless \$^V; + my @funcs = grep $_ ne '%%Config', @_; + my $export_Config = @funcs < @_ ? 1 : 0; -\$^V eq $myver - or die "Perl lib version ($myver) doesn't match executable version (" . - (sprintf "v%vd",\$^V) . ")"; + my $callpkg = caller(0); + foreach my $func (@funcs) { + die sprintf qq{"%%s" is not exported by the %%s module\n}, + $func, __PACKAGE__ unless $Export_Cache{$func}; + *{$callpkg.'::'.$func} = \&{$func}; + } -# This file was created by configpm when Perl was built. Any changes -# made to this file will be lost the next time perl is built. + *{"$callpkg\::Config"} = \%%Config if $export_Config; + return; +} + +die "Perl lib version (%s) doesn't match executable version ($])" + unless $^V; + +$^V eq %s + or die "Perl lib version (%s) doesn't match executable version (" . + sprintf("v%%vd",$^V) . ")"; ENDOFBEG -@fast{@fast} = @fast; -@extensions{@extensions} = @extensions; -@non_v=(); -@v_fast=(); -@v_others=(); -$in_v = 0; +my @non_v = (); +my @v_fast = (); +my %v_fast = (); +my @v_others = (); +my $in_v = 0; +my %Data = (); + +# This is somewhat grim, but I want the code for parsing config.sh here and +# now so that I can expand $Config{ivsize} and $Config{ivtype} + +my $fetch_string = <<'EOT'; -while (<>) { +# Search for it in the big string +sub fetch_string { + my($self, $key) = @_; + + my $quote_type = "'"; + my $marker = "$key="; + + # Check for the common case, ' delimeted + my $start = index($Config_SH, "\n$marker$quote_type"); + # If that failed, check for " delimited + if ($start == -1) { + $quote_type = '"'; + $start = index($Config_SH, "\n$marker$quote_type"); + } + return undef if ( ($start == -1) && # in case it's first + (substr($Config_SH, 0, length($marker)) ne $marker) ); + if ($start == -1) { + # It's the very first thing we found. Skip $start forward + # and figure out the quote mark after the =. + $start = length($marker) + 1; + $quote_type = substr($Config_SH, $start - 1, 1); + } + else { + $start += length($marker) + 2; + } + + my $value = substr($Config_SH, $start, + index($Config_SH, "$quote_type\n", $start) - $start); + + # If we had a double-quote, we'd better eval it so escape + # sequences and such can be interpolated. Since the incoming + # value is supposed to follow shell rules and not perl rules, + # we escape any perl variable markers + if ($quote_type eq '"') { + $value =~ s/\$/\\\$/g; + $value =~ s/\@/\\\@/g; + eval "\$value = \"$value\""; + } + + # So we can say "if $Config{'foo'}". + $value = undef if $value eq 'undef'; + $self->{$key} = $value; # cache it +} +EOT + +eval $fetch_string; +die if $@; + +open(CONFIG_SH, 'config.sh') || die "Can't open config.sh: $!"; +while (<CONFIG_SH>) { next if m:^#!/bin/sh:; + # Catch PERL_CONFIG_SH=true and PERL_VERSION=n line from Configure. - s/^(\w+)=(true|\d+)\s*$/$1='$2'\n/; - my ($k,$v) = ($1,$2); + s/^(\w+)=(true|\d+)\s*$/$1='$2'\n/ or m/^(\w+)='(.*)'$/; + my($k, $v) = ($1, $2); + # grandfather PATCHLEVEL and SUBVERSION and CONFIG if ($k) { if ($k eq 'PERL_VERSION') { @@ -104,32 +179,41 @@ while (<>) { push @v_others, "CONFIG='$v'\n"; } } + # We can delimit things in config.sh with either ' or ". unless ($in_v or m/^(\w+)=(['"])(.*\n)/){ push(@non_v, "#$_"); # not a name='value' line next; } $quote = $2; - if ($in_v) { $val .= $_; } - else { ($name,$val) = ($1,$3); } + if ($in_v) { + $val .= $_; + } + else { + ($name,$val) = ($1,$3); + } $in_v = $val !~ /$quote\n/; next if $in_v; - if ($extensions{$name}) { s,/,::,g } - if (!$fast{$name}){ push(@v_others, "$name=$quote$val"); next; } - push(@v_fast,"$name=$quote$val"); -} -foreach(@non_v){ print CONFIG $_ } + s,/,::,g if $Extensions{$name}; -print CONFIG "\n", - "my \$config_sh = <<'!END!';\n", - join("", @v_fast, sort @v_others), - "!END!\n\n"; + $val =~ s/$quote\n?\z//; -# copy config summary format from the myconfig.SH script + my $line = "$name=$quote$val$quote\n"; + if (!$Common{$name}){ + push(@v_others, $line); + } + else { + push(@v_fast, $line); + $v_fast{$name} = "'$name' => $quote$val$quote"; + } +} +close CONFIG_SH; -print CONFIG "my \$summary = <<'!END!';\n"; +print CONFIG @non_v, "\n"; +# copy config summary format from the myconfig.SH script +print CONFIG "my \$summary = <<'!END!';\n"; open(MYCONFIG,"<myconfig.SH") || die "open myconfig.SH failed: $!"; 1 while defined($_ = <MYCONFIG>) && !/^Summary of/; do { print CONFIG $_ } until !defined($_ = <MYCONFIG>) || /^\s*$/; @@ -139,200 +223,208 @@ print CONFIG "\n!END!\n", <<'EOT'; my $summary_expanded = 0; sub myconfig { - return $summary if $summary_expanded; - $summary =~ s{\$(\w+)} - { my $c = $Config{$1}; defined($c) ? $c : 'undef' }ge; - $summary_expanded = 1; - $summary; + return $summary if $summary_expanded; + $summary =~ s{\$(\w+)} + { my $c = $Config{$1}; defined($c) ? $c : 'undef' }ge; + $summary_expanded = 1; + $summary; } + +our $Config_SH : unique = <<'!END!'; EOT -# ---- +print CONFIG join("", @v_fast, sort @v_others); + +print CONFIG "!END!\n", $fetch_string; print CONFIG <<'ENDOFEND'; -sub FETCH { - # check for cached value (which may be undef so we use exists not defined) - return $_[0]->{$_[1]} if (exists $_[0]->{$_[1]}); - - # Search for it in the big string - my($value, $start, $marker, $quote_type); - - $quote_type = "'"; - # Virtual entries. - if ($_[1] eq 'byteorder') { - # byteorder does exist on its own but we overlay a virtual - # dynamically recomputed value. - my $t = $Config{ivtype}; - my $s = $Config{ivsize}; - my $f = $t eq 'long' ? 'L!' : $s == 8 ? 'Q': 'I'; - if ($s == 4 || $s == 8) { - my $i = 0; - foreach my $c (reverse(2..$s)) { $i |= ord($c); $i <<= 8 } - $i |= ord(1); - $value = join('', unpack('a'x$s, pack($f, $i))); - } else { - $value = '?'x$s; - } - } elsif ($_[1] =~ /^((?:cc|ld)flags|libs(?:wanted)?)_nolargefiles/) { +sub fetch_virtual { + my($self, $key) = @_; + + my $value; + + if ($key =~ /^((?:cc|ld)flags|libs(?:wanted)?)_nolargefiles/) { # These are purely virtual, they do not exist, but need to # be computed on demand for largefile-incapable extensions. - my $key = "${1}_uselargefiles"; + my $new_key = "${1}_uselargefiles"; $value = $Config{$1}; - my $withlargefiles = $Config{$key}; - if ($key =~ /^(?:cc|ld)flags_/) { + my $withlargefiles = $Config{$new_key}; + if ($new_key =~ /^(?:cc|ld)flags_/) { $value =~ s/\Q$withlargefiles\E\b//; - } elsif ($key =~ /^libs/) { + } elsif ($new_key =~ /^libs/) { my @lflibswanted = split(' ', $Config{libswanted_uselargefiles}); if (@lflibswanted) { my %lflibswanted; @lflibswanted{@lflibswanted} = (); - if ($key =~ /^libs_/) { + if ($new_key =~ /^libs_/) { my @libs = grep { /^-l(.+)/ && not exists $lflibswanted{$1} } split(' ', $Config{libs}); $Config{libs} = join(' ', @libs); - } elsif ($key =~ /^libswanted_/) { + } elsif ($new_key =~ /^libswanted_/) { my @libswanted = grep { not exists $lflibswanted{$_} } split(' ', $Config{libswanted}); $Config{libswanted} = join(' ', @libswanted); } } } - } else { - $marker = "$_[1]="; - # return undef unless (($value) = $config_sh =~ m/^$_[1]='(.*)'\s*$/m); - # Check for the common case, ' delimeted - $start = index($config_sh, "\n$marker$quote_type"); - # If that failed, check for " delimited - if ($start == -1) { - $quote_type = '"'; - $start = index($config_sh, "\n$marker$quote_type"); - } - return undef if ( ($start == -1) && # in case it's first - (substr($config_sh, 0, length($marker)) ne $marker) ); - if ($start == -1) { - # It's the very first thing we found. Skip $start forward - # and figure out the quote mark after the =. - $start = length($marker) + 1; - $quote_type = substr($config_sh, $start - 1, 1); - } - else { - $start += length($marker) + 2; - } - $value = substr($config_sh, $start, - index($config_sh, "$quote_type\n", $start) - $start); - } - # If we had a double-quote, we'd better eval it so escape - # sequences and such can be interpolated. Since the incoming - # value is supposed to follow shell rules and not perl rules, - # we escape any perl variable markers - if ($quote_type eq '"') { - $value =~ s/\$/\\\$/g; - $value =~ s/\@/\\\@/g; - eval "\$value = \"$value\""; } - #$value = sprintf($value) if $quote_type eq '"'; - # So we can say "if $Config{'foo'}". - $value = undef if $value eq 'undef'; - $_[0]->{$_[1]} = $value; # cache it - return $value; + + $self->{$key} = $value; +} + +sub FETCH { + my($self, $key) = @_; + + # check for cached value (which may be undef so we use exists not defined) + return $self->{$key} if exists $self->{$key}; + + $self->fetch_string($key); + return $self->{$key} if exists $self->{$key}; + $self->fetch_virtual($key); + + # Might not exist, in which undef is correct. + return $self->{$key}; } my $prevpos = 0; sub FIRSTKEY { $prevpos = 0; - # my($key) = $config_sh =~ m/^(.*?)=/; - substr($config_sh, 0, index($config_sh, '=') ); - # $key; + substr($Config_SH, 0, index($Config_SH, '=') ); } sub NEXTKEY { # Find out how the current key's quoted so we can skip to its end. - my $quote = substr($config_sh, index($config_sh, "=", $prevpos)+1, 1); - my $pos = index($config_sh, qq($quote\n), $prevpos) + 2; - my $len = index($config_sh, "=", $pos) - $pos; + my $quote = substr($Config_SH, index($Config_SH, "=", $prevpos)+1, 1); + my $pos = index($Config_SH, qq($quote\n), $prevpos) + 2; + my $len = index($Config_SH, "=", $pos) - $pos; $prevpos = $pos; - $len > 0 ? substr($config_sh, $pos, $len) : undef; + $len > 0 ? substr($Config_SH, $pos, $len) : undef; } sub EXISTS { - # exists($_[0]->{$_[1]}) or $config_sh =~ m/^$_[1]=/m; - exists($_[0]->{$_[1]}) or - index($config_sh, "\n$_[1]='") != -1 or - substr($config_sh, 0, length($_[1])+2) eq "$_[1]='" or - index($config_sh, "\n$_[1]=\"") != -1 or - substr($config_sh, 0, length($_[1])+2) eq "$_[1]=\"" or - $_[1] =~ /^(?:(?:cc|ld)flags|libs(?:wanted)?)_nolargefiles$/; + return 1 if exists($_[0]->{$_[1]}); + + return(index($Config_SH, "\n$_[1]='") != -1 or + substr($Config_SH, 0, length($_[1])+2) eq "$_[1]='" or + index($Config_SH, "\n$_[1]=\"") != -1 or + substr($Config_SH, 0, length($_[1])+2) eq "$_[1]=\"" or + $_[1] =~ /^(?:(?:cc|ld)flags|libs(?:wanted)?)_nolargefiles$/ + ); } sub STORE { die "\%Config::Config is read-only\n" } -sub DELETE { &STORE } -sub CLEAR { &STORE } +*DELETE = \&STORE; +*CLEAR = \&STORE; sub config_sh { - $config_sh + $Config_SH } sub config_re { my $re = shift; - my @matches = grep /^$re=/, split /^/, $config_sh; - @matches ? (print @matches) : print "$re: not found\n"; + return map { chomp; $_ } grep /^$re=/, split /^/, $config_sh; } sub config_vars { - foreach(@_){ - config_re($_), next if /\W/; - my $v=(exists $Config{$_}) ? $Config{$_} : 'UNKNOWN'; - $v='undef' unless defined $v; - print "$_='$v';\n"; + foreach (@_) { + if (/\W/) { + my @matches = config_re($_); + print map "$_\n", @matches ? @matches : "$_: not found"; + } else { + my $v = (exists $Config{$_}) ? $Config{$_} : 'UNKNOWN'; + $v = 'undef' unless defined $v; + print "$_='$v';\n"; + } } } ENDOFEND if ($^O eq 'os2') { - print CONFIG <<'ENDOFSET'; + print CONFIG <<'ENDOFSET'; my %preconfig; if ($OS2::is_aout) { - my ($value, $v) = $config_sh =~ m/^used_aout='(.*)'\s*$/m; + my ($value, $v) = $Config_SH =~ m/^used_aout='(.*)'\s*$/m; for (split ' ', $value) { - ($v) = $config_sh =~ m/^aout_$_='(.*)'\s*$/m; + ($v) = $Config_SH =~ m/^aout_$_='(.*)'\s*$/m; $preconfig{$_} = $v eq 'undef' ? undef : $v; } } $preconfig{d_fork} = undef unless $OS2::can_fork; # Some funny cases can't sub TIEHASH { bless {%preconfig} } ENDOFSET - # Extract the name of the DLL from the makefile to avoid duplication - my ($f) = grep -r, qw(GNUMakefile Makefile); - my $dll; - if (open my $fh, '<', $f) { - while (<$fh>) { - $dll = $1, last if /^PERL_DLL_BASE\s*=\s*(\S*)\s*$/; + # Extract the name of the DLL from the makefile to avoid duplication + my ($f) = grep -r, qw(GNUMakefile Makefile); + my $dll; + if (open my $fh, '<', $f) { + while (<$fh>) { + $dll = $1, last if /^PERL_DLL_BASE\s*=\s*(\S*)\s*$/; + } } - } - print CONFIG <<ENDOFSET if $dll; + print CONFIG <<ENDOFSET if $dll; \$preconfig{dll_name} = '$dll'; ENDOFSET } else { - print CONFIG <<'ENDOFSET'; -sub TIEHASH { bless {} } + print CONFIG <<'ENDOFSET'; +sub TIEHASH { + bless $_[1], $_[0]; +} ENDOFSET } -print CONFIG <<'ENDOFTAIL'; + +# Calculation for the keys for byteorder +# This is somewhat grim, but I need to run fetch_string here. +our $Config_SH = join "\n", @v_fast, @v_others; + +my $t = fetch_string ({}, 'ivtype'); +my $s = fetch_string ({}, 'ivsize'); + +# byteorder does exist on its own but we overlay a virtual +# dynamically recomputed value. + +# However, ivtype and ivsize will not vary for sane fat binaries + +my $f = $t eq 'long' ? 'L!' : $s == 8 ? 'Q': 'I'; + +my $byteorder_code; +if ($s == 4 || $s == 8) { + my $list = join ',', reverse(2..$s); + my $format = 'a'x$s; + $byteorder_code = <<"EOT"; +my \$i = 0; +foreach my \$c ($list) { \$i |= ord(\$c); \$i <<= 8 } +\$i |= ord(1); +my \$value = join('', unpack('$format', pack('$f', \$i))); +EOT +} else { + $byteorder_code = "\$value = '?'x$s;\n"; +} + +my $fast_config = join '', map { " $_,\n" } + values (%v_fast), 'byteorder => $value' ; + +print CONFIG sprintf <<'ENDOFTIE', $byteorder_code, $fast_config; # avoid Config..Exporter..UNIVERSAL search for DESTROY then AUTOLOAD sub DESTROY { } -tie %Config, 'Config'; +%s + +tie %%Config, 'Config', { +%s +}; 1; -__END__ +ENDOFTIE + +open(CONFIG_POD, ">lib/Config.pod") or die "Can't open lib/Config.pod: $!"; +print CONFIG_POD <<'ENDOFTAIL'; =head1 NAME Config - access Perl configuration information @@ -344,12 +436,14 @@ Config - access Perl configuration information print "built by gcc\n"; } - use Config qw(myconfig config_sh config_vars); + use Config qw(myconfig config_sh config_vars config_re); print myconfig(); print config_sh(); + print config_re(); + config_vars(qw(osname archname)); @@ -377,6 +471,11 @@ See also C<-V> in L<perlrun/Switches>. Returns the entire perl configuration information in the form of the original config.sh shell variable assignment script. +=item config_re($regex) + +Like config_sh() but returns, as a list, only the config entries who's +names match the $regex. + =item config_vars(@names) Prints to STDOUT the values of the named configuration variable. Each is @@ -443,8 +542,8 @@ in such cases. ENDOFTAIL -if ($opts{glossary}) { - open(GLOS, "<$glossary") or die "Can't open $glossary: $!"; +if ($Opts{glossary}) { + open(GLOS, "<$Glossary") or die "Can't open $Glossary: $!"; } %seen = (); $text = 0; @@ -454,11 +553,11 @@ sub process { if (s/\A(\w*)\s+\(([\w.]+)\):\s*\n(\t?)/=item C<$1>\n\nFrom F<$2>:\n\n/m) { my $c = substr $1, 0, 1; unless ($seen{$c}++) { - print CONFIG <<EOF if $text; + print CONFIG_POD <<EOF if $text; =back EOF - print CONFIG <<EOF; + print CONFIG_POD <<EOF; =head2 $c =over 4 @@ -499,16 +598,16 @@ EOF s/n[\0]t/n't/g; # undo can't, won't damage } -if ($opts{glossary}) { +if ($Opts{glossary}) { <GLOS>; # Skip the "DO NOT EDIT" <GLOS>; # Skip the preamble while (<GLOS>) { process; - print CONFIG; + print CONFIG_POD; } } -print CONFIG <<'ENDOFTAIL'; +print CONFIG_POD <<'ENDOFTAIL'; =back @@ -524,9 +623,10 @@ ENDOFTAIL close(CONFIG); close(GLOS); +close(CONFIG_POD); # Now create Cross.pm if needed -if ($opts{cross}) { +if ($Opts{cross}) { open CROSS, ">lib/Cross.pm" or die "Can not open >lib/Cross.pm: $!"; my $cross = <<'EOS'; # typical invocation: @@ -547,26 +647,25 @@ sub import { 1; EOS - $cross =~ s/\*\*\*replace-marker\*\*\*/$opts{cross}/g; + $cross =~ s/\*\*\*replace-marker\*\*\*/$Opts{cross}/g; print CROSS $cross; close CROSS; } - # Now do some simple tests on the Config.pm file we have created unshift(@INC,'lib'); -require $config_pm; +require $Config_PM; import Config; -die "$0: $config_pm not valid" +die "$0: $Config_PM not valid" unless $Config{'PERL_CONFIG_SH'} eq 'true'; -die "$0: error processing $config_pm" +die "$0: error processing $Config_PM" if defined($Config{'an impossible name'}) or $Config{'PERL_CONFIG_SH'} ne 'true' # test cache ; -die "$0: error processing $config_pm" +die "$0: error processing $Config_PM" if eval '$Config{"cc"} = 1' or eval 'delete $Config{"cc"}' ; diff --git a/configure.com b/configure.com index 5addf1a3bb..8965c272d5 100644 --- a/configure.com +++ b/configure.com @@ -2573,8 +2573,6 @@ $ IF .NOT. Has_socketshr .AND. .NOT. Has_Dec_C_Sockets $ THEN $ dflt = dflt - "Socket" ! optional on VMS $ ENDIF -$ IF .NOT. use_ithreads THEN dflt = dflt - "threads/shared" -$ IF .NOT. use_ithreads THEN dflt = dflt - "threads" $ IF .NOT. use_threads THEN dflt = dflt - "Thread" $ dflt = F$EDIT(dflt,"TRIM,COMPRESS") $! @@ -111,7 +111,7 @@ struct block_sub { AV * savearray; #endif /* USE_5005THREADS */ AV * argarray; - U16 olddepth; + long olddepth; U8 hasargs; U8 lval; /* XXX merge lval and hasargs? */ SV ** oldcurpad; @@ -119,7 +119,7 @@ struct block_sub { #define PUSHSUB(cx) \ cx->blk_sub.cv = cv; \ - cx->blk_sub.olddepth = (U16)CvDEPTH(cv); \ + cx->blk_sub.olddepth = CvDEPTH(cv); \ cx->blk_sub.hasargs = hasargs; \ cx->blk_sub.lval = PL_op->op_private & \ (OPpLVAL_INTRO|OPpENTERSUB_INARGS); @@ -130,7 +130,7 @@ Returns the stash of the CV. #define CvEVAL_on(cv) (CvUNIQUE_on(cv),SvFAKE_off(cv)) #define CvEVAL_off(cv) CvUNIQUE_off(cv) -/* BEGIN|INIT|END */ +/* BEGIN|CHECK|INIT|END */ #define CvSPECIAL(cv) (CvUNIQUE(cv) && SvFAKE(cv)) #define CvSPECIAL_on(cv) (CvUNIQUE_on(cv),SvFAKE_on(cv)) #define CvSPECIAL_off(cv) (CvUNIQUE_off(cv),SvFAKE_off(cv)) @@ -218,7 +218,7 @@ Perl_do_openn(pTHX_ GV *gv, register char *name, I32 len, int as_raw, if (ckWARN(WARN_IO)) Perl_warner(aTHX_ packWARN(WARN_IO), "Can't open a reference"); - SETERRNO(EINVAL, LIB$_INVARG); + SETERRNO(EINVAL, LIB_INVARG); goto say_false; } #endif /* USE_STDIO */ @@ -325,6 +325,7 @@ Perl_do_openn(pTHX_ GV *gv, register char *name, I32 len, int as_raw, } if (num_svs && (SvIOK(*svp) || (SvPOK(*svp) && looks_like_number(*svp)))) { fd = SvUV(*svp); + num_svs = 0; } else if (isDIGIT(*type)) { /*SUPPRESS 530*/ @@ -345,7 +346,7 @@ Perl_do_openn(pTHX_ GV *gv, register char *name, I32 len, int as_raw, } if (!thatio) { #ifdef EINVAL - SETERRNO(EINVAL,SS$_IVCHAN); + SETERRNO(EINVAL,SS_IVCHAN); #endif goto say_false; } @@ -536,12 +537,14 @@ Perl_do_openn(pTHX_ GV *gv, register char *name, I32 len, int as_raw, if ((IoTYPE(io) == IoTYPE_RDONLY) && (fp == PerlIO_stdout() || fp == PerlIO_stderr())) { Perl_warner(aTHX_ packWARN(WARN_IO), - "Filehandle STD%s opened only for input", - (fp == PerlIO_stdout()) ? "OUT" : "ERR"); + "Filehandle STD%s reopened as %s only for input", + ((fp == PerlIO_stdout()) ? "OUT" : "ERR"), + GvENAME(gv)); } else if ((IoTYPE(io) == IoTYPE_WRONLY) && fp == PerlIO_stdin()) { Perl_warner(aTHX_ packWARN(WARN_IO), - "Filehandle STDIN opened only for output"); + "Filehandle STDIN reopened as %s only for output", + GvENAME(gv)); } } @@ -954,7 +957,7 @@ Perl_do_close(pTHX_ GV *gv, bool not_implicit) gv = PL_argvgv; if (!gv || SvTYPE(gv) != SVt_PVGV) { if (not_implicit) - SETERRNO(EBADF,SS$_IVCHAN); + SETERRNO(EBADF,SS_IVCHAN); return FALSE; } io = GvIO(gv); @@ -962,7 +965,7 @@ Perl_do_close(pTHX_ GV *gv, bool not_implicit) if (not_implicit) { if (ckWARN(WARN_UNOPENED)) /* no check for closed here */ report_evil_fh(gv, io, PL_op->op_type); - SETERRNO(EBADF,SS$_IVCHAN); + SETERRNO(EBADF,SS_IVCHAN); } return FALSE; } @@ -1006,7 +1009,7 @@ Perl_io_close(pTHX_ IO *io, bool not_implicit) IoOFP(io) = IoIFP(io) = Nullfp; } else if (not_implicit) { - SETERRNO(EBADF,SS$_IVCHAN); + SETERRNO(EBADF,SS_IVCHAN); } return retval; @@ -1067,7 +1070,7 @@ Perl_do_tell(pTHX_ GV *gv) } if (ckWARN2(WARN_UNOPENED,WARN_CLOSED)) report_evil_fh(gv, io, PL_op->op_type); - SETERRNO(EBADF,RMS$_IFI); + SETERRNO(EBADF,RMS_IFI); return (Off_t)-1; } @@ -1086,7 +1089,7 @@ Perl_do_seek(pTHX_ GV *gv, Off_t pos, int whence) } if (ckWARN2(WARN_UNOPENED,WARN_CLOSED)) report_evil_fh(gv, io, PL_op->op_type); - SETERRNO(EBADF,RMS$_IFI); + SETERRNO(EBADF,RMS_IFI); return FALSE; } @@ -1100,7 +1103,7 @@ Perl_do_sysseek(pTHX_ GV *gv, Off_t pos, int whence) return PerlLIO_lseek(PerlIO_fileno(fp), pos, whence); if (ckWARN2(WARN_UNOPENED,WARN_CLOSED)) report_evil_fh(gv, io, PL_op->op_type); - SETERRNO(EBADF,RMS$_IFI); + SETERRNO(EBADF,RMS_IFI); return (Off_t)-1; } @@ -2089,7 +2092,7 @@ Perl_do_semop(pTHX_ SV **mark, SV **sp) opbuf = SvPV(opstr, opsize); if (opsize < 3 * SHORTSIZE || (opsize % (3 * SHORTSIZE))) { - SETERRNO(EINVAL,LIB$_INVARG); + SETERRNO(EINVAL,LIB_INVARG); return -1; } SETERRNO(0,0); @@ -2146,7 +2149,7 @@ Perl_do_shmio(pTHX_ I32 optype, SV **mark, SV **sp) if (shmctl(id, IPC_STAT, &shmds) == -1) return -1; if (mpos < 0 || msize < 0 || mpos + msize > shmds.shm_segsz) { - SETERRNO(EFAULT,SS$_ACCVIO); /* can't do as caller requested */ + SETERRNO(EFAULT,SS_ACCVIO); /* can't do as caller requested */ return -1; } shm = (char *)shmat(id, (char*)NULL, (optype == OP_SHMREAD) ? SHM_RDONLY : 0); @@ -2273,7 +2276,7 @@ Perl_start_glob (pTHX_ SV *tmpglob, IO *io) } if (cxt) (void)lib$find_file_end(&cxt); if (ok && sts != RMS$_NMF && - sts != RMS$_DNF && sts != RMS$_FNF) ok = 0; + sts != RMS$_DNF && sts != RMS_FNF) ok = 0; if (!ok) { if (!(sts & 1)) { SETERRNO((sts == RMS$_SYN ? EINVAL : EVMSERR),sts); @@ -608,10 +608,11 @@ Perl_do_trans(pTHX_ SV *sv) (void)SvPV(sv, len); if (!len) return 0; - if (!SvPOKp(sv)) - (void)SvPV_force(sv, len); - if (!(PL_op->op_private & OPpTRANS_IDENTICAL)) + if (!(PL_op->op_private & OPpTRANS_IDENTICAL)) { + if (!SvPOKp(sv)) + (void)SvPV_force(sv, len); (void)SvPOK_only_UTF8(sv); + } DEBUG_t( Perl_deb(aTHX_ "2.TBL\n")); @@ -843,13 +843,15 @@ Perl_do_magic_dump(pTHX_ I32 level, PerlIO *file, MAGIC *mg, I32 nest, I32 maxne if (mg->mg_flags) { Perl_dump_indent(aTHX_ level, file, " MG_FLAGS = 0x%02X\n", mg->mg_flags); - if (mg->mg_flags & MGf_TAINTEDDIR) + if (mg->mg_type == PERL_MAGIC_envelem && + mg->mg_flags & MGf_TAINTEDDIR) Perl_dump_indent(aTHX_ level, file, " TAINTEDDIR\n"); if (mg->mg_flags & MGf_REFCOUNTED) Perl_dump_indent(aTHX_ level, file, " REFCOUNTED\n"); if (mg->mg_flags & MGf_GSKIP) Perl_dump_indent(aTHX_ level, file, " GSKIP\n"); - if (mg->mg_flags & MGf_MINMATCH) + if (mg->mg_type == PERL_MAGIC_regex_global && + mg->mg_flags & MGf_MINMATCH) Perl_dump_indent(aTHX_ level, file, " MINMATCH\n"); } if (mg->mg_obj) { diff --git a/embedvar.h b/embedvar.h index 95e70b9960..dbc4d18fa0 100644 --- a/embedvar.h +++ b/embedvar.h @@ -210,6 +210,8 @@ #define PL_bufend (PERL_GET_INTERP->Ibufend) #define PL_bufptr (PERL_GET_INTERP->Ibufptr) #define PL_checkav (PERL_GET_INTERP->Icheckav) +#define PL_checkav_save (PERL_GET_INTERP->Icheckav_save) +#define PL_clocktick (PERL_GET_INTERP->Iclocktick) #define PL_collation_ix (PERL_GET_INTERP->Icollation_ix) #define PL_collation_name (PERL_GET_INTERP->Icollation_name) #define PL_collation_standard (PERL_GET_INTERP->Icollation_standard) @@ -512,6 +514,8 @@ #define PL_bufend (vTHX->Ibufend) #define PL_bufptr (vTHX->Ibufptr) #define PL_checkav (vTHX->Icheckav) +#define PL_checkav_save (vTHX->Icheckav_save) +#define PL_clocktick (vTHX->Iclocktick) #define PL_collation_ix (vTHX->Icollation_ix) #define PL_collation_name (vTHX->Icollation_name) #define PL_collation_standard (vTHX->Icollation_standard) @@ -817,6 +821,8 @@ #define PL_Ibufend PL_bufend #define PL_Ibufptr PL_bufptr #define PL_Icheckav PL_checkav +#define PL_Icheckav_save PL_checkav_save +#define PL_Iclocktick PL_clocktick #define PL_Icollation_ix PL_collation_ix #define PL_Icollation_name PL_collation_name #define PL_Icollation_standard PL_collation_standard @@ -1375,6 +1381,7 @@ #define PL_malloc_mutex (PL_Vars.Gmalloc_mutex) #define PL_op_mutex (PL_Vars.Gop_mutex) #define PL_patleave (PL_Vars.Gpatleave) +#define PL_ppid (PL_Vars.Gppid) #define PL_runops_dbg (PL_Vars.Grunops_dbg) #define PL_runops_std (PL_Vars.Grunops_std) #define PL_sharehook (PL_Vars.Gsharehook) @@ -1393,6 +1400,7 @@ #define PL_Gmalloc_mutex PL_malloc_mutex #define PL_Gop_mutex PL_op_mutex #define PL_Gpatleave PL_patleave +#define PL_Gppid PL_ppid #define PL_Grunops_dbg PL_runops_dbg #define PL_Grunops_std PL_runops_std #define PL_Gsharehook PL_sharehook diff --git a/ext/B/B.pm b/ext/B/B.pm index feca2e59d6..564b6758cc 100644 --- a/ext/B/B.pm +++ b/ext/B/B.pm @@ -21,7 +21,7 @@ require Exporter; amagic_generation perlstring walkoptree_slow walkoptree walkoptree_exec walksymtable parents comppadlist sv_undef compile_stats timing_info - begin_av init_av end_av regex_padav); + begin_av init_av check_av end_av regex_padav); sub OPf_KIDS (); use strict; @@ -236,7 +236,7 @@ sub walksymtable { package B::Section; my $output_fh; my %sections; - + sub new { my ($class, $section, $symtable, $default) = @_; $output_fh ||= FileHandle->new_tmpfile; @@ -244,7 +244,7 @@ sub walksymtable { $sections{$section} = $obj; return $obj; } - + sub get { my ($class, $section) = @_; return $sections{$section}; @@ -272,12 +272,12 @@ sub walksymtable { my $section = shift; return $section->[2]; } - + sub default { my $section = shift; return $section->[3]; } - + sub output { my ($section, $fh, $format) = @_; my $name = $section->name; @@ -324,6 +324,190 @@ reader knows a fair amount about perl's internals including such things as SVs, OPs and the internal symbol table and syntax tree of a program. +=head1 OVERVIEW + +The C<B> module contains a set of utility functions for querying the +current state of the Perl interpreter; typically these functions +return objects from the B::SV and B::OP classes, or their derived +classes. These classes in turn define methods for querying the +resulting objects about their own internal state. + +=head1 Utility Functions + +The C<B> module exports a variety of functions: some are simple +utility functions, others provide a Perl program with a way to +get an initial "handle" on an internal object. + +=head2 Functions Returning C<B::SV>, C<B::AV>, C<B::HV>, and C<B::CV> objects + +For descriptions of the class hierachy of these objects and the +methods that can be called on them, see below, L<"OVERVIEW OF +CLASSES"> and L<"SV-RELATED CLASSES">. + +=over 4 + +=item sv_undef + +Returns the SV object corresponding to the C variable C<sv_undef>. + +=item sv_yes + +Returns the SV object corresponding to the C variable C<sv_yes>. + +=item sv_no + +Returns the SV object corresponding to the C variable C<sv_no>. + +=item svref_2object(SVREF) + +Takes a reference to any Perl value, and turns the referred-to value +into an object in the appropriate B::OP-derived or B::SV-derived +class. Apart from functions such as C<main_root>, this is the primary +way to get an initial "handle" on an internal perl data structure +which can then be followed with the other access methods. + +=item amagic_generation + +Returns the SV object corresponding to the C variable C<amagic_generation>. + +=item C<init_av> + +Returns the AV object (i.e. in class B::AV) representing INIT blocks. + +=item check_av + +Returns the AV object (i.e. in class B::AV) representing CHECK blocks. + +=item begin_av + +Returns the AV object (i.e. in class B::AV) representing BEGIN blocks. + +=item end_av + +Returns the AV object (i.e. in class B::AV) representing END blocks. + +=item comppadlist + +Returns the AV object (i.e. in class B::AV) of the global comppadlist. + +=item regex_padav + +Only when perl was compiled with ithreads. + +=item C<main_cv> + +Return the (faked) CV corresponding to the main part of the Perl +program. + +=back + +=head2 Functions for Examining the Symbol Table + +=over 4 + +=item walksymtable(SYMREF, METHOD, RECURSE, PREFIX) + +Walk the symbol table starting at SYMREF and call METHOD on each +symbol (a B::GV object) visited. When the walk reaches package +symbols (such as "Foo::") it invokes RECURSE, passing in the symbol +name, and only recurses into the package if that sub returns true. + +PREFIX is the name of the SYMREF you're walking. + +For example: + + # Walk CGI's symbol table calling print_subs on each symbol. + # Recurse only into CGI::Util:: + walksymtable(\%CGI::, 'print_subs', sub { $_[0] eq 'CGI::Util::' }, + 'CGI::'); + +print_subs() is a B::GV method you have declared. Also see L<"B::GV +Methods">, below. + +=back + +=head2 Functions Returning C<B::OP> objects or for walking op trees + +For descriptions of the class hierachy of these objects and the +methods that can be called on them, see below, L<"OVERVIEW OF +CLASSES"> and L<"OP-RELATED CLASSES">. + +=over 4 + +=item main_root + +Returns the root op (i.e. an object in the appropriate B::OP-derived +class) of the main part of the Perl program. + +=item main_start + +Returns the starting op of the main part of the Perl program. + +=item walkoptree(OP, METHOD) + +Does a tree-walk of the syntax tree based at OP and calls METHOD on +each op it visits. Each node is visited before its children. If +C<walkoptree_debug> (see below) has been called to turn debugging on then +the method C<walkoptree_debug> is called on each op before METHOD is +called. + +=item walkoptree_debug(DEBUG) + +Returns the current debugging flag for C<walkoptree>. If the optional +DEBUG argument is non-zero, it sets the debugging flag to that. See +the description of C<walkoptree> above for what the debugging flag +does. + +=back + +=head2 Miscellaneous Utility Functions + +=over 4 + +=item ppname(OPNUM) + +Return the PP function name (e.g. "pp_add") of op number OPNUM. + +=item hash(STR) + +Returns a string in the form "0x..." representing the value of the +internal hash function used by perl on string STR. + +=item cast_I32(I) + +Casts I to the internal I32 type used by that perl. + +=item minus_c + +Does the equivalent of the C<-c> command-line option. Obviously, this +is only useful in a BEGIN block or else the flag is set too late. + +=item cstring(STR) + +Returns a double-quote-surrounded escaped version of STR which can +be used as a string in C source code. + +=item perlstring(STR) + +Returns a double-quote-surrounded escaped version of STR which can +be used as a string in Perl source code. + +=item class(OBJ) + +Returns the class of an object without the part of the classname +preceding the first C<"::">. This is used to turn C<"B::UNOP"> into +C<"UNOP"> for example. + +=item threadsv_names + +In a perl compiled for threads, this returns a list of the special +per-thread threadsv variables. + +=back + + + + =head1 OVERVIEW OF CLASSES The C structures used by Perl's internals to hold SV and OP @@ -331,9 +515,12 @@ information (PVIV, AV, HV, ..., OP, SVOP, UNOP, ...) are modelled on a class hierarchy and the C<B> module gives access to them via a true object hierarchy. Structure fields which point to other objects (whether types of SV or types of OP) are represented by the C<B> -module as Perl objects of the appropriate class. The bulk of the C<B> -module is the methods for accessing fields of these structures. Note -that all access is read-only: you cannot modify the internals by +module as Perl objects of the appropriate class. + +The bulk of the C<B> module is the methods for accessing fields of +these structures. + +Note that all access is read-only. You cannot modify the internals by using this module. =head2 SV-RELATED CLASSES @@ -341,15 +528,40 @@ using this module. B::IV, B::NV, B::RV, B::PV, B::PVIV, B::PVNV, B::PVMG, B::BM, B::PVLV, B::AV, B::HV, B::CV, B::GV, B::FM, B::IO. These classes correspond in the obvious way to the underlying C structures of similar names. The -inheritance hierarchy mimics the underlying C "inheritance". Access -methods correspond to the underlying C macros for field access, +inheritance hierarchy mimics the underlying C "inheritance": + + B::SV + | + +--------------+----------------------+ + | | | + B::PV B::IV B::RV + | \ / \ + | \ / \ + | B::PVIV B::NV + \ / + \____ __/ + \ / + B::PVNV + | + | + B::PVMG + | + +------+-----+----+------+-----+-----+ + | | | | | | | + B::PVLV B::BM B::AV B::GV B::HV B::CV B::IO + | + | + B::FM + + +Access methods correspond to the underlying C macros for field access, usually with the leading "class indication" prefix removed (Sv, Av, Hv, ...). The leading prefix is only left in cases where its removal would cause a clash in method name. For example, C<GvREFCNT> stays as-is since its abbreviation would clash with the "superclass" method C<REFCNT> (corresponding to the C function C<SvREFCNT>). -=head2 B::SV METHODS +=head2 B::SV Methods =over 4 @@ -359,7 +571,7 @@ C<REFCNT> (corresponding to the C function C<SvREFCNT>). =back -=head2 B::IV METHODS +=head2 B::IV Methods =over 4 @@ -387,7 +599,7 @@ unsigned. =back -=head2 B::NV METHODS +=head2 B::NV Methods =over 4 @@ -397,7 +609,7 @@ unsigned. =back -=head2 B::RV METHODS +=head2 B::RV Methods =over 4 @@ -405,7 +617,7 @@ unsigned. =back -=head2 B::PV METHODS +=head2 B::PV Methods =over 4 @@ -434,7 +646,7 @@ are always stored with a null terminator, and the length field =back -=head2 B::PVMG METHODS +=head2 B::PVMG Methods =over 4 @@ -444,7 +656,7 @@ are always stored with a null terminator, and the length field =back -=head2 B::MAGIC METHODS +=head2 B::MAGIC Methods =over 4 @@ -473,7 +685,7 @@ in the MAGIC. =back -=head2 B::PVLV METHODS +=head2 B::PVLV Methods =over 4 @@ -487,7 +699,7 @@ in the MAGIC. =back -=head2 B::BM METHODS +=head2 B::BM Methods =over 4 @@ -501,7 +713,7 @@ in the MAGIC. =back -=head2 B::GV METHODS +=head2 B::GV Methods =over 4 @@ -556,7 +768,7 @@ If you're working with globs at runtime, and need to disambiguate =back -=head2 B::IO METHODS +=head2 B::IO Methods =over 4 @@ -595,7 +807,7 @@ IoIFP($io) == PerlIO_stdin() ). =back -=head2 B::AV METHODS +=head2 B::AV Methods =over 4 @@ -611,7 +823,7 @@ IoIFP($io) == PerlIO_stdin() ). =back -=head2 B::CV METHODS +=head2 B::CV Methods =over 4 @@ -643,7 +855,7 @@ For constant subroutines, returns the constant SV returned by the subroutine. =back -=head2 B::HV METHODS +=head2 B::HV Methods =over 4 @@ -665,15 +877,32 @@ For constant subroutines, returns the constant SV returned by the subroutine. =head2 OP-RELATED CLASSES -B::OP, B::UNOP, B::BINOP, B::LOGOP, B::LISTOP, B::PMOP, -B::SVOP, B::PADOP, B::PVOP, B::CVOP, B::LOOP, B::COP. -These classes correspond in -the obvious way to the underlying C structures of similar names. The -inheritance hierarchy mimics the underlying C "inheritance". Access -methods correspond to the underlying C structre field names, with the -leading "class indication" prefix removed (op_). - -=head2 B::OP METHODS +C<B::OP>, C<B::UNOP>, C<B::BINOP>, C<B::LOGOP>, C<B::LISTOP>, C<B::PMOP>, +C<B::SVOP>, C<B::PADOP>, C<B::PVOP>, C<B::CVOP>, C<B::LOOP>, C<B::COP>. + +These classes correspond in the obvious way to the underlying C +structures of similar names. The inheritance hierarchy mimics the +underlying C "inheritance": + + B::OP + | + +---------------+--------+--------+------+ + | | | | | + B::UNOP B::SVOP B::PADOP B::CVOP B::COP + ,' `-. + / `--. + B::BINOP B::LOGOP + | + | + B::LISTOP + ,' `. + / \ + B::LOOP B::PMOP + +Access methods correspond to the underlying C structre field names, +with the leading "class indication" prefix (C<"op_">) removed. + +=head2 B::OP Methods =over 4 @@ -739,7 +968,7 @@ This returns the op description from the global C PL_op_desc array =back -=head2 B::PMOP METHODS +=head2 B::PMOP Methods =over 4 @@ -791,7 +1020,7 @@ Only when perl was compiled with ithreads. =back -=head2 B::LOOP METHODS +=head2 B::LOOP Methods =over 4 @@ -803,7 +1032,7 @@ Only when perl was compiled with ithreads. =back -=head2 B::COP METHODS +=head2 B::COP Methods =over 4 @@ -821,148 +1050,6 @@ Only when perl was compiled with ithreads. =back -=head1 FUNCTIONS EXPORTED BY C<B> - -The C<B> module exports a variety of functions: some are simple -utility functions, others provide a Perl program with a way to -get an initial "handle" on an internal object. - -=over 4 - -=item main_cv - -Return the (faked) CV corresponding to the main part of the Perl -program. - -=item init_av - -Returns the AV object (i.e. in class B::AV) representing INIT blocks. - -=item begin_av - -Returns the AV object (i.e. in class B::AV) representing BEGIN blocks. - -=item end_av - -Returns the AV object (i.e. in class B::AV) representing END blocks. - -=item main_root - -Returns the root op (i.e. an object in the appropriate B::OP-derived -class) of the main part of the Perl program. - -=item main_start - -Returns the starting op of the main part of the Perl program. - -=item comppadlist - -Returns the AV object (i.e. in class B::AV) of the global comppadlist. - -=item regex_padav - -Only when perl was compiled with ithreads. - -=item sv_undef - -Returns the SV object corresponding to the C variable C<sv_undef>. - -=item sv_yes - -Returns the SV object corresponding to the C variable C<sv_yes>. - -=item sv_no - -Returns the SV object corresponding to the C variable C<sv_no>. - -=item amagic_generation - -Returns the SV object corresponding to the C variable C<amagic_generation>. - -=item walkoptree(OP, METHOD) - -Does a tree-walk of the syntax tree based at OP and calls METHOD on -each op it visits. Each node is visited before its children. If -C<walkoptree_debug> (q.v.) has been called to turn debugging on then -the method C<walkoptree_debug> is called on each op before METHOD is -called. - -=item walkoptree_debug(DEBUG) - -Returns the current debugging flag for C<walkoptree>. If the optional -DEBUG argument is non-zero, it sets the debugging flag to that. See -the description of C<walkoptree> above for what the debugging flag -does. - -=item walksymtable(SYMREF, METHOD, RECURSE, PREFIX) - -Walk the symbol table starting at SYMREF and call METHOD on each -symbol (a B::GV object) visited. When the walk reaches package -symbols (such as "Foo::") it invokes RECURSE, passing in the symbol -name, and only recurses into the package if that sub returns true. - -PREFIX is the name of the SYMREF you're walking. - -For example... - - # Walk CGI's symbol table calling print_subs on each symbol. - # Only recurse into CGI::Util:: - walksymtable(\%CGI::, 'print_subs', sub { $_[0] eq 'CGI::Util::' }, - 'CGI::'); - -print_subs() is a B::GV method you have declared. - - -=item svref_2object(SV) - -Takes any Perl variable and turns it into an object in the -appropriate B::OP-derived or B::SV-derived class. Apart from functions -such as C<main_root>, this is the primary way to get an initial -"handle" on an internal perl data structure which can then be followed -with the other access methods. - -=item ppname(OPNUM) - -Return the PP function name (e.g. "pp_add") of op number OPNUM. - -=item hash(STR) - -Returns a string in the form "0x..." representing the value of the -internal hash function used by perl on string STR. - -=item cast_I32(I) - -Casts I to the internal I32 type used by that perl. - - -=item minus_c - -Does the equivalent of the C<-c> command-line option. Obviously, this -is only useful in a BEGIN block or else the flag is set too late. - - -=item cstring(STR) - -Returns a double-quote-surrounded escaped version of STR which can -be used as a string in C source code. - -=item perlstring(STR) - -Returns a double-quote-surrounded escaped version of STR which can -be used as a string in Perl source code. - -=item class(OBJ) - -Returns the class of an object without the part of the classname -preceding the first "::". This is used to turn "B::UNOP" into -"UNOP" for example. - -=item threadsv_names - -In a perl compiled for threads, this returns a list of the special -per-thread threadsv variables. - -=back =head1 AUTHOR diff --git a/ext/B/B.xs b/ext/B/B.xs index 83c9c4ad44..c9ce77c970 100644 --- a/ext/B/B.xs +++ b/ext/B/B.xs @@ -446,6 +446,7 @@ BOOT: #define B_main_cv() PL_main_cv #define B_init_av() PL_initav +#define B_check_av() PL_checkav_save #define B_begin_av() PL_beginav_save #define B_end_av() PL_endav #define B_main_root() PL_main_root @@ -463,6 +464,9 @@ B::AV B_init_av() B::AV +B_check_av() + +B::AV B_begin_av() B::AV @@ -1073,6 +1077,15 @@ MODULE = B PACKAGE = B::MAGIC PREFIX = Mg B::MAGIC MgMOREMAGIC(mg) B::MAGIC mg + CODE: + if( MgMOREMAGIC(mg) ) { + RETVAL = MgMOREMAGIC(mg); + } + else { + XSRETURN_UNDEF; + } + OUTPUT: + RETVAL U16 MgPRIVATE(mg) diff --git a/ext/B/B/C.pm b/ext/B/B/C.pm index 8d71bb2760..37099125e5 100644 --- a/ext/B/B/C.pm +++ b/ext/B/B/C.pm @@ -1619,6 +1619,15 @@ EOT } EOT } + else { + print <<EOT; + if ((tmpgv = gv_fetchpv("0",TRUE, SVt_PV))) {/* $0 */ + tmpsv = GvSV(tmpgv); + sv_setpv(tmpsv, argv[0]); + SvSETMAGIC(tmpsv); + } +EOT + } print <<'EOT'; if ((tmpgv = gv_fetchpv("\030",TRUE, SVt_PV))) {/* $^X */ diff --git a/ext/B/B/Deparse.pm b/ext/B/B/Deparse.pm index 924f4366d6..fd989a28b7 100644 --- a/ext/B/B/Deparse.pm +++ b/ext/B/B/Deparse.pm @@ -553,9 +553,10 @@ sub compile { print qq(BEGIN { \$/ = $fs; \$\\ = $bs; }\n); } my @BEGINs = B::begin_av->isa("B::AV") ? B::begin_av->ARRAY : (); + my @CHECKs = B::check_av->isa("B::AV") ? B::check_av->ARRAY : (); my @INITs = B::init_av->isa("B::AV") ? B::init_av->ARRAY : (); my @ENDs = B::end_av->isa("B::AV") ? B::end_av->ARRAY : (); - for my $block (@BEGINs, @INITs, @ENDs) { + for my $block (@BEGINs, @CHECKs, @INITs, @ENDs) { $self->todo($block, 0); } $self->stash_subs(); @@ -2415,7 +2416,7 @@ BEGIN { eval "sub OP_LIST () {" . opnumber("list") . "}" } sub pp_null { my $self = shift; - my($op, $cx) = @_; + my($op, $cx, $flags) = @_; if (class($op) eq "OP") { # old value is lost return $self->{'ex_const'} if $op->targ == OP_CONST; @@ -2438,7 +2439,12 @@ sub pp_null { . $self->deparse($op->first->sibling, 20), $cx, 20); } elsif ($op->flags & OPf_SPECIAL && $cx == 0 && !$op->targ) { - return "do {\n\t". $self->deparse($op->first, $cx) ."\n\b};"; + if ($flags) { + return $self->deparse($op->first, $cx); + } + else { + return "do {\n\t". $self->deparse($op->first, $cx) ."\n\b};"; + } } elsif (!null($op->first->sibling) and $op->first->sibling->name eq "null" and class($op->first->sibling) eq "UNOP" and @@ -3010,7 +3016,7 @@ sub re_uninterp { | \\[uUlLQE] ) - /length($4) ? "$1$2$4" : "$1$2\\$3"/xeg; + /defined($4) && length($4) ? "$1$2$4" : "$1$2\\$3"/xeg; return $str; } @@ -3038,7 +3044,7 @@ sub re_uninterp_extended { | \\[uUlLQE] ) - /length($4) ? "$1$2$4" : "$1$2\\$3"/xeg; + /defined($4) && length($4) ? "$1$2$4" : "$1$2\\$3"/xeg; return $str; } @@ -3732,7 +3738,7 @@ sub pp_subst { $flags .= "e"; } if ($op->pmflags & PMf_EVAL) { - $repl = $self->deparse($repl, 0); + $repl = $self->deparse($repl, 0, 1); } else { $repl = $self->dq($repl); } diff --git a/ext/B/Makefile.PL b/ext/B/Makefile.PL index d39d3b5f9c..f38adb0ef8 100644 --- a/ext/B/Makefile.PL +++ b/ext/B/Makefile.PL @@ -28,7 +28,7 @@ package MY; sub post_constants { "\nLIBS = $Config::Config{libs}\n" -} +} sub upupfile { File::Spec->catfile(File::Spec->updir, @@ -40,9 +40,9 @@ sub MY::postamble { my $cop_h = upupfile('cop.h'); my $noecho = shift->{NOECHO}; " -B\$(OBJ_EXT) : defsubs.h +B\$(OBJ_EXT) : defsubs.h -defsubs.h :: $op_h $cop_h +defsubs.h :: $op_h $cop_h defsubs_h.PL $noecho \$(NOOP) -" +" } diff --git a/ext/B/t/b.t b/ext/B/t/b.t index f21f4891e4..45250e2fb2 100755 --- a/ext/B/t/b.t +++ b/ext/B/t/b.t @@ -13,15 +13,9 @@ BEGIN { $| = 1; use warnings; use strict; -use Config; +use Test::More tests => 5; -print "1..2\n"; - -my $test = 1; - -sub ok { print "ok $test\n"; $test++ } - -use B; +BEGIN { use_ok( 'B' ); } package Testing::Symtable; @@ -55,9 +49,18 @@ my @syms = map { 'Testing::Symtable::'.$_ } qw(This That wibble moo car push @syms, "Testing::Symtable::Foo::yarrow"; # Make sure we hit all the expected symbols. -print "not " unless join('', sort @syms) eq join('', sort keys %Subs); -ok; +ok( join('', sort @syms) eq join('', sort keys %Subs), 'all symbols found' ); # Make sure we only hit them each once. -print "not " unless !grep $_ != 1, values %Subs; -ok; +ok( (!grep $_ != 1, values %Subs), '...and found once' ); + +# Tests for MAGIC / MOREMAGIC +ok( B::svref_2object(\$.)->MAGIC->TYPE eq "\0", '$. has \0 magic' ); +{ + my $e = ''; + local $SIG{__DIE__} = sub { $e = $_[0] }; + # Used to dump core, bug #16828 + eval { B::svref_2object(\$.)->MAGIC->MOREMAGIC->TYPE; }; + like( $e, qr/Can't call method "TYPE" on an undefined value/, + '$. has no more magic' ); +} diff --git a/ext/B/t/deparse.t b/ext/B/t/deparse.t index 1c148e602a..ce133d0dff 100644 --- a/ext/B/t/deparse.t +++ b/ext/B/t/deparse.t @@ -15,7 +15,7 @@ use warnings; use strict; use Config; -print "1..17\n"; +print "1..18\n"; use B::Deparse; my $deparse = B::Deparse->new() or print "not "; @@ -193,3 +193,6 @@ $_ .= <ARGV> . <$foo>; #### # 14 my $foo = "Ab\x{100}\200\x{200}\377Cd\000Ef\x{1000}\cA\x{2000}\cZ"; +#### +# 15 +s/x/'y';/e; diff --git a/ext/DB_File/Changes b/ext/DB_File/Changes index 3351542eee..c9f33b2f9f 100644 --- a/ext/DB_File/Changes +++ b/ext/DB_File/Changes @@ -1,226 +1,216 @@ -0.1 +1.806 22nd October 2002 - First Release. + * Fixed problem when trying to build with a multi-threaded perl. -0.2 + * Tidied up the recursion detetion code. - When DB_File is opening a database file it no longer terminates the - process if dbopen returned an error. This allows file protection - errors to be caught at run time. Thanks to Judith Grass - <grass@cybercash.com> for spotting the bug. + * merged core patch 17844 - missing dTHX declarations. -0.3 + * merged core patch 17838 - Added prototype support for multiple btree compare callbacks. +1.805 1st September 2002 -1.0 + * Added support to allow DB_File to build with Berkeley DB 4.1.X - DB_File has been in use for over a year. To reflect that, the - version number has been incremented to 1.0. + * Tightened up the test harness to test that calls to untie don't generate + the "untie attempted while %d inner references still exist" warning. - Added complete support for multiple concurrent callbacks. + * added code to guard against calling the callbacks (compare,hash & prefix) + recursively. - Using the push method on an empty list didn't work properly. This - has been fixed. + * pasing undef for the flags and/or mode when opening a database could cause + a "Use of uninitialized value in subroutine entry" warning. Now silenced. -1.01 + * DBM filter code beefed up to cope with read-only $_. - Fixed a core dump problem with SunOS. +1.804 2nd June 2002 - The return value from TIEHASH wasn't set to NULL when dbopen - returned an error. + * Perl core patch 14939 added a new warning to "splice". This broke the + db-recno test harness. Fixed. -1.02 + * merged core patches 16502 & 16540. - Merged OS/2 specific code into DB_File.xs +1.803 1st March 2002 - Removed some redundant code in DB_File.xs. + * Fixed a problem with db-btree.t where it complained about an "our" + variable redeclaation. - Documentation update. + * FETCH, STORE & DELETE don't map the flags parameter into the + equivalent Berkeley DB function anymore. - Allow negative subscripts with RECNO interface. +1.802 6th January 2002 - Changed the default flags from O_RDWR to O_CREAT|O_RDWR. + * The message about some test failing in db-recno.t had the wrong test + numbers. Fixed. - The example code which showed how to lock a database needed a call - to sync added. Without it the resultant database file was empty. + * merged core patch 13942. - Added get_dup method. +1.801 26th November 2001 -1.03 + * Fixed typo in Makefile.PL - Documentation update. + * Added "clean" attribute to Makefile.PL + +1.800 23rd November 2001 - DB_File now imports the constants (O_RDWR, O_CREAT etc.) from Fcntl - automatically. + * use pport.h for perl backward compatability code. - The standard hash function exists is now supported. + * use new ExtUtils::Constant module to generate XS constants. - Modified the behavior of get_dup. When it returns an associative - array, the value is the count of the number of matching BTREE - values. + * upgrade Makefile.PL upgrade/downgrade code to toggle "our" with + "use vars" -1.04 +1.79 22nd October 2001 - Minor documentation changes. + * Added a "local $SIG{__DIE__}" inside the eval that checks for + the presence of XSLoader s suggested by Andrew Hryckowin. - Fixed a bug in hash_cb. Patches supplied by Dave Hammen, - <hammen@gothamcity.jsc.nasa.govt>. + * merged core patch 12277. - Fixed a bug with the constructors for DB_File::HASHINFO, - DB_File::BTREEINFO and DB_File::RECNOINFO. Also tidied up the - constructors to make them -w clean. + * Changed NEXTKEY to not initialise the input key. It isn't used anyway. - Reworked part of the test harness to be more locale friendly. +1.79 22nd October 2001 -1.05 + * Fixed test harness for cygwin - Made all scripts in the documentation strict and -w clean. +1.78 30th July 2001 - Added logic to DB_File.xs to allow the module to be built after - Perl is installed. + * the test in Makefile.PL for AIX used -plthreads. Should have been + -lpthreads -1.06 + * merged Core patches + 10372, 10335, 10372, 10534, 10549, 10643, 11051, 11194, 11432 - Minor namespace cleanup: Localized PrintBtree. + * added documentation patch regarding duplicate keys from Andrew Johnson -1.07 - Fixed bug with RECNO, where bval wasn't defaulting to "\n". +1.77 26th April 2001 -1.08 + * AIX is reported to need -lpthreads, so Makefile.PL now checks for + AIX and adds it to the link options. - Documented operation of bval. + * Minor documentation updates. -1.09 + * Merged Core patch 9176 - Minor bug fix in DB_File::HASHINFO, DB_File::RECNOINFO and - DB_File::BTREEINFO. + * Added a patch from Edward Avis that adds support for splice with + recno databases. - Changed default mode to 0666. + * Modified Makefile.PL to only enable the warnings pragma if using perl + 5.6.1 or better. -1.10 +1.76 15th January 2001 - Fixed fd method so that it still returns -1 for in-memory files - when db 1.86 is used. + * Added instructions for using LD_PRELOAD to get Berkeley DB 2.x to work + with DB_File on Linux. Thanks to Norbert Bollow for sending details of + this approach. -1.11 - Documented the untie gotcha. +1.75 17th December 2000 -1.12 + * Fixed perl core patch 7703 - Documented the incompatibility with version 2 of Berkeley DB. + * Added suppport to allow DB_File to be built with Berkeley DB 3.2 -- + btree_compare, btree_prefix and hash_cb needed to be changed. -1.13 + * Updated dbinfo to support Berkeley DB 3.2 file format changes. - Minor changes to DB_FIle.xs and DB_File.pm -1.14 +1.74 10th December 2000 - Made it illegal to tie an associative array to a RECNO database and - an ordinary array to a HASH or BTREE database. + * A "close" call in DB_File.xs needed parenthesised to stop win32 from + thinking it was one of its macros. -1.15 + * Updated dbinfo to support Berkeley DB 3.1 file format changes. - Patch from Gisle Aas <gisle@aas.no> to suppress "use of undefined - value" warning with db_get and db_seq. + * DB_File.pm & the test hasness now use the warnings pragma (when + available). - Patch from Gisle Aas <gisle@aas.no> to make DB_File export only the - O_* constants from Fcntl. + * Included Perl core patch 7703 -- size argument for hash_cb is different + for Berkeley DB 3.x - Removed the DESTROY method from the DB_File::HASHINFO module. + * Included Perl core patch 7801 -- Give __getBerkeleyDBInfo the ANSI C + treatment. - Previously DB_File hard-wired the class name of any object that it - created to "DB_File". This makes sub-classing difficult. Now - DB_File creats objects in the namespace of the package it has been - inherited into. + * @a = () produced the warning 'Argument "" isn't numeric in entersub' + This has been fixed. Thanks to Edward Avis for spotting this bug. + * Added note about building under Linux. Included patches. -1.16 + * Included Perl core patch 8068 -- fix for bug 20001013.009 + When run with warnings enabled "$hash{XX} = undef " produced an + "Uninitialized value" warning. This has been fixed. - A harmless looking tab was causing Makefile.PL to fail on AIX 3.2.5 +1.73 31st May 2000 - Small fix for the AIX strict C compiler XLC which doesn't like - __attribute__ being defined via proto.h and redefined via db.h. Fix - courtesy of Jarkko Hietaniemi. + * Added support in version.c for building with threaded Perl. -1.50 + * Berkeley DB 3.1 has reenabled support for null keys. The test + harness has been updated to reflect this. - DB_File can now build with either DB 1.x or 2.x, but not both at - the same time. +1.72 16th January 2000 -1.51 + * Added hints/sco.pl - Fixed the test harness so that it doesn't expect DB_File to have - been installed by the main Perl build. + * The module will now use XSLoader when it is available. When it + isn't it will use DynaLoader. + * The locking section in DB_File.pm has been discredited. Many thanks + to David Harris for spotting the underlying problem, contributing + the updates to the documentation and writing DB_File::Lock (available + on CPAN). - Fixed a bug in mapping 1.x O_RDONLY flag to 2.x DB_RDONLY equivalent +1.71 7th September 1999 -1.52 + * Fixed a bug that prevented 1.70 from compiling under win32 - Patch from Nick Ing-Simmons now allows DB_File to build on NT. - Merged 1.15 patch. + * Updated to support Berkeley DB 3.x -1.53 + * Updated dbinfo for Berkeley DB 3.x file formats. - Added DB_RENUMBER to flags for recno. +1.70 4th August 1999 -1.54 + * Initialise $DB_File::db_ver and $DB_File::db_version with + GV_ADD|GV_ADDMULT -- bug spotted by Nick Ing-Simmons. - Fixed a small bug in the test harness when run under win32 - The emulation of fd when useing DB 2.x was busted. + * Added a BOOT check to test for equivalent versions of db.h & + libdb.a/so. -1.55 - Merged 1.16 changes. +1.69 3rd August 1999 -1.56 - Documented the Solaris 2.5 mutex bug + * fixed a bug in push -- DB_APPEND wasn't working properly. -1.57 - If Perl has been compiled with Threads support,the symbol op will be - defined. This clashes with a field name in db.h, so it needs to be - #undef'ed before db.h is included. + * Fixed the R_SETCURSOR bug introduced in 1.68 -1.58 - Tied Array support was enhanced in Perl 5.004_57. DB_File now - supports PUSH,POP,SHIFT,UNSHIFT & STORESIZE. + * Added a new Perl variable $DB_File::db_ver + +1.68 22nd July 1999 - Fixed a problem with the use of sv_setpvn. When the size is - specified as 0, it does a strlen on the data. This was ok for DB - 1.x, but isn't for DB 2.x. + * Merged changes from 5.005_58 -1.59 - Updated the license section. + * Fixed a bug in R_IBEFORE & R_IAFTER procesing in Berkeley DB + 2 databases. - Berkeley DB 2.4.10 disallows zero length keys. Tests 32 & 42 in - db-btree.t and test 27 in db-hash.t failed because of this change. - Those tests have been zapped. + * Added some of the examples in the POD into the test harness. - Added dbinfo to the distribution. +1.67 6th June 1999 -1.60 - Changed the test to check for full tied array support + * Added DBM Filter documentation to DB_File.pm -1.61 19th November 1998 + * Fixed DBM Filter code to work with 5.004 - Added a note to README about how to build Berkeley DB 2.x when - using HP-UX. - Minor modifications to get the module to build with DB 2.5.x - Fixed a typo in the definition of O_RDONLY, courtesy of Mark Kettenis. + * A few instances of newSVpvn were used in 1.66. This isn't available in + Perl 5.004_04 or earlier. Replaced with newSVpv. -1.62 30th November 1998 +1.66 15th March 1999 - Added hints/dynixptx.pl. - Fixed typemap -- 1.61 used PL_na instead of na + * Added DBM Filter code -1.63 19th December 1998 +1.65 6th March 1999 - * Fix to allow DB 2.6.x to build with DB_File - * Documentation updated to use push,pop etc in the RECNO example & - to include the find_dup & del_dup methods. + * Fixed a bug in the recno PUSH logic. + * The BOOT version check now needs 2.3.4 when using Berkeley DB version 2 1.64 21st February 1999 @@ -229,189 +219,226 @@ mapping problem with O_RDONLY on the Hurd * Updated the message that db-recno.t prints when tests 51, 53 or 55 fail. -1.65 6th March 1999 +1.63 19th December 1998 - * Fixed a bug in the recno PUSH logic. - * The BOOT version check now needs 2.3.4 when using Berkeley DB version 2 + * Fix to allow DB 2.6.x to build with DB_File + * Documentation updated to use push,pop etc in the RECNO example & + to include the find_dup & del_dup methods. -1.66 15th March 1999 +1.62 30th November 1998 - * Added DBM Filter code + Added hints/dynixptx.pl. + Fixed typemap -- 1.61 used PL_na instead of na -1.67 6th June 1999 +1.61 19th November 1998 - * Added DBM Filter documentation to DB_File.pm + Added a note to README about how to build Berkeley DB 2.x when + using HP-UX. + Minor modifications to get the module to build with DB 2.5.x + Fixed a typo in the definition of O_RDONLY, courtesy of Mark Kettenis. - * Fixed DBM Filter code to work with 5.004 +1.60 + Changed the test to check for full tied array support - * A few instances of newSVpvn were used in 1.66. This isn't available in - Perl 5.004_04 or earlier. Replaced with newSVpv. +1.59 + Updated the license section. -1.68 22nd July 1999 + Berkeley DB 2.4.10 disallows zero length keys. Tests 32 & 42 in + db-btree.t and test 27 in db-hash.t failed because of this change. + Those tests have been zapped. - * Merged changes from 5.005_58 + Added dbinfo to the distribution. - * Fixed a bug in R_IBEFORE & R_IAFTER procesing in Berkeley DB - 2 databases. +1.58 + Tied Array support was enhanced in Perl 5.004_57. DB_File now + supports PUSH,POP,SHIFT,UNSHIFT & STORESIZE. - * Added some of the examples in the POD into the test harness. + Fixed a problem with the use of sv_setpvn. When the size is + specified as 0, it does a strlen on the data. This was ok for DB + 1.x, but isn't for DB 2.x. -1.69 3rd August 1999 +1.57 + If Perl has been compiled with Threads support,the symbol op will be + defined. This clashes with a field name in db.h, so it needs to be + #undef'ed before db.h is included. - * fixed a bug in push -- DB_APPEND wasn't working properly. +1.56 + Documented the Solaris 2.5 mutex bug - * Fixed the R_SETCURSOR bug introduced in 1.68 +1.55 + Merged 1.16 changes. - * Added a new Perl variable $DB_File::db_ver - -1.70 4th August 1999 +1.54 - * Initialise $DB_File::db_ver and $DB_File::db_version with - GV_ADD|GV_ADDMULT -- bug spotted by Nick Ing-Simmons. + Fixed a small bug in the test harness when run under win32 + The emulation of fd when useing DB 2.x was busted. - * Added a BOOT check to test for equivalent versions of db.h & - libdb.a/so. +1.53 -1.71 7th September 1999 + Added DB_RENUMBER to flags for recno. - * Fixed a bug that prevented 1.70 from compiling under win32 +1.52 - * Updated to support Berkeley DB 3.x + Patch from Nick Ing-Simmons now allows DB_File to build on NT. + Merged 1.15 patch. - * Updated dbinfo for Berkeley DB 3.x file formats. +1.51 -1.72 16th January 2000 + Fixed the test harness so that it doesn't expect DB_File to have + been installed by the main Perl build. - * Added hints/sco.pl - * The module will now use XSLoader when it is available. When it - isn't it will use DynaLoader. + Fixed a bug in mapping 1.x O_RDONLY flag to 2.x DB_RDONLY equivalent - * The locking section in DB_File.pm has been discredited. Many thanks - to David Harris for spotting the underlying problem, contributing - the updates to the documentation and writing DB_File::Lock (available - on CPAN). +1.50 -1.73 31st May 2000 + DB_File can now build with either DB 1.x or 2.x, but not both at + the same time. - * Added support in version.c for building with threaded Perl. +1.16 - * Berkeley DB 3.1 has reenabled support for null keys. The test - harness has been updated to reflect this. + A harmless looking tab was causing Makefile.PL to fail on AIX 3.2.5 -1.74 10th December 2000 + Small fix for the AIX strict C compiler XLC which doesn't like + __attribute__ being defined via proto.h and redefined via db.h. Fix + courtesy of Jarkko Hietaniemi. - * A "close" call in DB_File.xs needed parenthesised to stop win32 from - thinking it was one of its macros. +1.15 - * Updated dbinfo to support Berkeley DB 3.1 file format changes. + Patch from Gisle Aas <gisle@aas.no> to suppress "use of undefined + value" warning with db_get and db_seq. - * DB_File.pm & the test hasness now use the warnings pragma (when - available). + Patch from Gisle Aas <gisle@aas.no> to make DB_File export only the + O_* constants from Fcntl. - * Included Perl core patch 7703 -- size argument for hash_cb is different - for Berkeley DB 3.x + Removed the DESTROY method from the DB_File::HASHINFO module. - * Included Perl core patch 7801 -- Give __getBerkeleyDBInfo the ANSI C - treatment. + Previously DB_File hard-wired the class name of any object that it + created to "DB_File". This makes sub-classing difficult. Now + DB_File creats objects in the namespace of the package it has been + inherited into. - * @a = () produced the warning 'Argument "" isn't numeric in entersub' - This has been fixed. Thanks to Edward Avis for spotting this bug. - * Added note about building under Linux. Included patches. +1.14 - * Included Perl core patch 8068 -- fix for bug 20001013.009 - When run with warnings enabled "$hash{XX} = undef " produced an - "Uninitialized value" warning. This has been fixed. + Made it illegal to tie an associative array to a RECNO database and + an ordinary array to a HASH or BTREE database. -1.75 17th December 2000 +1.13 - * Fixed perl core patch 7703 + Minor changes to DB_FIle.xs and DB_File.pm - * Added suppport to allow DB_File to be built with Berkeley DB 3.2 -- - btree_compare, btree_prefix and hash_cb needed to be changed. +1.12 - * Updated dbinfo to support Berkeley DB 3.2 file format changes. + Documented the incompatibility with version 2 of Berkeley DB. +1.11 -1.76 15th January 2001 + Documented the untie gotcha. - * Added instructions for using LD_PRELOAD to get Berkeley DB 2.x to work - with DB_File on Linux. Thanks to Norbert Bollow for sending details of - this approach. +1.10 + Fixed fd method so that it still returns -1 for in-memory files + when db 1.86 is used. -1.77 26th April 2001 +1.09 - * AIX is reported to need -lpthreads, so Makefile.PL now checks for - AIX and adds it to the link options. + Minor bug fix in DB_File::HASHINFO, DB_File::RECNOINFO and + DB_File::BTREEINFO. - * Minor documentation updates. + Changed default mode to 0666. - * Merged Core patch 9176 +1.08 - * Added a patch from Edward Avis that adds support for splice with - recno databases. + Documented operation of bval. - * Modified Makefile.PL to only enable the warnings pragma if using perl - 5.6.1 or better. +1.07 -1.78 30th July 2001 + Fixed bug with RECNO, where bval wasn't defaulting to "\n". - * the test in Makefile.PL for AIX used -plthreads. Should have been - -lpthreads +1.06 - * merged Core patches - 10372, 10335, 10372, 10534, 10549, 10643, 11051, 11194, 11432 + Minor namespace cleanup: Localized PrintBtree. - * added documentation patch regarding duplicate keys from Andrew Johnson +1.05 -1.79 22nd October 2001 + Made all scripts in the documentation strict and -w clean. - * Added a "local $SIG{__DIE__}" inside the eval that checks for - the presence of XSLoader s suggested by Andrew Hryckowin. + Added logic to DB_File.xs to allow the module to be built after + Perl is installed. - * merged core patch 12277. +1.04 - * Changed NEXTKEY to not initialise the input key. It isn't used anyway. + Minor documentation changes. -1.79 22nd October 2001 + Fixed a bug in hash_cb. Patches supplied by Dave Hammen, + <hammen@gothamcity.jsc.nasa.govt>. - * Fixed test harness for cygwin + Fixed a bug with the constructors for DB_File::HASHINFO, + DB_File::BTREEINFO and DB_File::RECNOINFO. Also tidied up the + constructors to make them -w clean. + Reworked part of the test harness to be more locale friendly. -1.800 23rd November 2001 +1.03 - * use pport.h for perl backward compatability code. + Documentation update. - * use new ExtUtils::Constant module to generate XS constants. + DB_File now imports the constants (O_RDWR, O_CREAT etc.) from Fcntl + automatically. - * upgrade Makefile.PL upgrade/downgrade code to toggle "our" with - "use vars" + The standard hash function exists is now supported. -1.801 26th November 2001 + Modified the behavior of get_dup. When it returns an associative + array, the value is the count of the number of matching BTREE + values. - * Fixed typo in Makefile.PL +1.02 - * Added "clean" attribute to Makefile.PL - -1.802 6th January 2002 + Merged OS/2 specific code into DB_File.xs - * The message about some test failing in db-recno.t had the wrong test - numbers. Fixed. + Removed some redundant code in DB_File.xs. - * merged core patch 13942. + Documentation update. -1.803 1st March 2002 + Allow negative subscripts with RECNO interface. - * Fixed a problem with db-btree.t where it complained about an "our" - variable redeclaation. + Changed the default flags from O_RDWR to O_CREAT|O_RDWR. - * FETCH, STORE & DELETE don't map the flags parameter into the - equivalent Berkeley DB function anymore. + The example code which showed how to lock a database needed a call + to sync added. Without it the resultant database file was empty. -1.804 2nd March 2002 + Added get_dup method. - * Perl core patch 14939 added a new warning to "splice". This broke the - db-recno test harness. Fixed. +1.01 + + Fixed a core dump problem with SunOS. + + The return value from TIEHASH wasn't set to NULL when dbopen + returned an error. + +1.0 + + DB_File has been in use for over a year. To reflect that, the + version number has been incremented to 1.0. + + Added complete support for multiple concurrent callbacks. + + Using the push method on an empty list didn't work properly. This + has been fixed. + +0.3 + + Added prototype support for multiple btree compare callbacks. + +0.2 + + When DB_File is opening a database file it no longer terminates the + process if dbopen returned an error. This allows file protection + errors to be caught at run time. Thanks to Judith Grass + <grass@cybercash.com> for spotting the bug. + +0.1 + + First Release. diff --git a/ext/DB_File/DB_File.pm b/ext/DB_File/DB_File.pm index df189eb1cd..240b42ea26 100644 --- a/ext/DB_File/DB_File.pm +++ b/ext/DB_File/DB_File.pm @@ -1,8 +1,8 @@ # DB_File.pm -- Perl 5 interface to Berkeley DB # # written by Paul Marquess (Paul.Marquess@btinternet.com) -# last modified 1st March 2002 -# version 1.804 +# last modified 22nd October 2002 +# version 1.806 # # Copyright (c) 1995-2002 Paul Marquess. All rights reserved. # This program is free software; you can redistribute it and/or @@ -32,8 +32,13 @@ sub TIEHASH { my $pkg = shift ; - bless { VALID => { map {$_, 1} - qw( bsize ffactor nelem cachesize hash lorder) + bless { VALID => { + bsize => 1, + ffactor => 1, + nelem => 1, + cachesize => 1, + hash => 2, + lorder => 1, }, GOT => {} }, $pkg ; @@ -58,8 +63,12 @@ sub STORE my $key = shift ; my $value = shift ; - if ( exists $self->{VALID}{$key} ) + my $type = $self->{VALID}{$key}; + + if ( $type ) { + croak "Key '$key' not associated with a code reference" + if $type == 2 && !ref $value && ref $value ne 'CODE'; $self->{GOT}{$key} = $value ; return ; } @@ -132,9 +141,15 @@ sub TIEHASH { my $pkg = shift ; - bless { VALID => { map {$_, 1} - qw( flags cachesize maxkeypage minkeypage psize - compare prefix lorder ) + bless { VALID => { + flags => 1, + cachesize => 1, + maxkeypage => 1, + minkeypage => 1, + psize => 1, + compare => 2, + prefix => 2, + lorder => 1, }, GOT => {}, }, $pkg ; @@ -150,7 +165,7 @@ our ($db_version, $use_XSLoader, $splice_end_array); use Carp; -$VERSION = "1.804" ; +$VERSION = "1.806" ; { local $SIG{__WARN__} = sub {$splice_end_array = "@_";}; @@ -248,6 +263,9 @@ sub tie_hash_or_array $arg[4] = tied %{ $arg[4] } if @arg >= 5 && ref $arg[4] && $arg[4] =~ /=HASH/ && tied %{ $arg[4] } ; + $arg[2] = O_CREAT()|O_RDWR() if @arg >=3 && ! defined $arg[2]; + $arg[3] = 0666 if @arg >=4 && ! defined $arg[3]; + # make recno in Berkeley DB version 2 work like recno in version 1. if ($db_version > 1 and defined $arg[4] and $arg[4] =~ /RECNO/ and $arg[1] and ! -e $arg[1]) { diff --git a/ext/DB_File/DB_File.xs b/ext/DB_File/DB_File.xs index fc2f63e12a..6c5d03b4d9 100644 --- a/ext/DB_File/DB_File.xs +++ b/ext/DB_File/DB_File.xs @@ -3,8 +3,8 @@ DB_File.xs -- Perl 5 interface to Berkeley DB written by Paul Marquess <Paul.Marquess@btinternet.com> - last modified 1st March 2002 - version 1.803 + last modified 22nd October 2002 + version 1.806 All comments/suggestions/problems are welcome @@ -101,6 +101,11 @@ 1.802 - No change to DB_File.xs 1.803 - FETCH, STORE & DELETE don't map the flags parameter into the equivalent Berkeley DB function anymore. + 1.804 - no change. + 1.805 - recursion detection added to the callbacks + Support for 4.1.X added. + Filter code can now cope with read-only $_ + 1.806 - recursion detection beefed up. */ @@ -162,7 +167,6 @@ #include <fcntl.h> /* #define TRACE */ -#define DBM_FILTERING #ifdef TRACE # define Trace(x) printf x @@ -183,6 +187,10 @@ # define AT_LEAST_DB_3_2 #endif +#if DB_VERSION_MAJOR > 4 || (DB_VERSION_MAJOR == 4 && DB_VERSION_MINOR >= 1) +# define AT_LEAST_DB_4_1 +#endif + /* map version 2 features & constants onto their version 1 equivalent */ #ifdef DB_Prefix_t @@ -335,8 +343,8 @@ typedef union INFO { #define db_get(db, key, value, flags) ((db->dbp)->get)(db->dbp, TXN &key, &value, flags) #ifdef DB_VERSION_MAJOR -#define db_DESTROY(db) ( db->cursor->c_close(db->cursor),\ - (db->dbp->close)(db->dbp, 0) ) +#define db_DESTROY(db) (!db->aborted && ( db->cursor->c_close(db->cursor),\ + (db->dbp->close)(db->dbp, 0) )) #define db_close(db) ((db->dbp)->close)(db->dbp, 0) #define db_del(db, key, flags) (flagSet(flags, R_CURSOR) \ ? ((db->cursor)->c_del)(db->cursor, 0) \ @@ -344,7 +352,7 @@ typedef union INFO { #else /* ! DB_VERSION_MAJOR */ -#define db_DESTROY(db) ((db->dbp)->close)(db->dbp) +#define db_DESTROY(db) (!db->aborted && ((db->dbp)->close)(db->dbp)) #define db_close(db) ((db->dbp)->close)(db->dbp) #define db_del(db, key, flags) ((db->dbp)->del)(db->dbp, &key, flags) #define db_put(db, key, value, flags) ((db->dbp)->put)(db->dbp, &key, &value, flags) @@ -358,8 +366,12 @@ typedef struct { DBTYPE type ; DB * dbp ; SV * compare ; + bool in_compare ; SV * prefix ; + bool in_prefix ; SV * hash ; + bool in_hash ; + bool aborted ; int in_memory ; #ifdef BERKELEY_DB_1_OR_2 INFO info ; @@ -367,51 +379,25 @@ typedef struct { #ifdef DB_VERSION_MAJOR DBC * cursor ; #endif -#ifdef DBM_FILTERING SV * filter_fetch_key ; SV * filter_store_key ; SV * filter_fetch_value ; SV * filter_store_value ; int filtering ; -#endif /* DBM_FILTERING */ } DB_File_type; typedef DB_File_type * DB_File ; typedef DBT DBTKEY ; -#ifdef DBM_FILTERING - -#define ckFilter(arg,type,name) \ - if (db->type) { \ - SV * save_defsv ; \ - /* printf("filtering %s\n", name) ; */ \ - if (db->filtering) \ - croak("recursion detected in %s", name) ; \ - db->filtering = TRUE ; \ - save_defsv = newSVsv(DEFSV) ; \ - sv_setsv(DEFSV, arg) ; \ - PUSHMARK(sp) ; \ - (void) perl_call_sv(db->type, G_DISCARD|G_NOARGS); \ - sv_setsv(arg, DEFSV) ; \ - sv_setsv(DEFSV, save_defsv) ; \ - SvREFCNT_dec(save_defsv) ; \ - db->filtering = FALSE ; \ - /* printf("end of filtering %s\n", name) ; */ \ - } - -#else - -#define ckFilter(arg,type, name) - -#endif /* DBM_FILTERING */ - #define my_sv_setpvn(sv, d, s) sv_setpvn(sv, (s ? d : (void*)""), s) #define OutputValue(arg, name) \ { if (RETVAL == 0) { \ my_sv_setpvn(arg, name.data, name.size) ; \ - ckFilter(arg, filter_fetch_value,"filter_fetch_value") ; \ + TAINT; \ + SvTAINTED_on(arg); \ + DBM_ckFilter(arg, filter_fetch_value,"filter_fetch_value") ; \ } \ } @@ -423,7 +409,9 @@ typedef DBT DBTKEY ; } \ else \ sv_setiv(arg, (I32)*(I32*)name.data - 1); \ - ckFilter(arg, filter_fetch_key,"filter_fetch_key") ; \ + TAINT; \ + SvTAINTED_on(arg); \ + DBM_ckFilter(arg, filter_fetch_key,"filter_fetch_key") ; \ } \ } @@ -451,6 +439,8 @@ START_MY_CXT #define CurrentDB (MY_CXT.x_CurrentDB) #define empty (MY_CXT.x_empty) +#define ERR_BUFF "DB_File::Error" + #ifdef DB_VERSION_MAJOR static int @@ -513,6 +503,12 @@ u_int flags ; #endif /* DB_VERSION_MAJOR */ +static void +tidyUp(DB_File db) +{ + db->aborted = TRUE ; +} + static int #ifdef AT_LEAST_DB_3_2 @@ -548,6 +544,12 @@ const DBT * key2 ; int retval ; int count ; + + if (CurrentDB->in_compare) { + tidyUp(CurrentDB); + croak ("DB_File btree_compare: recursion detected\n") ; + } + data1 = (char *) key1->data ; data2 = (char *) key2->data ; @@ -564,6 +566,10 @@ const DBT * key2 ; ENTER ; SAVETMPS; + SAVESPTR(CurrentDB); + CurrentDB->in_compare = FALSE; + SAVEINT(CurrentDB->in_compare); + CurrentDB->in_compare = TRUE; PUSHMARK(SP) ; EXTEND(SP,2) ; @@ -575,14 +581,17 @@ const DBT * key2 ; SPAGAIN ; - if (count != 1) + if (count != 1){ + tidyUp(CurrentDB); croak ("DB_File btree_compare: expected 1 return value from compare sub, got %d\n", count) ; + } retval = POPi ; PUTBACK ; FREETMPS ; LEAVE ; + return (retval) ; } @@ -620,6 +629,11 @@ const DBT * key2 ; int retval ; int count ; + if (CurrentDB->in_prefix){ + tidyUp(CurrentDB); + croak ("DB_File btree_prefix: recursion detected\n") ; + } + data1 = (char *) key1->data ; data2 = (char *) key2->data ; @@ -636,6 +650,10 @@ const DBT * key2 ; ENTER ; SAVETMPS; + SAVESPTR(CurrentDB); + CurrentDB->in_prefix = FALSE; + SAVEINT(CurrentDB->in_prefix); + CurrentDB->in_prefix = TRUE; PUSHMARK(SP) ; EXTEND(SP,2) ; @@ -647,8 +665,10 @@ const DBT * key2 ; SPAGAIN ; - if (count != 1) + if (count != 1){ + tidyUp(CurrentDB); croak ("DB_File btree_prefix: expected 1 return value from prefix sub, got %d\n", count) ; + } retval = POPi ; @@ -695,9 +715,14 @@ HASH_CB_SIZE_TYPE size ; #endif dSP ; dMY_CXT; - int retval ; + int retval = 0; int count ; + if (CurrentDB->in_hash){ + tidyUp(CurrentDB); + croak ("DB_File hash callback: recursion detected\n") ; + } + #ifndef newSVpvn if (size == 0) data = "" ; @@ -706,9 +731,14 @@ HASH_CB_SIZE_TYPE size ; /* DGH - Next two lines added to fix corrupted stack problem */ ENTER ; SAVETMPS; + SAVESPTR(CurrentDB); + CurrentDB->in_hash = FALSE; + SAVEINT(CurrentDB->in_hash); + CurrentDB->in_hash = TRUE; PUSHMARK(SP) ; + XPUSHs(sv_2mortal(newSVpvn((char*)data,size))); PUTBACK ; @@ -716,8 +746,10 @@ HASH_CB_SIZE_TYPE size ; SPAGAIN ; - if (count != 1) + if (count != 1){ + tidyUp(CurrentDB); croak ("DB_File hash_cb: expected 1 return value from hash sub, got %d\n", count) ; + } retval = POPi ; @@ -728,6 +760,28 @@ HASH_CB_SIZE_TYPE size ; return (retval) ; } +#if 0 +static void +#ifdef CAN_PROTOTYPE +db_errcall_cb(const char * db_errpfx, char * buffer) +#else +db_errcall_cb(db_errpfx, buffer) +const char * db_errpfx; +char * buffer; +#endif +{ +#ifdef dTHX + dTHX; +#endif + SV * sv = perl_get_sv(ERR_BUFF, FALSE) ; + if (sv) { + if (db_errpfx) + sv_setpvf(sv, "%s: %s", db_errpfx, buffer) ; + else + sv_setpv(sv, buffer) ; + } +} +#endif #if defined(TRACE) && defined(BERKELEY_DB_1_OR_2) @@ -837,8 +891,10 @@ I32 value ; I32 length = GetArrayLength(aTHX_ db) ; /* check for attempt to write before start of array */ - if (length + value + 1 <= 0) + if (length + value + 1 <= 0) { + tidyUp(db); croak("Modification of non-creatable array value attempted, subscript %ld", (long)value) ; + } value = length + value + 1 ; } @@ -876,11 +932,9 @@ SV * sv ; Zero(RETVAL, 1, DB_File_type) ; /* Default to HASH */ -#ifdef DBM_FILTERING RETVAL->filtering = 0 ; RETVAL->filter_fetch_key = RETVAL->filter_store_key = RETVAL->filter_fetch_value = RETVAL->filter_store_value = -#endif /* DBM_FILTERING */ RETVAL->hash = RETVAL->compare = RETVAL->prefix = NULL ; RETVAL->type = DB_HASH ; @@ -1150,11 +1204,9 @@ SV * sv ; Zero(RETVAL, 1, DB_File_type) ; /* Default to HASH */ -#ifdef DBM_FILTERING RETVAL->filtering = 0 ; RETVAL->filter_fetch_key = RETVAL->filter_store_key = RETVAL->filter_fetch_value = RETVAL->filter_store_value = -#endif /* DBM_FILTERING */ RETVAL->hash = RETVAL->compare = RETVAL->prefix = NULL ; RETVAL->type = DB_HASH ; @@ -1366,14 +1418,22 @@ SV * sv ; Flags |= DB_TRUNCATE ; #endif +#ifdef AT_LEAST_DB_4_1 + status = (RETVAL->dbp->open)(RETVAL->dbp, NULL, name, NULL, RETVAL->type, + Flags, mode) ; +#else status = (RETVAL->dbp->open)(RETVAL->dbp, name, NULL, RETVAL->type, Flags, mode) ; +#endif /* printf("open returned %d %s\n", status, db_strerror(status)) ; */ - if (status == 0) + if (status == 0) { + /* RETVAL->dbp->set_errcall(RETVAL->dbp, db_errcall_cb) ;*/ + status = (RETVAL->dbp->cursor)(RETVAL->dbp, NULL, &RETVAL->cursor, 0) ; - /* printf("cursor returned %d %s\n", status, db_strerror(status)) ; */ + /* printf("cursor returned %d %s\n", status, db_strerror(status)) ; */ + } if (status) RETVAL->dbp = NULL ; @@ -1395,6 +1455,10 @@ INCLUDE: constants.xs BOOT: { +#ifdef dTHX + dTHX; +#endif + /* SV * sv_err = perl_get_sv(ERR_BUFF, GV_ADD|GV_ADDMULTI) ; */ MY_CXT_INIT; __getBerkeleyDBInfo() ; @@ -1437,14 +1501,15 @@ db_DESTROY(db) dMY_CXT; INIT: CurrentDB = db ; + Trace(("DESTROY %p\n", db)); CLEANUP: + Trace(("DESTROY %p done\n", db)); if (db->hash) SvREFCNT_dec(db->hash) ; if (db->compare) SvREFCNT_dec(db->compare) ; if (db->prefix) SvREFCNT_dec(db->prefix) ; -#ifdef DBM_FILTERING if (db->filter_fetch_key) SvREFCNT_dec(db->filter_fetch_key) ; if (db->filter_store_key) @@ -1453,7 +1518,6 @@ db_DESTROY(db) SvREFCNT_dec(db->filter_fetch_value) ; if (db->filter_store_value) SvREFCNT_dec(db->filter_store_value) ; -#endif /* DBM_FILTERING */ safefree(db) ; #ifdef DB_VERSION_MAJOR if (RETVAL > 0) @@ -1503,7 +1567,6 @@ db_FETCH(db, key, flags=0) DBT_clear(value) ; CurrentDB = db ; - /* RETVAL = ((db->dbp)->get)(db->dbp, TXN &key, &value, flags) ; */ RETVAL = db_get(db, key, value, flags) ; ST(0) = sv_newmortal(); OutputValue(ST(0), value) @@ -1857,33 +1920,13 @@ db_seq(db, key, value, flags) key value -#ifdef DBM_FILTERING - -#define setFilter(type) \ - { \ - if (db->type) \ - RETVAL = sv_mortalcopy(db->type) ; \ - ST(0) = RETVAL ; \ - if (db->type && (code == &PL_sv_undef)) { \ - SvREFCNT_dec(db->type) ; \ - db->type = NULL ; \ - } \ - else if (code) { \ - if (db->type) \ - sv_setsv(db->type, code) ; \ - else \ - db->type = newSVsv(code) ; \ - } \ - } - - SV * filter_fetch_key(db, code) DB_File db SV * code SV * RETVAL = &PL_sv_undef ; CODE: - setFilter(filter_fetch_key) ; + DBM_setFilter(db->filter_fetch_key, code) ; SV * filter_store_key(db, code) @@ -1891,7 +1934,7 @@ filter_store_key(db, code) SV * code SV * RETVAL = &PL_sv_undef ; CODE: - setFilter(filter_store_key) ; + DBM_setFilter(db->filter_store_key, code) ; SV * filter_fetch_value(db, code) @@ -1899,7 +1942,7 @@ filter_fetch_value(db, code) SV * code SV * RETVAL = &PL_sv_undef ; CODE: - setFilter(filter_fetch_value) ; + DBM_setFilter(db->filter_fetch_value, code) ; SV * filter_store_value(db, code) @@ -1907,6 +1950,5 @@ filter_store_value(db, code) SV * code SV * RETVAL = &PL_sv_undef ; CODE: - setFilter(filter_store_value) ; + DBM_setFilter(db->filter_store_value, code) ; -#endif /* DBM_FILTERING */ diff --git a/ext/DB_File/dbinfo b/ext/DB_File/dbinfo index d349d07eef..af2c45facf 100644 --- a/ext/DB_File/dbinfo +++ b/ext/DB_File/dbinfo @@ -29,7 +29,8 @@ my %Data = 5 => "2.0.0 -> 2.3.0", 6 => "2.3.1 -> 2.7.7", 7 => "3.0.x", - 8 => "3.1.x or greater", + 8 => "3.1.x -> 4.0.x", + 9 => "4.1.x or greater", } }, 0x061561 => { @@ -42,7 +43,8 @@ my %Data = 4 => "2.0.0 -> 2.1.0", 5 => "2.2.6 -> 2.7.7", 6 => "3.0.x", - 7 => "3.1.x or greater", + 7 => "3.1.x -> 4.0.x", + 8 => "4.1.x or greater", } }, 0x042253 => { @@ -51,7 +53,8 @@ my %Data = { 1 => "3.0.x", 2 => "3.1.x", - 3 => "3.2.x or greater", + 3 => "3.2.x -> 4.0.x", + 4 => "4.1.x or greater", } }, ) ; diff --git a/ext/DB_File/t/db-btree.t b/ext/DB_File/t/db-btree.t index 1a79435f99..643e8fba5b 100755 --- a/ext/DB_File/t/db-btree.t +++ b/ext/DB_File/t/db-btree.t @@ -24,7 +24,7 @@ BEGIN { && $Config{db_version_patch} == 0) { warn <<EOM; # -# This test is known to crash in Mac OS X versions 10.1.5 (or earlier) +# This test is known to crash in Mac OS X versions 10.2 (or earlier) # because of the buggy Berkeley DB version included with the OS. # EOM @@ -34,7 +34,9 @@ EOM use DB_File; use Fcntl; -print "1..163\n"; +print "1..177\n"; + +unlink glob "__db.*"; sub ok { @@ -110,6 +112,15 @@ sub normalise return $data ; } +sub safeUntie +{ + my $hashref = shift ; + my $no_inner = 1; + local $SIG{__WARN__} = sub {-- $no_inner } ; + untie %$hashref; + return $no_inner; +} + my $db185mode = ($DB_File::db_version == 1 && ! $DB_File::db_185_compat) ; @@ -151,22 +162,16 @@ ok(13, $dbh->{minkeypage} == 123) ; $dbh->{maxkeypage} = 1234 ; ok(14, $dbh->{maxkeypage} == 1234 ); -$dbh->{compare} = 1234 ; -ok(15, $dbh->{compare} == 1234) ; - -$dbh->{prefix} = 1234 ; -ok(16, $dbh->{prefix} == 1234 ); - # Check that an invalid entry is caught both for store & fetch eval '$dbh->{fred} = 1234' ; -ok(17, $@ =~ /^DB_File::BTREEINFO::STORE - Unknown element 'fred' at/ ) ; +ok(15, $@ =~ /^DB_File::BTREEINFO::STORE - Unknown element 'fred' at/ ) ; eval 'my $q = $dbh->{fred}' ; -ok(18, $@ =~ /^DB_File::BTREEINFO::FETCH - Unknown element 'fred' at/ ) ; +ok(16, $@ =~ /^DB_File::BTREEINFO::FETCH - Unknown element 'fred' at/ ) ; # Now check the interface to BTREE my ($X, %h) ; -ok(19, $X = tie(%h, 'DB_File',$Dfile, O_RDWR|O_CREAT, 0640, $DB_BTREE )) ; +ok(17, $X = tie(%h, 'DB_File',$Dfile, O_RDWR|O_CREAT, 0640, $DB_BTREE )) ; die "Could not tie: $!" unless $X; my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime, @@ -174,22 +179,22 @@ my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime, my %noMode = map { $_, 1} qw( amigaos MSWin32 NetWare cygwin ) ; -ok(20, ($mode & 0777) == (($^O eq 'os2' || $^O eq 'MacOS') ? 0666 : 0640) +ok(18, ($mode & 0777) == (($^O eq 'os2' || $^O eq 'MacOS') ? 0666 : 0640) || $noMode{$^O} ); my ($key, $value, $i); while (($key,$value) = each(%h)) { $i++; } -ok(21, !$i ) ; +ok(19, !$i ) ; $h{'goner1'} = 'snork'; $h{'abc'} = 'ABC'; -ok(22, $h{'abc'} eq 'ABC' ); -ok(23, ! defined $h{'jimmy'} ) ; -ok(24, ! exists $h{'jimmy'} ) ; -ok(25, defined $h{'abc'} ) ; +ok(20, $h{'abc'} eq 'ABC' ); +ok(21, ! defined $h{'jimmy'} ) ; +ok(22, ! exists $h{'jimmy'} ) ; +ok(23, defined $h{'abc'} ) ; $h{'def'} = 'DEF'; $h{'jkl','mno'} = "JKL\034MNO"; @@ -220,7 +225,7 @@ undef $X ; untie(%h); # tie to the same file again -ok(26, $X = tie(%h,'DB_File',$Dfile, O_RDWR, 0640, $DB_BTREE)) ; +ok(24, $X = tie(%h,'DB_File',$Dfile, O_RDWR, 0640, $DB_BTREE)) ; # Modify an entry from the previous tie $h{'g'} = 'G'; @@ -251,7 +256,7 @@ $X->DELETE('goner3'); my @keys = keys(%h); my @values = values(%h); -ok(27, $#keys == 29 && $#values == 29) ; +ok(25, $#keys == 29 && $#values == 29) ; $i = 0 ; while (($key,$value) = each(%h)) { @@ -261,18 +266,18 @@ while (($key,$value) = each(%h)) { } } -ok(28, $i == 30) ; +ok(26, $i == 30) ; @keys = ('blurfl', keys(%h), 'dyick'); -ok(29, $#keys == 31) ; +ok(27, $#keys == 31) ; #Check that the keys can be retrieved in order my @b = keys %h ; my @c = sort lexical @b ; -ok(30, ArrayCompare(\@b, \@c)) ; +ok(28, ArrayCompare(\@b, \@c)) ; $h{'foo'} = ''; -ok(31, $h{'foo'} eq '' ) ; +ok(29, $h{'foo'} eq '' ) ; # Berkeley DB from version 2.4.10 to 3.0 does not allow null keys. # This feature was reenabled in version 3.1 of Berkeley DB. @@ -283,21 +288,21 @@ if ($null_keys_allowed) { } else { $result = 1 } -ok(32, $result) ; +ok(30, $result) ; # check cache overflow and numeric keys and contents my $ok = 1; for ($i = 1; $i < 200; $i++) { $h{$i + 0} = $i + 0; } for ($i = 1; $i < 200; $i++) { $ok = 0 unless $h{$i} == $i; } -ok(33, $ok); +ok(31, $ok); ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime, $blksize,$blocks) = stat($Dfile); -ok(34, $size > 0 ); +ok(32, $size > 0 ); @h{0..200} = 200..400; my @foo = @h{0..200}; -ok(35, join(':',200..400) eq join(':',@foo) ); +ok(33, join(':',200..400) eq join(':',@foo) ); # Now check all the non-tie specific stuff @@ -306,57 +311,57 @@ ok(35, join(':',200..400) eq join(':',@foo) ); # an existing record. my $status = $X->put( 'x', 'newvalue', R_NOOVERWRITE) ; -ok(36, $status == 1 ); +ok(34, $status == 1 ); # check that the value of the key 'x' has not been changed by the # previous test -ok(37, $h{'x'} eq 'X' ); +ok(35, $h{'x'} eq 'X' ); # standard put $status = $X->put('key', 'value') ; -ok(38, $status == 0 ); +ok(36, $status == 0 ); #check that previous put can be retrieved $value = 0 ; $status = $X->get('key', $value) ; -ok(39, $status == 0 ); -ok(40, $value eq 'value' ); +ok(37, $status == 0 ); +ok(38, $value eq 'value' ); # Attempting to delete an existing key should work $status = $X->del('q') ; -ok(41, $status == 0 ); +ok(39, $status == 0 ); if ($null_keys_allowed) { $status = $X->del('') ; } else { $status = 0 ; } -ok(42, $status == 0 ); +ok(40, $status == 0 ); # Make sure that the key deleted, cannot be retrieved -ok(43, ! defined $h{'q'}) ; -ok(44, ! defined $h{''}) ; +ok(41, ! defined $h{'q'}) ; +ok(42, ! defined $h{''}) ; undef $X ; untie %h ; -ok(45, $X = tie(%h, 'DB_File',$Dfile, O_RDWR, 0640, $DB_BTREE )); +ok(43, $X = tie(%h, 'DB_File',$Dfile, O_RDWR, 0640, $DB_BTREE )); # Attempting to delete a non-existant key should fail $status = $X->del('joe') ; -ok(46, $status == 1 ); +ok(44, $status == 1 ); # Check the get interface # First a non-existing key $status = $X->get('aaaa', $value) ; -ok(47, $status == 1 ); +ok(45, $status == 1 ); # Next an existing key $status = $X->get('a', $value) ; -ok(48, $status == 0 ); -ok(49, $value eq 'A' ); +ok(46, $status == 0 ); +ok(47, $value eq 'A' ); # seq # ### @@ -365,15 +370,15 @@ ok(49, $value eq 'A' ); $key = 'ke' ; $value = '' ; $status = $X->seq($key, $value, R_CURSOR) ; -ok(50, $status == 0 ); -ok(51, $key eq 'key' ); -ok(52, $value eq 'value' ); +ok(48, $status == 0 ); +ok(49, $key eq 'key' ); +ok(50, $value eq 'value' ); # seq when the key does not match $key = 'zzz' ; $value = '' ; $status = $X->seq($key, $value, R_CURSOR) ; -ok(53, $status == 1 ); +ok(51, $status == 1 ); # use seq to set the cursor, then delete the record @ the cursor. @@ -381,36 +386,36 @@ ok(53, $status == 1 ); $key = 'x' ; $value = '' ; $status = $X->seq($key, $value, R_CURSOR) ; -ok(54, $status == 0 ); -ok(55, $key eq 'x' ); -ok(56, $value eq 'X' ); +ok(52, $status == 0 ); +ok(53, $key eq 'x' ); +ok(54, $value eq 'X' ); $status = $X->del(0, R_CURSOR) ; -ok(57, $status == 0 ); +ok(55, $status == 0 ); $status = $X->get('x', $value) ; -ok(58, $status == 1 ); +ok(56, $status == 1 ); # ditto, but use put to replace the key/value pair. $key = 'y' ; $value = '' ; $status = $X->seq($key, $value, R_CURSOR) ; -ok(59, $status == 0 ); -ok(60, $key eq 'y' ); -ok(61, $value eq 'Y' ); +ok(57, $status == 0 ); +ok(58, $key eq 'y' ); +ok(59, $value eq 'Y' ); $key = "replace key" ; $value = "replace value" ; $status = $X->put($key, $value, R_CURSOR) ; -ok(62, $status == 0 ); -ok(63, $key eq 'replace key' ); -ok(64, $value eq 'replace value' ); +ok(60, $status == 0 ); +ok(61, $key eq 'replace key' ); +ok(62, $value eq 'replace value' ); $status = $X->get('y', $value) ; -ok(65, 1) ; # hard-wire to always pass. the previous test ($status == 1) +ok(63, 1) ; # hard-wire to always pass. the previous test ($status == 1) # only worked because of a bug in 1.85/6 # use seq to walk forwards through a file $status = $X->seq($key, $value, R_FIRST) ; -ok(66, $status == 0 ); +ok(64, $status == 0 ); my $previous = $key ; $ok = 1 ; @@ -419,12 +424,12 @@ while (($status = $X->seq($key, $value, R_NEXT)) == 0) ($ok = 0), last if ($previous cmp $key) == 1 ; } -ok(67, $status == 1 ); -ok(68, $ok == 1 ); +ok(65, $status == 1 ); +ok(66, $ok == 1 ); # use seq to walk backwards through a file $status = $X->seq($key, $value, R_LAST) ; -ok(69, $status == 0 ); +ok(67, $status == 0 ); $previous = $key ; $ok = 1 ; @@ -434,8 +439,8 @@ while (($status = $X->seq($key, $value, R_PREV)) == 0) #print "key = [$key] value = [$value]\n" ; } -ok(70, $status == 1 ); -ok(71, $ok == 1 ); +ok(68, $status == 1 ); +ok(69, $ok == 1 ); # check seq FIRST/LAST @@ -444,14 +449,14 @@ ok(71, $ok == 1 ); # #### $status = $X->sync ; -ok(72, $status == 0 ); +ok(70, $status == 0 ); # fd # ## $status = $X->fd ; -ok(73, $status != 0 ); +ok(71, $status != 0 ); undef $X ; @@ -461,11 +466,11 @@ unlink $Dfile; # Now try an in memory file my $Y; -ok(74, $Y = tie(%h, 'DB_File',undef, O_RDWR|O_CREAT, 0640, $DB_BTREE )); +ok(72, $Y = tie(%h, 'DB_File',undef, O_RDWR|O_CREAT, 0640, $DB_BTREE )); # fd with an in memory file should return failure $status = $Y->fd ; -ok(75, $status == -1 ); +ok(73, $status == -1 ); undef $Y ; @@ -475,7 +480,7 @@ untie %h ; my $bt = new DB_File::BTREEINFO ; $bt->{flags} = R_DUP ; my ($YY, %hh); -ok(76, $YY = tie(%hh, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $bt )) ; +ok(74, $YY = tie(%hh, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $bt )) ; $hh{'Wall'} = 'Larry' ; $hh{'Wall'} = 'Stone' ; # Note the duplicate key @@ -485,33 +490,33 @@ $hh{'Smith'} = 'John' ; $hh{'mouse'} = 'mickey' ; # first work in scalar context -ok(77, scalar $YY->get_dup('Unknown') == 0 ); -ok(78, scalar $YY->get_dup('Smith') == 1 ); -ok(79, scalar $YY->get_dup('Wall') == 4 ); +ok(75, scalar $YY->get_dup('Unknown') == 0 ); +ok(76, scalar $YY->get_dup('Smith') == 1 ); +ok(77, scalar $YY->get_dup('Wall') == 4 ); # now in list context my @unknown = $YY->get_dup('Unknown') ; -ok(80, "@unknown" eq "" ); +ok(78, "@unknown" eq "" ); my @smith = $YY->get_dup('Smith') ; -ok(81, "@smith" eq "John" ); +ok(79, "@smith" eq "John" ); { my @wall = $YY->get_dup('Wall') ; my %wall ; @wall{@wall} = @wall ; -ok(82, (@wall == 4 && $wall{'Larry'} && $wall{'Stone'} && $wall{'Brick'}) ); +ok(80, (@wall == 4 && $wall{'Larry'} && $wall{'Stone'} && $wall{'Brick'}) ); } # hash my %unknown = $YY->get_dup('Unknown', 1) ; -ok(83, keys %unknown == 0 ); +ok(81, keys %unknown == 0 ); my %smith = $YY->get_dup('Smith', 1) ; -ok(84, keys %smith == 1 && $smith{'John'}) ; +ok(82, keys %smith == 1 && $smith{'John'}) ; my %wall = $YY->get_dup('Wall', 1) ; -ok(85, keys %wall == 3 && $wall{'Larry'} == 1 && $wall{'Stone'} == 1 +ok(83, keys %wall == 3 && $wall{'Larry'} == 1 && $wall{'Stone'} == 1 && $wall{'Brick'} == 2); undef $YY ; @@ -570,9 +575,9 @@ sub ArrayCompare 1 ; } -ok(86, ArrayCompare (\@srt_1, [keys %h]) ); -ok(87, ArrayCompare (\@srt_2, [keys %g]) ); -ok(88, ArrayCompare (\@srt_3, [keys %k]) ); +ok(84, ArrayCompare (\@srt_1, [keys %h]) ); +ok(85, ArrayCompare (\@srt_2, [keys %g]) ); +ok(86, ArrayCompare (\@srt_3, [keys %k]) ); untie %h ; untie %g ; @@ -582,7 +587,7 @@ unlink $Dfile1, $Dfile2, $Dfile3 ; # clear # ##### -ok(89, tie(%h, 'DB_File', $Dfile1, O_RDWR|O_CREAT, 0640, $DB_BTREE ) ); +ok(87, tie(%h, 'DB_File', $Dfile1, O_RDWR|O_CREAT, 0640, $DB_BTREE ) ); foreach (1 .. 10) { $h{$_} = $_ * 100 } @@ -591,7 +596,7 @@ $i = 0 ; while (($key,$value) = each(%h)) { $i++; } -ok(90, $i == 10); +ok(88, $i == 10); # now clear the hash %h = () ; @@ -601,7 +606,7 @@ $i = 0 ; while (($key,$value) = each(%h)) { $i++; } -ok(91, $i == 0); +ok(89, $i == 0); untie %h ; unlink $Dfile1 ; @@ -612,7 +617,7 @@ unlink $Dfile1 ; my $filename = "xyz" ; my @x ; eval { tie @x, 'DB_File', $filename, O_RDWR|O_CREAT, 0640, $DB_BTREE ; } ; - ok(92, $@ =~ /^DB_File can only tie an associative array to a DB_BTREE database/) ; + ok(90, $@ =~ /^DB_File can only tie an associative array to a DB_BTREE database/) ; unlink $filename ; } @@ -679,31 +684,31 @@ EOM BEGIN { push @INC, '.'; } eval 'use SubDB ; '; - main::ok(93, $@ eq "") ; + main::ok(91, $@ eq "") ; my %h ; my $X ; eval ' $X = tie(%h, "SubDB","dbbtree.tmp", O_RDWR|O_CREAT, 0640, $DB_BTREE ); ' ; - main::ok(94, $@ eq "") ; + main::ok(92, $@ eq "") ; my $ret = eval '$h{"fred"} = 3 ; return $h{"fred"} ' ; - main::ok(95, $@ eq "") ; - main::ok(96, $ret == 5) ; + main::ok(93, $@ eq "") ; + main::ok(94, $ret == 5) ; my $value = 0; $ret = eval '$X->put("joe", 4) ; $X->get("joe", $value) ; return $value' ; - main::ok(97, $@ eq "") ; - main::ok(98, $ret == 10) ; + main::ok(95, $@ eq "") ; + main::ok(96, $ret == 10) ; $ret = eval ' R_NEXT eq main::R_NEXT ' ; - main::ok(99, $@ eq "" ) ; - main::ok(100, $ret == 1) ; + main::ok(97, $@ eq "" ) ; + main::ok(98, $ret == 1) ; $ret = eval '$X->A_new_method("joe") ' ; - main::ok(101, $@ eq "") ; - main::ok(102, $ret eq "[[11]]") ; + main::ok(99, $@ eq "") ; + main::ok(100, $ret eq "[[11]]") ; undef $X; untie(%h); @@ -728,7 +733,7 @@ EOM $_ eq 'original' ; } - ok(103, $db = tie(%h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_BTREE ) ); + ok(101, $db = tie(%h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_BTREE ) ); $db->filter_fetch_key (sub { $fetch_key = $_ }) ; $db->filter_store_key (sub { $store_key = $_ }) ; @@ -739,17 +744,17 @@ EOM $h{"fred"} = "joe" ; # fk sk fv sv - ok(104, checkOutput( "", "fred", "", "joe")) ; + ok(102, checkOutput( "", "fred", "", "joe")) ; ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; - ok(105, $h{"fred"} eq "joe"); + ok(103, $h{"fred"} eq "joe"); # fk sk fv sv - ok(106, checkOutput( "", "fred", "joe", "")) ; + ok(104, checkOutput( "", "fred", "joe", "")) ; ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; - ok(107, $db->FIRSTKEY() eq "fred") ; + ok(105, $db->FIRSTKEY() eq "fred") ; # fk sk fv sv - ok(108, checkOutput( "fred", "", "", "")) ; + ok(106, checkOutput( "fred", "", "", "")) ; # replace the filters, but remember the previous set my ($old_fk) = $db->filter_fetch_key @@ -764,17 +769,17 @@ EOM ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; $h{"Fred"} = "Joe" ; # fk sk fv sv - ok(109, checkOutput( "", "fred", "", "Jxe")) ; + ok(107, checkOutput( "", "fred", "", "Jxe")) ; ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; - ok(110, $h{"Fred"} eq "[Jxe]"); + ok(108, $h{"Fred"} eq "[Jxe]"); # fk sk fv sv - ok(111, checkOutput( "", "fred", "[Jxe]", "")) ; + ok(109, checkOutput( "", "fred", "[Jxe]", "")) ; ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; - ok(112, $db->FIRSTKEY() eq "FRED") ; + ok(110, $db->FIRSTKEY() eq "FRED") ; # fk sk fv sv - ok(113, checkOutput( "FRED", "", "", "")) ; + ok(111, checkOutput( "FRED", "", "", "")) ; # put the original filters back $db->filter_fetch_key ($old_fk); @@ -784,15 +789,15 @@ EOM ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; $h{"fred"} = "joe" ; - ok(114, checkOutput( "", "fred", "", "joe")) ; + ok(112, checkOutput( "", "fred", "", "joe")) ; ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; - ok(115, $h{"fred"} eq "joe"); - ok(116, checkOutput( "", "fred", "joe", "")) ; + ok(113, $h{"fred"} eq "joe"); + ok(114, checkOutput( "", "fred", "joe", "")) ; ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; - ok(117, $db->FIRSTKEY() eq "fred") ; - ok(118, checkOutput( "fred", "", "", "")) ; + ok(115, $db->FIRSTKEY() eq "fred") ; + ok(116, checkOutput( "fred", "", "", "")) ; # delete the filters $db->filter_fetch_key (undef); @@ -802,15 +807,15 @@ EOM ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; $h{"fred"} = "joe" ; - ok(119, checkOutput( "", "", "", "")) ; + ok(117, checkOutput( "", "", "", "")) ; ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; - ok(120, $h{"fred"} eq "joe"); - ok(121, checkOutput( "", "", "", "")) ; + ok(118, $h{"fred"} eq "joe"); + ok(119, checkOutput( "", "", "", "")) ; ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; - ok(122, $db->FIRSTKEY() eq "fred") ; - ok(123, checkOutput( "", "", "", "")) ; + ok(120, $db->FIRSTKEY() eq "fred") ; + ok(121, checkOutput( "", "", "", "")) ; undef $db ; untie %h; @@ -825,7 +830,7 @@ EOM my (%h, $db) ; unlink $Dfile; - ok(124, $db = tie(%h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_BTREE ) ); + ok(122, $db = tie(%h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_BTREE ) ); my %result = () ; @@ -849,32 +854,32 @@ EOM $_ = "original" ; $h{"fred"} = "joe" ; - ok(125, $result{"store key"} eq "store key - 1: [fred]"); - ok(126, $result{"store value"} eq "store value - 1: [joe]"); - ok(127, ! defined $result{"fetch key"} ); - ok(128, ! defined $result{"fetch value"} ); - ok(129, $_ eq "original") ; - - ok(130, $db->FIRSTKEY() eq "fred") ; - ok(131, $result{"store key"} eq "store key - 1: [fred]"); - ok(132, $result{"store value"} eq "store value - 1: [joe]"); - ok(133, $result{"fetch key"} eq "fetch key - 1: [fred]"); - ok(134, ! defined $result{"fetch value"} ); - ok(135, $_ eq "original") ; + ok(123, $result{"store key"} eq "store key - 1: [fred]"); + ok(124, $result{"store value"} eq "store value - 1: [joe]"); + ok(125, ! defined $result{"fetch key"} ); + ok(126, ! defined $result{"fetch value"} ); + ok(127, $_ eq "original") ; + + ok(128, $db->FIRSTKEY() eq "fred") ; + ok(129, $result{"store key"} eq "store key - 1: [fred]"); + ok(130, $result{"store value"} eq "store value - 1: [joe]"); + ok(131, $result{"fetch key"} eq "fetch key - 1: [fred]"); + ok(132, ! defined $result{"fetch value"} ); + ok(133, $_ eq "original") ; $h{"jim"} = "john" ; - ok(136, $result{"store key"} eq "store key - 2: [fred jim]"); - ok(137, $result{"store value"} eq "store value - 2: [joe john]"); - ok(138, $result{"fetch key"} eq "fetch key - 1: [fred]"); - ok(139, ! defined $result{"fetch value"} ); - ok(140, $_ eq "original") ; - - ok(141, $h{"fred"} eq "joe"); - ok(142, $result{"store key"} eq "store key - 3: [fred jim fred]"); - ok(143, $result{"store value"} eq "store value - 2: [joe john]"); - ok(144, $result{"fetch key"} eq "fetch key - 1: [fred]"); - ok(145, $result{"fetch value"} eq "fetch value - 1: [joe]"); - ok(146, $_ eq "original") ; + ok(134, $result{"store key"} eq "store key - 2: [fred jim]"); + ok(135, $result{"store value"} eq "store value - 2: [joe john]"); + ok(136, $result{"fetch key"} eq "fetch key - 1: [fred]"); + ok(137, ! defined $result{"fetch value"} ); + ok(138, $_ eq "original") ; + + ok(139, $h{"fred"} eq "joe"); + ok(140, $result{"store key"} eq "store key - 3: [fred jim fred]"); + ok(141, $result{"store value"} eq "store value - 2: [joe john]"); + ok(142, $result{"fetch key"} eq "fetch key - 1: [fred]"); + ok(143, $result{"fetch value"} eq "fetch value - 1: [joe]"); + ok(144, $_ eq "original") ; undef $db ; untie %h; @@ -888,12 +893,12 @@ EOM my (%h, $db) ; unlink $Dfile; - ok(147, $db = tie(%h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_BTREE ) ); + ok(145, $db = tie(%h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_BTREE ) ); $db->filter_store_key (sub { $_ = $h{$_} }) ; eval '$h{1} = 1234' ; - ok(148, $@ =~ /^recursion detected in filter_store_key at/ ); + ok(146, $@ =~ /^recursion detected in filter_store_key at/ ); undef $db ; untie %h; @@ -953,7 +958,7 @@ EOM delete $DB_BTREE->{'compare'} ; - ok(149, docat_del($file) eq <<'EOM') ; + ok(147, docat_del($file) eq <<'EOM') ; mouse Smith Wall @@ -997,7 +1002,7 @@ EOM unlink $filename ; } - ok(150, docat_del($file) eq ($db185mode ? <<'EOM' : <<'EOM') ) ; + ok(148, docat_del($file) eq ($db185mode ? <<'EOM' : <<'EOM') ) ; Smith -> John Wall -> Brick Wall -> Brick @@ -1052,7 +1057,7 @@ EOM untie %h ; } - ok(151, docat_del($file) eq ($db185mode == 1 ? <<'EOM' : <<'EOM') ) ; + ok(149, docat_del($file) eq ($db185mode == 1 ? <<'EOM' : <<'EOM') ) ; Smith -> John Wall -> Brick Wall -> Brick @@ -1107,7 +1112,7 @@ EOM untie %h ; } - ok(152, docat_del($file) eq <<'EOM') ; + ok(150, docat_del($file) eq <<'EOM') ; Wall occurred 3 times Larry is there There are 2 Brick Walls @@ -1146,7 +1151,7 @@ EOM untie %h ; } - ok(153, docat_del($file) eq <<'EOM') ; + ok(151, docat_del($file) eq <<'EOM') ; Larry Wall is there Harry Wall is not there EOM @@ -1182,7 +1187,7 @@ EOM unlink $filename ; } - ok(154, docat_del($file) eq <<'EOM') ; + ok(152, docat_del($file) eq <<'EOM') ; Larry Wall is not there EOM @@ -1242,7 +1247,7 @@ EOM } - ok(155, docat_del($file) eq <<'EOM') ; + ok(153, docat_del($file) eq <<'EOM') ; IN ORDER Smith -> John Wall -> Larry @@ -1301,7 +1306,7 @@ EOM tie %h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0664, $DB_BTREE or die "Can't open file: $!\n" ; $h{ABC} = undef; - ok(156, $a eq "") ; + ok(154, $a eq "") ; untie %h ; unlink $Dfile; } @@ -1321,7 +1326,7 @@ EOM tie %h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0664, $DB_BTREE or die "Can't open file: $!\n" ; %h = (); ; - ok(157, $a eq "") ; + ok(155, $a eq "") ; untie %h ; unlink $Dfile; } @@ -1341,31 +1346,148 @@ EOM my $bad_key = 0 ; my %h = () ; my $db ; - ok(158, $db = tie(%h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_BTREE ) ); + ok(156, $db = tie(%h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_BTREE ) ); $db->filter_fetch_key (sub { $_ =~ s/^Beta_/Alpha_/ if defined $_}) ; $db->filter_store_key (sub { $bad_key = 1 if /^Beta_/ ; $_ =~ s/^Alpha_/Beta_/}) ; $h{'Alpha_ABC'} = 2 ; $h{'Alpha_DEF'} = 5 ; - ok(159, $h{'Alpha_ABC'} == 2); - ok(160, $h{'Alpha_DEF'} == 5); + ok(157, $h{'Alpha_ABC'} == 2); + ok(158, $h{'Alpha_DEF'} == 5); my ($k, $v) = ("",""); while (($k, $v) = each %h) {} - ok(161, $bad_key == 0); + ok(159, $bad_key == 0); $bad_key = 0 ; foreach $k (keys %h) {} - ok(162, $bad_key == 0); + ok(160, $bad_key == 0); $bad_key = 0 ; foreach $v (values %h) {} - ok(163, $bad_key == 0); + ok(161, $bad_key == 0); undef $db ; untie %h ; unlink $Dfile; } +{ + # now an error to pass 'compare' a non-code reference + my $dbh = new DB_File::BTREEINFO ; + + eval { $dbh->{compare} = 2 }; + ok(162, $@ =~ /^Key 'compare' not associated with a code reference at/); + + eval { $dbh->{prefix} = 2 }; + ok(163, $@ =~ /^Key 'prefix' not associated with a code reference at/); + +} + + +#{ +# # recursion detection in btree +# my %hash ; +# unlink $Dfile; +# my $dbh = new DB_File::BTREEINFO ; +# $dbh->{compare} = sub { $hash{3} = 4 ; length $_[0] } ; +# +# +# my (%h); +# ok(164, tie(%hash, 'DB_File',$Dfile, O_RDWR|O_CREAT, 0640, $dbh ) ); +# +# eval { $hash{1} = 2; +# $hash{4} = 5; +# }; +# +# ok(165, $@ =~ /^DB_File btree_compare: recursion detected/); +# { +# no warnings; +# untie %hash; +# } +# unlink $Dfile; +#} +ok(164,1); +ok(165,1); + +{ + # Check that two callbacks don't interact + my %hash1 ; + my %hash2 ; + my $h1_count = 0; + my $h2_count = 0; + unlink $Dfile, $Dfile2; + my $dbh1 = new DB_File::BTREEINFO ; + $dbh1->{compare} = sub { ++ $h1_count ; $_[0] cmp $_[1] } ; + + my $dbh2 = new DB_File::BTREEINFO ; + $dbh2->{compare} = sub { ;++ $h2_count ; $_[0] cmp $_[1] } ; + + + + my (%h); + ok(166, tie(%hash1, 'DB_File',$Dfile, O_RDWR|O_CREAT, 0640, $dbh1 ) ); + ok(167, tie(%hash2, 'DB_File',$Dfile2, O_RDWR|O_CREAT, 0640, $dbh2 ) ); + + $hash1{DEFG} = 5; + $hash1{XYZ} = 2; + $hash1{ABCDE} = 5; + + $hash2{defg} = 5; + $hash2{xyz} = 2; + $hash2{abcde} = 5; + + ok(168, $h1_count > 0); + ok(169, $h1_count == $h2_count); + + ok(170, safeUntie \%hash1); + ok(171, safeUntie \%hash2); + unlink $Dfile, $Dfile2; +} + +{ + # Check that DBM Filter can cope with read-only $_ + + use warnings ; + use strict ; + my (%h, $db) ; + unlink $Dfile; + + ok(172, $db = tie(%h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_BTREE ) ); + + $db->filter_fetch_key (sub { }) ; + $db->filter_store_key (sub { }) ; + $db->filter_fetch_value (sub { }) ; + $db->filter_store_value (sub { }) ; + + $_ = "original" ; + + $h{"fred"} = "joe" ; + ok(173, $h{"fred"} eq "joe"); + + eval { grep { $h{$_} } (1, 2, 3) }; + ok (174, ! $@); + + + # delete the filters + $db->filter_fetch_key (undef); + $db->filter_store_key (undef); + $db->filter_fetch_value (undef); + $db->filter_store_value (undef); + + $h{"fred"} = "joe" ; + + ok(175, $h{"fred"} eq "joe"); + + ok(176, $db->FIRSTKEY() eq "fred") ; + + eval { grep { $h{$_} } (1, 2, 3) }; + ok (177, ! $@); + + undef $db ; + untie %h; + unlink $Dfile; +} + exit ; diff --git a/ext/DB_File/t/db-hash.t b/ext/DB_File/t/db-hash.t index 931b03c96a..7dba15d721 100755 --- a/ext/DB_File/t/db-hash.t +++ b/ext/DB_File/t/db-hash.t @@ -23,7 +23,9 @@ BEGIN { use DB_File; use Fcntl; -print "1..117\n"; +print "1..143\n"; + +unlink glob "__db.*"; sub ok { @@ -76,9 +78,18 @@ sub normalise return $data ; } +sub safeUntie +{ + my $hashref = shift ; + my $no_inner = 1; + local $SIG{__WARN__} = sub {-- $no_inner } ; + untie %$hashref; + return $no_inner; +} my $Dfile = "dbhash.tmp"; +my $Dfile2 = "dbhash2.tmp"; my $null_keys_allowed = ($DB_File::db_ver < 2.004010 || $DB_File::db_ver >= 3.1 ); @@ -109,8 +120,9 @@ ok(9, $dbh->{nelem} == 400 ); $dbh->{cachesize} = 65 ; ok(10, $dbh->{cachesize} == 65 ); -$dbh->{hash} = "abc" ; -ok(11, $dbh->{hash} eq "abc" ); +my $some_sub = sub {} ; +$dbh->{hash} = $some_sub; +ok(11, $dbh->{hash} eq $some_sub ); $dbh->{lorder} = 1234 ; ok(12, $dbh->{lorder} == 1234 ); @@ -498,9 +510,22 @@ EOM sub checkOutput { + no warnings 'uninitialized'; my($fk, $sk, $fv, $sv) = @_ ; + + print "# Fetch Key : expected '$fk' got '$fetch_key'\n" + if $fetch_key ne $fk ; + print "# Fetch Value : expected '$fv' got '$fetch_value'\n" + if $fetch_value ne $fv ; + print "# Store Key : expected '$sk' got '$store_key'\n" + if $store_key ne $sk ; + print "# Store Value : expected '$sv' got '$store_value'\n" + if $store_value ne $sv ; + print "# \$_ : expected 'original' got '$_'\n" + if $_ ne 'original' ; + return - $fetch_key eq $fk && $store_key eq $sk && + $fetch_key eq $fk && $store_key eq $sk && $fetch_value eq $fv && $store_value eq $sv && $_ eq 'original' ; } @@ -524,9 +549,13 @@ EOM ok(66, checkOutput( "", "fred", "joe", "")) ; ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; - ok(67, $db->FIRSTKEY() eq "fred") ; + my ($k, $v) ; + $k = 'fred'; + ok(67, ! $db->seq($k, $v, R_FIRST) ) ; + ok(68, $k eq "fred") ; + ok(69, $v eq "joe") ; # fk sk fv sv - ok(68, checkOutput( "fred", "", "", "")) ; + ok(70, checkOutput( "fred", "fred", "joe", "")) ; # replace the filters, but remember the previous set my ($old_fk) = $db->filter_fetch_key @@ -541,17 +570,20 @@ EOM ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; $h{"Fred"} = "Joe" ; # fk sk fv sv - ok(69, checkOutput( "", "fred", "", "Jxe")) ; + ok(71, checkOutput( "", "fred", "", "Jxe")) ; ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; - ok(70, $h{"Fred"} eq "[Jxe]"); + ok(72, $h{"Fred"} eq "[Jxe]"); # fk sk fv sv - ok(71, checkOutput( "", "fred", "[Jxe]", "")) ; + ok(73, checkOutput( "", "fred", "[Jxe]", "")) ; ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; - ok(72, $db->FIRSTKEY() eq "FRED") ; + $k = 'Fred'; $v =''; + ok(74, ! $db->seq($k, $v, R_FIRST) ) ; + ok(75, $k eq "FRED") ; + ok(76, $v eq "[Jxe]") ; # fk sk fv sv - ok(73, checkOutput( "FRED", "", "", "")) ; + ok(77, checkOutput( "FRED", "fred", "[Jxe]", "")) ; # put the original filters back $db->filter_fetch_key ($old_fk); @@ -561,15 +593,20 @@ EOM ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; $h{"fred"} = "joe" ; - ok(74, checkOutput( "", "fred", "", "joe")) ; + ok(78, checkOutput( "", "fred", "", "joe")) ; ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; - ok(75, $h{"fred"} eq "joe"); - ok(76, checkOutput( "", "fred", "joe", "")) ; + ok(79, $h{"fred"} eq "joe"); + ok(80, checkOutput( "", "fred", "joe", "")) ; ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; - ok(77, $db->FIRSTKEY() eq "fred") ; - ok(78, checkOutput( "fred", "", "", "")) ; + #ok(77, $db->FIRSTKEY() eq "fred") ; + $k = 'fred'; + ok(81, ! $db->seq($k, $v, R_FIRST) ) ; + ok(82, $k eq "fred") ; + ok(83, $v eq "joe") ; + # fk sk fv sv + ok(84, checkOutput( "fred", "fred", "joe", "")) ; # delete the filters $db->filter_fetch_key (undef); @@ -579,15 +616,18 @@ EOM ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; $h{"fred"} = "joe" ; - ok(79, checkOutput( "", "", "", "")) ; + ok(85, checkOutput( "", "", "", "")) ; ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; - ok(80, $h{"fred"} eq "joe"); - ok(81, checkOutput( "", "", "", "")) ; + ok(86, $h{"fred"} eq "joe"); + ok(87, checkOutput( "", "", "", "")) ; ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; - ok(82, $db->FIRSTKEY() eq "fred") ; - ok(83, checkOutput( "", "", "", "")) ; + $k = 'fred'; + ok(88, ! $db->seq($k, $v, R_FIRST) ) ; + ok(89, $k eq "fred") ; + ok(90, $v eq "joe") ; + ok(91, checkOutput( "", "", "", "")) ; undef $db ; untie %h; @@ -602,7 +642,7 @@ EOM my (%h, $db) ; unlink $Dfile; - ok(84, $db = tie(%h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_HASH ) ); + ok(92, $db = tie(%h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_HASH ) ); my %result = () ; @@ -626,32 +666,32 @@ EOM $_ = "original" ; $h{"fred"} = "joe" ; - ok(85, $result{"store key"} eq "store key - 1: [fred]"); - ok(86, $result{"store value"} eq "store value - 1: [joe]"); - ok(87, ! defined $result{"fetch key"} ); - ok(88, ! defined $result{"fetch value"} ); - ok(89, $_ eq "original") ; - - ok(90, $db->FIRSTKEY() eq "fred") ; - ok(91, $result{"store key"} eq "store key - 1: [fred]"); - ok(92, $result{"store value"} eq "store value - 1: [joe]"); - ok(93, $result{"fetch key"} eq "fetch key - 1: [fred]"); - ok(94, ! defined $result{"fetch value"} ); - ok(95, $_ eq "original") ; + ok(93, $result{"store key"} eq "store key - 1: [fred]"); + ok(94, $result{"store value"} eq "store value - 1: [joe]"); + ok(95, ! defined $result{"fetch key"} ); + ok(96, ! defined $result{"fetch value"} ); + ok(97, $_ eq "original") ; + + ok(98, $db->FIRSTKEY() eq "fred") ; + ok(99, $result{"store key"} eq "store key - 1: [fred]"); + ok(100, $result{"store value"} eq "store value - 1: [joe]"); + ok(101, $result{"fetch key"} eq "fetch key - 1: [fred]"); + ok(102, ! defined $result{"fetch value"} ); + ok(103, $_ eq "original") ; $h{"jim"} = "john" ; - ok(96, $result{"store key"} eq "store key - 2: [fred jim]"); - ok(97, $result{"store value"} eq "store value - 2: [joe john]"); - ok(98, $result{"fetch key"} eq "fetch key - 1: [fred]"); - ok(99, ! defined $result{"fetch value"} ); - ok(100, $_ eq "original") ; - - ok(101, $h{"fred"} eq "joe"); - ok(102, $result{"store key"} eq "store key - 3: [fred jim fred]"); - ok(103, $result{"store value"} eq "store value - 2: [joe john]"); - ok(104, $result{"fetch key"} eq "fetch key - 1: [fred]"); - ok(105, $result{"fetch value"} eq "fetch value - 1: [joe]"); - ok(106, $_ eq "original") ; + ok(104, $result{"store key"} eq "store key - 2: [fred jim]"); + ok(105, $result{"store value"} eq "store value - 2: [joe john]"); + ok(106, $result{"fetch key"} eq "fetch key - 1: [fred]"); + ok(107, ! defined $result{"fetch value"} ); + ok(108, $_ eq "original") ; + + ok(109, $h{"fred"} eq "joe"); + ok(110, $result{"store key"} eq "store key - 3: [fred jim fred]"); + ok(111, $result{"store value"} eq "store value - 2: [joe john]"); + ok(112, $result{"fetch key"} eq "fetch key - 1: [fred]"); + ok(113, $result{"fetch value"} eq "fetch value - 1: [joe]"); + ok(114, $_ eq "original") ; undef $db ; untie %h; @@ -665,12 +705,12 @@ EOM my (%h, $db) ; unlink $Dfile; - ok(107, $db = tie(%h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_HASH ) ); + ok(115, $db = tie(%h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_HASH ) ); $db->filter_store_key (sub { $_ = $h{$_} }) ; eval '$h{1} = 1234' ; - ok(108, $@ =~ /^recursion detected in filter_store_key at/ ); + ok(116, $@ =~ /^recursion detected in filter_store_key at/ ); undef $db ; untie %h; @@ -715,7 +755,7 @@ EOM unlink "fruit" ; } - ok(109, docat_del($file) eq <<'EOM') ; + ok(117, docat_del($file) eq <<'EOM') ; Banana Exists orange -> orange @@ -741,7 +781,7 @@ EOM tie %h, 'DB_File', $Dfile or die "Can't open file: $!\n" ; $h{ABC} = undef; - ok(110, $a eq "") ; + ok(118, $a eq "") ; untie %h ; unlink $Dfile; } @@ -760,7 +800,7 @@ EOM tie %h, 'DB_File', $Dfile or die "Can't open file: $!\n" ; %h = (); ; - ok(111, $a eq "") ; + ok(119, $a eq "") ; untie %h ; unlink $Dfile; } @@ -780,31 +820,170 @@ EOM my $bad_key = 0 ; my %h = () ; my $db ; - ok(112, $db = tie(%h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_HASH ) ); + ok(120, $db = tie(%h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_HASH ) ); $db->filter_fetch_key (sub { $_ =~ s/^Beta_/Alpha_/ if defined $_}) ; $db->filter_store_key (sub { $bad_key = 1 if /^Beta_/ ; $_ =~ s/^Alpha_/Beta_/}) ; $h{'Alpha_ABC'} = 2 ; $h{'Alpha_DEF'} = 5 ; - ok(113, $h{'Alpha_ABC'} == 2); - ok(114, $h{'Alpha_DEF'} == 5); + ok(121, $h{'Alpha_ABC'} == 2); + ok(122, $h{'Alpha_DEF'} == 5); my ($k, $v) = ("",""); while (($k, $v) = each %h) {} - ok(115, $bad_key == 0); + ok(123, $bad_key == 0); $bad_key = 0 ; foreach $k (keys %h) {} - ok(116, $bad_key == 0); + ok(124, $bad_key == 0); $bad_key = 0 ; foreach $v (values %h) {} - ok(117, $bad_key == 0); + ok(125, $bad_key == 0); undef $db ; untie %h ; unlink $Dfile; } +{ + # now an error to pass 'hash' a non-code reference + my $dbh = new DB_File::HASHINFO ; + + eval { $dbh->{hash} = 2 }; + ok(126, $@ =~ /^Key 'hash' not associated with a code reference at/); + +} + + +#{ +# # recursion detection in hash +# my %hash ; +# my $Dfile = "xxx.db"; +# unlink $Dfile; +# my $dbh = new DB_File::HASHINFO ; +# $dbh->{hash} = sub { $hash{3} = 4 ; length $_[0] } ; +# +# +# ok(127, tie(%hash, 'DB_File',$Dfile, O_RDWR|O_CREAT, 0640, $dbh ) ); +# +# eval { $hash{1} = 2; +# $hash{4} = 5; +# }; +# +# ok(128, $@ =~ /^DB_File hash callback: recursion detected/); +# { +# no warnings; +# untie %hash; +# } +# unlink $Dfile; +#} + +ok(127,1); +ok(128,1); + +{ + # Check that two hash's don't interact + my %hash1 ; + my %hash2 ; + my $h1_count = 0; + my $h2_count = 0; + unlink $Dfile, $Dfile2; + my $dbh1 = new DB_File::HASHINFO ; + $dbh1->{hash} = sub { ++ $h1_count ; length $_[0] } ; + + my $dbh2 = new DB_File::HASHINFO ; + $dbh2->{hash} = sub { ++ $h2_count ; length $_[0] } ; + + + + my (%h); + ok(129, tie(%hash1, 'DB_File',$Dfile, O_RDWR|O_CREAT, 0640, $dbh1 ) ); + ok(130, tie(%hash2, 'DB_File',$Dfile2, O_RDWR|O_CREAT, 0640, $dbh2 ) ); + + $hash1{DEFG} = 5; + $hash1{XYZ} = 2; + $hash1{ABCDE} = 5; + + $hash2{defg} = 5; + $hash2{xyz} = 2; + $hash2{abcde} = 5; + + ok(131, $h1_count > 0); + ok(132, $h1_count == $h2_count); + + ok(133, safeUntie \%hash1); + ok(134, safeUntie \%hash2); + unlink $Dfile, $Dfile2; +} + +{ + # Passing undef for flags and/or mode when calling tie could cause + # Use of uninitialized value in subroutine entry + + + my $warn_count = 0 ; + #local $SIG{__WARN__} = sub { ++ $warn_count }; + my %hash1; + unlink $Dfile; + + tie %hash1, 'DB_File',$Dfile, undef; + ok(135, $warn_count == 0); + $warn_count = 0; + tie %hash1, 'DB_File',$Dfile, O_RDWR|O_CREAT, undef; + ok(136, $warn_count == 0); + tie %hash1, 'DB_File',$Dfile, undef, undef; + ok(137, $warn_count == 0); + $warn_count = 0; + + unlink $Dfile; +} + +{ + # Check that DBM Filter can cope with read-only $_ + + use warnings ; + use strict ; + my (%h, $db) ; + my $Dfile = "xxy.db"; + unlink $Dfile; + + ok(138, $db = tie(%h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_HASH ) ); + + $db->filter_fetch_key (sub { }) ; + $db->filter_store_key (sub { }) ; + $db->filter_fetch_value (sub { }) ; + $db->filter_store_value (sub { }) ; + + $_ = "original" ; + + $h{"fred"} = "joe" ; + ok(139, $h{"fred"} eq "joe"); + + eval { grep { $h{$_} } (1, 2, 3) }; + ok (140, ! $@); + + + # delete the filters + $db->filter_fetch_key (undef); + $db->filter_store_key (undef); + $db->filter_fetch_value (undef); + $db->filter_store_value (undef); + + $h{"fred"} = "joe" ; + + ok(141, $h{"fred"} eq "joe"); + + ok(142, $db->FIRSTKEY() eq "fred") ; + + eval { grep { $h{$_} } (1, 2, 3) }; + ok (143, ! $@); + + undef $db ; + untie %h; + unlink $Dfile; +} + + exit ; diff --git a/ext/DB_File/t/db-recno.t b/ext/DB_File/t/db-recno.t index 9387e334e7..88ad9e0b5e 100755 --- a/ext/DB_File/t/db-recno.t +++ b/ext/DB_File/t/db-recno.t @@ -89,6 +89,15 @@ sub docat_del return $result; } +sub safeUntie +{ + my $hashref = shift ; + my $no_inner = 1; + local $SIG{__WARN__} = sub {-- $no_inner } ; + untie @$hashref; + return $no_inner; +} + sub bad_one { unless ($bad_ones++) { @@ -103,7 +112,7 @@ EOM && $Config{db_version_patch} == 0) { print STDERR <<EOM ; # -# For example Mac OS X 10.1.5 (or earlier) has such an old +# For example Mac OS X 10.2 (or earlier) has such an old # version of Berkeley DB. EOM } @@ -141,8 +150,8 @@ BEGIN } } -my $splice_tests = 10 + 11 + 1; # ten regressions, 11 warnings, plus the randoms -my $total_tests = 138 ; +my $splice_tests = 10 + 12 + 1; # ten regressions, plus the randoms +my $total_tests = 158 ; $total_tests += $splice_tests if $FA ; print "1..$total_tests\n"; @@ -313,7 +322,7 @@ ok(57, $@ =~ '^Modification of non-creatable array value attempted' ); # IMPORTANT - $X must be undefined before the untie otherwise the # underlying DB close routine will not get called. undef $X ; -untie(@h); +ok(58, safeUntie \@h); unlink $Dfile; @@ -323,14 +332,14 @@ unlink $Dfile; my @h = () ; my $dbh = new DB_File::RECNOINFO ; - ok(58, tie @h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $dbh ) ; + ok(59, tie @h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $dbh ) ; $h[0] = "abc" ; $h[1] = "def" ; $h[3] = "ghi" ; - untie @h ; + ok(60, safeUntie \@h); my $x = docat($Dfile) ; unlink $Dfile; - ok(59, $x eq "abc\ndef\n\nghi\n") ; + ok(61, $x eq "abc\ndef\n\nghi\n") ; } { @@ -339,16 +348,16 @@ unlink $Dfile; my @h = () ; my $dbh = new DB_File::RECNOINFO ; $dbh->{bval} = "-" ; - ok(60, tie @h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $dbh ) ; + ok(62, tie @h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $dbh ) ; $h[0] = "abc" ; $h[1] = "def" ; $h[3] = "ghi" ; - untie @h ; + ok(63, safeUntie \@h); my $x = docat($Dfile) ; unlink $Dfile; my $ok = ($x eq "abc-def--ghi-") ; bad_one() unless $ok ; - ok(61, $ok) ; + ok(64, $ok) ; } { @@ -358,16 +367,16 @@ unlink $Dfile; my $dbh = new DB_File::RECNOINFO ; $dbh->{flags} = R_FIXEDLEN ; $dbh->{reclen} = 5 ; - ok(62, tie @h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $dbh ) ; + ok(65, tie @h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $dbh ) ; $h[0] = "abc" ; $h[1] = "def" ; $h[3] = "ghi" ; - untie @h ; + ok(66, safeUntie \@h); my $x = docat($Dfile) ; unlink $Dfile; my $ok = ($x eq "abc def ghi ") ; bad_one() unless $ok ; - ok(63, $ok) ; + ok(67, $ok) ; } { @@ -378,16 +387,16 @@ unlink $Dfile; $dbh->{flags} = R_FIXEDLEN ; $dbh->{bval} = "-" ; $dbh->{reclen} = 5 ; - ok(64, tie @h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $dbh ) ; + ok(68, tie @h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $dbh ) ; $h[0] = "abc" ; $h[1] = "def" ; $h[3] = "ghi" ; - untie @h ; + ok(69, safeUntie \@h); my $x = docat($Dfile) ; unlink $Dfile; my $ok = ($x eq "abc--def-------ghi--") ; bad_one() unless $ok ; - ok(65, $ok) ; + ok(70, $ok) ; } { @@ -396,7 +405,7 @@ unlink $Dfile; my $filename = "xyz" ; my %x ; eval { tie %x, 'DB_File', $filename, O_RDWR|O_CREAT, 0640, $DB_RECNO ; } ; - ok(66, $@ =~ /^DB_File can only tie an array to a DB_RECNO database/) ; + ok(71, $@ =~ /^DB_File can only tie an array to a DB_RECNO database/) ; unlink $filename ; } @@ -463,7 +472,7 @@ EOM BEGIN { push @INC, '.'; } eval 'use SubDB ; '; - main::ok(67, $@ eq "") ; + main::ok(72, $@ eq "") ; my @h ; my $X ; eval ' @@ -471,27 +480,27 @@ EOM ' ; die "Could not tie: $!" unless $X; - main::ok(68, $@ eq "") ; + main::ok(73, $@ eq "") ; my $ret = eval '$h[3] = 3 ; return $h[3] ' ; - main::ok(69, $@ eq "") ; - main::ok(70, $ret == 5) ; + main::ok(74, $@ eq "") ; + main::ok(75, $ret == 5) ; my $value = 0; $ret = eval '$X->put(1, 4) ; $X->get(1, $value) ; return $value' ; - main::ok(71, $@ eq "") ; - main::ok(72, $ret == 10) ; + main::ok(76, $@ eq "") ; + main::ok(77, $ret == 10) ; $ret = eval ' R_NEXT eq main::R_NEXT ' ; - main::ok(73, $@ eq "" ) ; - main::ok(74, $ret == 1) ; + main::ok(78, $@ eq "" ) ; + main::ok(79, $ret == 1) ; $ret = eval '$X->A_new_method(1) ' ; - main::ok(75, $@ eq "") ; - main::ok(76, $ret eq "[[11]]") ; + main::ok(80, $@ eq "") ; + main::ok(81, $ret eq "[[11]]") ; undef $X; - untie(@h); + main::ok(82, main::safeUntie \@h); unlink "SubDB.pm", "recno.tmp" ; } @@ -501,52 +510,52 @@ EOM # test $# my $self ; unlink $Dfile; - ok(77, $self = tie @h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_RECNO ) ; + ok(83, $self = tie @h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_RECNO ) ; $h[0] = "abc" ; $h[1] = "def" ; $h[2] = "ghi" ; $h[3] = "jkl" ; - ok(78, $FA ? $#h == 3 : $self->length() == 4) ; + ok(84, $FA ? $#h == 3 : $self->length() == 4) ; undef $self ; - untie @h ; + ok(85, safeUntie \@h); my $x = docat($Dfile) ; - ok(79, $x eq "abc\ndef\nghi\njkl\n") ; + ok(86, $x eq "abc\ndef\nghi\njkl\n") ; # $# sets array to same length - ok(80, $self = tie @h, 'DB_File', $Dfile, O_RDWR, 0640, $DB_RECNO ) ; + ok(87, $self = tie @h, 'DB_File', $Dfile, O_RDWR, 0640, $DB_RECNO ) ; if ($FA) { $#h = 3 } else { $self->STORESIZE(4) } - ok(81, $FA ? $#h == 3 : $self->length() == 4) ; + ok(88, $FA ? $#h == 3 : $self->length() == 4) ; undef $self ; - untie @h ; + ok(89, safeUntie \@h); $x = docat($Dfile) ; - ok(82, $x eq "abc\ndef\nghi\njkl\n") ; + ok(90, $x eq "abc\ndef\nghi\njkl\n") ; # $# sets array to bigger - ok(83, $self = tie @h, 'DB_File', $Dfile, O_RDWR, 0640, $DB_RECNO ) ; + ok(91, $self = tie @h, 'DB_File', $Dfile, O_RDWR, 0640, $DB_RECNO ) ; if ($FA) { $#h = 6 } else { $self->STORESIZE(7) } - ok(84, $FA ? $#h == 6 : $self->length() == 7) ; + ok(92, $FA ? $#h == 6 : $self->length() == 7) ; undef $self ; - untie @h ; + ok(93, safeUntie \@h); $x = docat($Dfile) ; - ok(85, $x eq "abc\ndef\nghi\njkl\n\n\n\n") ; + ok(94, $x eq "abc\ndef\nghi\njkl\n\n\n\n") ; # $# sets array smaller - ok(86, $self = tie @h, 'DB_File', $Dfile, O_RDWR, 0640, $DB_RECNO ) ; + ok(95, $self = tie @h, 'DB_File', $Dfile, O_RDWR, 0640, $DB_RECNO ) ; if ($FA) { $#h = 2 } else { $self->STORESIZE(3) } - ok(87, $FA ? $#h == 2 : $self->length() == 3) ; + ok(96, $FA ? $#h == 2 : $self->length() == 3) ; undef $self ; - untie @h ; + ok(97, safeUntie \@h); $x = docat($Dfile) ; - ok(88, $x eq "abc\ndef\nghi\n") ; + ok(98, $x eq "abc\ndef\nghi\n") ; unlink $Dfile; @@ -564,13 +573,25 @@ EOM sub checkOutput { my($fk, $sk, $fv, $sv) = @_ ; + + print "# Fetch Key : expected '$fk' got '$fetch_key'\n" + if $fetch_key ne $fk ; + print "# Fetch Value : expected '$fv' got '$fetch_value'\n" + if $fetch_value ne $fv ; + print "# Store Key : expected '$sk' got '$store_key'\n" + if $store_key ne $sk ; + print "# Store Value : expected '$sv' got '$store_value'\n" + if $store_value ne $sv ; + print "# \$_ : expected 'original' got '$_'\n" + if $_ ne 'original' ; + return - $fetch_key eq $fk && $store_key eq $sk && + $fetch_key eq $fk && $store_key eq $sk && $fetch_value eq $fv && $store_value eq $sv && $_ eq 'original' ; } - ok(89, $db = tie(@h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_RECNO ) ); + ok(99, $db = tie(@h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_RECNO ) ); $db->filter_fetch_key (sub { $fetch_key = $_ }) ; $db->filter_store_key (sub { $store_key = $_ }) ; @@ -581,17 +602,17 @@ EOM $h[0] = "joe" ; # fk sk fv sv - ok(90, checkOutput( "", 0, "", "joe")) ; + ok(100, checkOutput( "", 0, "", "joe")) ; ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; - ok(91, $h[0] eq "joe"); + ok(101, $h[0] eq "joe"); # fk sk fv sv - ok(92, checkOutput( "", 0, "joe", "")) ; + ok(102, checkOutput( "", 0, "joe", "")) ; ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; - ok(93, $db->FIRSTKEY() == 0) ; + ok(103, $db->FIRSTKEY() == 0) ; # fk sk fv sv - ok(94, checkOutput( 0, "", "", "")) ; + ok(104, checkOutput( 0, "", "", "")) ; # replace the filters, but remember the previous set my ($old_fk) = $db->filter_fetch_key @@ -606,17 +627,17 @@ EOM ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; $h[1] = "Joe" ; # fk sk fv sv - ok(95, checkOutput( "", 2, "", "Jxe")) ; + ok(105, checkOutput( "", 2, "", "Jxe")) ; ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; - ok(96, $h[1] eq "[Jxe]"); + ok(106, $h[1] eq "[Jxe]"); # fk sk fv sv - ok(97, checkOutput( "", 2, "[Jxe]", "")) ; + ok(107, checkOutput( "", 2, "[Jxe]", "")) ; ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; - ok(98, $db->FIRSTKEY() == 1) ; + ok(108, $db->FIRSTKEY() == 1) ; # fk sk fv sv - ok(99, checkOutput( 1, "", "", "")) ; + ok(109, checkOutput( 1, "", "", "")) ; # put the original filters back $db->filter_fetch_key ($old_fk); @@ -626,15 +647,15 @@ EOM ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; $h[0] = "joe" ; - ok(100, checkOutput( "", 0, "", "joe")) ; + ok(110, checkOutput( "", 0, "", "joe")) ; ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; - ok(101, $h[0] eq "joe"); - ok(102, checkOutput( "", 0, "joe", "")) ; + ok(111, $h[0] eq "joe"); + ok(112, checkOutput( "", 0, "joe", "")) ; ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; - ok(103, $db->FIRSTKEY() == 0) ; - ok(104, checkOutput( 0, "", "", "")) ; + ok(113, $db->FIRSTKEY() == 0) ; + ok(114, checkOutput( 0, "", "", "")) ; # delete the filters $db->filter_fetch_key (undef); @@ -644,18 +665,18 @@ EOM ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; $h[0] = "joe" ; - ok(105, checkOutput( "", "", "", "")) ; + ok(115, checkOutput( "", "", "", "")) ; ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; - ok(106, $h[0] eq "joe"); - ok(107, checkOutput( "", "", "", "")) ; + ok(116, $h[0] eq "joe"); + ok(117, checkOutput( "", "", "", "")) ; ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; - ok(108, $db->FIRSTKEY() == 0) ; - ok(109, checkOutput( "", "", "", "")) ; + ok(118, $db->FIRSTKEY() == 0) ; + ok(119, checkOutput( "", "", "", "")) ; undef $db ; - untie @h; + ok(120, safeUntie \@h); unlink $Dfile; } @@ -667,7 +688,7 @@ EOM my (@h, $db) ; unlink $Dfile; - ok(110, $db = tie(@h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_RECNO ) ); + ok(121, $db = tie(@h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_RECNO ) ); my %result = () ; @@ -691,35 +712,35 @@ EOM $_ = "original" ; $h[0] = "joe" ; - ok(111, $result{"store key"} eq "store key - 1: [0]"); - ok(112, $result{"store value"} eq "store value - 1: [joe]"); - ok(113, ! defined $result{"fetch key"} ); - ok(114, ! defined $result{"fetch value"} ); - ok(115, $_ eq "original") ; - - ok(116, $db->FIRSTKEY() == 0 ) ; - ok(117, $result{"store key"} eq "store key - 1: [0]"); - ok(118, $result{"store value"} eq "store value - 1: [joe]"); - ok(119, $result{"fetch key"} eq "fetch key - 1: [0]"); - ok(120, ! defined $result{"fetch value"} ); - ok(121, $_ eq "original") ; - - $h[7] = "john" ; - ok(122, $result{"store key"} eq "store key - 2: [0 7]"); - ok(123, $result{"store value"} eq "store value - 2: [joe john]"); - ok(124, $result{"fetch key"} eq "fetch key - 1: [0]"); + ok(122, $result{"store key"} eq "store key - 1: [0]"); + ok(123, $result{"store value"} eq "store value - 1: [joe]"); + ok(124, ! defined $result{"fetch key"} ); ok(125, ! defined $result{"fetch value"} ); ok(126, $_ eq "original") ; - ok(127, $h[0] eq "joe"); - ok(128, $result{"store key"} eq "store key - 3: [0 7 0]"); - ok(129, $result{"store value"} eq "store value - 2: [joe john]"); + ok(127, $db->FIRSTKEY() == 0 ) ; + ok(128, $result{"store key"} eq "store key - 1: [0]"); + ok(129, $result{"store value"} eq "store value - 1: [joe]"); ok(130, $result{"fetch key"} eq "fetch key - 1: [0]"); - ok(131, $result{"fetch value"} eq "fetch value - 1: [joe]"); + ok(131, ! defined $result{"fetch value"} ); ok(132, $_ eq "original") ; + $h[7] = "john" ; + ok(133, $result{"store key"} eq "store key - 2: [0 7]"); + ok(134, $result{"store value"} eq "store value - 2: [joe john]"); + ok(135, $result{"fetch key"} eq "fetch key - 1: [0]"); + ok(136, ! defined $result{"fetch value"} ); + ok(137, $_ eq "original") ; + + ok(138, $h[0] eq "joe"); + ok(139, $result{"store key"} eq "store key - 3: [0 7 0]"); + ok(140, $result{"store value"} eq "store value - 2: [joe john]"); + ok(141, $result{"fetch key"} eq "fetch key - 1: [0]"); + ok(142, $result{"fetch value"} eq "fetch value - 1: [joe]"); + ok(143, $_ eq "original") ; + undef $db ; - untie @h; + ok(144, safeUntie \@h); unlink $Dfile; } @@ -730,15 +751,15 @@ EOM my (@h, $db) ; unlink $Dfile; - ok(133, $db = tie(@h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_RECNO ) ); + ok(145, $db = tie(@h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_RECNO ) ); $db->filter_store_key (sub { $_ = $h[0] }) ; eval '$h[1] = 1234' ; - ok(134, $@ =~ /^recursion detected in filter_store_key at/ ); + ok(146, $@ =~ /^recursion detected in filter_store_key at/ ); undef $db ; - untie @h; + ok(147, safeUntie \@h); unlink $Dfile; } @@ -793,7 +814,7 @@ EOM unlink $filename ; } - ok(135, docat_del($file) eq <<'EOM') ; + ok(148, docat_del($file) eq <<'EOM') ; The array contains 5 entries popped black shifted white @@ -878,7 +899,7 @@ EOM unlink $file ; } - ok(136, docat_del($save_output) eq <<'EOM') ; + ok(149, docat_del($save_output) eq <<'EOM') ; ORIGINAL 0: zero @@ -926,8 +947,8 @@ EOM tie @h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0664, $DB_RECNO or die "Can't open file: $!\n" ; $h[0] = undef; - ok(137, $a eq "") ; - untie @h ; + ok(150, $a eq "") ; + ok(151, safeUntie \@h); unlink $Dfile; } @@ -946,11 +967,53 @@ EOM tie @h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0664, $DB_RECNO or die "Can't open file: $!\n" ; @h = (); ; - ok(138, $a eq "") ; - untie @h ; + ok(152, $a eq "") ; + ok(153, safeUntie \@h); unlink $Dfile; } +{ + # Check that DBM Filter can cope with read-only $_ + + use warnings ; + use strict ; + my (@h, $db) ; + unlink $Dfile; + + ok(154, $db = tie(@h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_RECNO ) ); + + $db->filter_fetch_key (sub { }) ; + $db->filter_store_key (sub { }) ; + $db->filter_fetch_value (sub { }) ; + $db->filter_store_value (sub { }) ; + + $_ = "original" ; + + $h[0] = "joe" ; + ok(155, $h[0] eq "joe"); + + eval { grep { $h[$_] } (1, 2, 3) }; + ok (156, ! $@); + + + # delete the filters + $db->filter_fetch_key (undef); + $db->filter_store_key (undef); + $db->filter_fetch_value (undef); + $db->filter_store_value (undef); + + $h[1] = "joe" ; + + ok(157, $h[1] eq "joe"); + + eval { grep { $h[$_] } (1, 2, 3) }; + ok (158, ! $@); + + undef $db ; + untie @h; + unlink $Dfile; +} + # Only test splice if this is a newish version of Perl exit unless $FA ; @@ -978,36 +1041,36 @@ exit unless $FA ; my $offset ; $a = ''; splice(@a, $offset); - ok(139, $a =~ /^Use of uninitialized value /); + ok(159, $a =~ /^Use of uninitialized value /); $a = ''; splice(@tied, $offset); - ok(140, $a =~ /^Use of uninitialized value in splice/); + ok(160, $a =~ /^Use of uninitialized value in splice/); no warnings 'uninitialized'; $a = ''; splice(@a, $offset); - ok(141, $a eq ''); + ok(161, $a eq ''); $a = ''; splice(@tied, $offset); - ok(142, $a eq ''); + ok(162, $a eq ''); # uninitialized length use warnings; my $length ; $a = ''; splice(@a, 0, $length); - ok(143, $a =~ /^Use of uninitialized value /); + ok(163, $a =~ /^Use of uninitialized value /); $a = ''; splice(@tied, 0, $length); - ok(144, $a =~ /^Use of uninitialized value in splice/); + ok(164, $a =~ /^Use of uninitialized value in splice/); no warnings 'uninitialized'; $a = ''; splice(@a, 0, $length); - ok(145, $a eq ''); + ok(165, $a eq ''); $a = ''; splice(@tied, 0, $length); - ok(146, $a eq ''); + ok(166, $a eq ''); # offset past end of array use warnings; @@ -1016,17 +1079,17 @@ exit unless $FA ; my $splice_end_array = ($a =~ /^splice\(\) offset past end of array/); $a = ''; splice(@tied, 3); - ok(147, !$splice_end_array || $a =~ /^splice\(\) offset past end of array/); + ok(167, !$splice_end_array || $a =~ /^splice\(\) offset past end of array/); no warnings 'misc'; $a = ''; splice(@a, 3); - ok(148, $a eq ''); + ok(168, $a eq ''); $a = ''; splice(@tied, 3); - ok(149, $a eq ''); + ok(169, $a eq ''); - untie @tied; + ok(170, safeUntie \@tied); unlink $Dfile; } @@ -1087,7 +1150,7 @@ my @tests = ([ [ 'falsely', 'dinosaur', 'remedy', 'commotion', 'void' ], ); -my $testnum = 150; +my $testnum = 171; my $failed = 0; require POSIX; my $tmp = POSIX::tmpnam(); foreach my $test (@tests) { @@ -1124,7 +1187,8 @@ else { ok($testnum++, not $failed); } -die if $testnum != $total_tests + 1; +die "testnum ($testnum) != total_tests ($total_tests) + 1" + if $testnum != $total_tests + 1; exit ; @@ -1283,6 +1347,8 @@ sub test_splice { . Dumper(\@array) . ' vs ' . Dumper(\@h)) if list_diff(\@array, \@h); + unlink $tmp; + return undef; # success } @@ -1360,3 +1426,5 @@ sub rand_word { } return $r; } + + diff --git a/ext/DB_File/typemap b/ext/DB_File/typemap index 55439ee76d..8ad7b1282d 100644 --- a/ext/DB_File/typemap +++ b/ext/DB_File/typemap @@ -15,19 +15,21 @@ DBTKEY T_dbtkeydatum INPUT T_dbtkeydatum - ckFilter($arg, filter_store_key, \"filter_store_key\"); + DBM_ckFilter($arg, filter_store_key, \"filter_store_key\"); DBT_clear($var) ; - if (db->type != DB_RECNO) { - $var.data = SvPV($arg, PL_na); - $var.size = (int)PL_na; - } - else { - Value = GetRecnoKey(aTHX_ db, SvIV($arg)) ; - $var.data = & Value; - $var.size = (int)sizeof(recno_t); + if (SvOK($arg)){ + if (db->type != DB_RECNO) { + $var.data = SvPV($arg, PL_na); + $var.size = (int)PL_na; + } + else { + Value = GetRecnoKey(aTHX_ db, SvIV($arg)) ; + $var.data = & Value; + $var.size = (int)sizeof(recno_t); + } } T_dbtdatum - ckFilter($arg, filter_store_value, \"filter_store_value\"); + DBM_ckFilter($arg, filter_store_value, \"filter_store_value\"); DBT_clear($var) ; if (SvOK($arg)) { $var.data = SvPV($arg, PL_na); diff --git a/ext/Devel/PPPort/PPPort.pm b/ext/Devel/PPPort/PPPort.pm index 1b4d585385..b426fd20ab 100644 --- a/ext/Devel/PPPort/PPPort.pm +++ b/ext/Devel/PPPort/PPPort.pm @@ -434,6 +434,15 @@ __DATA__ # define aTHX_ #endif +/* IV could also be a quad (say, a long long), but Perls + * capable of those should have IVSIZE already. */ +#if !defined(IVSIZE) && defined(LONGSIZE) +# define IVSIZE LONGSIZE +#endif +#ifndef IVSIZE +# define IVSIZE 4 /* A bold guess, but the best we can make. */ +#endif + #ifndef UVSIZE # define UVSIZE IVSIZE #endif @@ -649,7 +658,6 @@ SV *sv; #else /* single interpreter */ - #define START_MY_CXT static my_cxt_t my_cxt; #define dMY_CXT_SV dNOOP #define dMY_CXT dNOOP @@ -720,6 +728,18 @@ SV *sv; # define SvPVbyte SvPV #endif +#ifndef SvPV_nolen +# define SvPV_nolen(sv) \ + ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ + ? SvPVX(sv) : sv_2pv_nolen(sv)) + static char * + sv_2pv_nolen(pTHX_ register SV *sv) + { + STRLEN n_a; + return sv_2pv(sv, &n_a); + } +#endif + #endif /* _P_P_PORTABILITY_H_ */ /* End of File ppport.h */ diff --git a/ext/Devel/Peek/Peek.t b/ext/Devel/Peek/Peek.t index 80732a417a..a9103db9e4 100644 --- a/ext/Devel/Peek/Peek.t +++ b/ext/Devel/Peek/Peek.t @@ -1,4 +1,4 @@ -#!./perl +#!./perl -T BEGIN { chdir 't' if -d 't'; @@ -12,7 +12,7 @@ BEGIN { use Devel::Peek; -print "1..19\n"; +print "1..21\n"; our $DEBUG = 0; open(SAVERR, ">&STDERR") or die "Can't dup STDERR: $!"; @@ -31,7 +31,7 @@ sub do_test { print $pattern, "\n" if $DEBUG; my $dump = <IN>; print $dump, "\n" if $DEBUG; - print "[$dump] vs [$pattern]\nnot " unless $dump =~ /$pattern/ms; + print "[$dump] vs [$pattern]\nnot " unless $dump =~ /\A$pattern\Z/ms; print "ok $_[0]\n"; close(IN); return $1; @@ -392,6 +392,49 @@ do_test(19, LEN = \\d+'); } +my $x=""; +$x=~/.??/g; +do_test(20, + $x, +'SV = PVMG\\($ADDR\\) at $ADDR + REFCNT = 1 + FLAGS = \\(PADBUSY,PADMY,SMG,POK,pPOK\\) + IV = 0 + NV = 0 + PV = $ADDR ""\\\0 + CUR = 0 + LEN = 1 + MAGIC = $ADDR + MG_VIRTUAL = &PL_vtbl_mglob + MG_TYPE = PERL_MAGIC_regex_global\\(g\\) + MG_FLAGS = 0x01 + MINMATCH'); + +# +# TAINTEDDIR is not set on: OS2, AMIGAOS, WIN32, MSDOS +# environment variables may be invisibly case-forced, hence the (?i:PATH) +# +do_test(21, + $ENV{PATH}=@ARGV, # scalar(@ARGV) is a handy known tainted value +'SV = PVMG\\($ADDR\\) at $ADDR + REFCNT = 1 + FLAGS = \\(GMG,SMG,RMG,pIOK,pPOK\\) + IV = 0 + NV = 0 + PV = $ADDR "0"\\\0 + CUR = 1 + LEN = \d+ + MAGIC = $ADDR + MG_VIRTUAL = &PL_vtbl_envelem + MG_TYPE = PERL_MAGIC_envelem\\(e\\) +(?: MG_FLAGS = 0x01 + TAINTEDDIR +)? MG_LEN = 4 + MG_PTR = $ADDR "(?i:PATH)" + MAGIC = $ADDR + MG_VIRTUAL = &PL_vtbl_taint + MG_TYPE = PERL_MAGIC_taint\\(t\\)'); + END { 1 while unlink("peek$$"); } diff --git a/ext/Encode/AUTHORS b/ext/Encode/AUTHORS index 1c8dfc606e..01d3530ac6 100644 --- a/ext/Encode/AUTHORS +++ b/ext/Encode/AUTHORS @@ -24,6 +24,7 @@ H.Merijn Brand <h.m.brand@hccnet.nl> Jarkko Hietaniemi <jhi@iki.fi> Jungshik Shin <jshin@mailaps.org> Laszlo Molnar <ml1050@freemail.hu> +MORIYAMA Masayuki <msyk@mtg.biglobe.ne.jp> Mark-Jason Dominus <mjd@plover.com> Mattia Barbon <mbarbon@dsi.unive.it> Michael G Schwern <schwern@pobox.com> diff --git a/ext/Encode/Changes b/ext/Encode/Changes index 3658d44aea..52cbda3334 100644 --- a/ext/Encode/Changes +++ b/ext/Encode/Changes @@ -1,9 +1,104 @@ # Revision history for Perl extension Encode. # -# $Id: Changes,v 1.75 2002/06/01 18:07:49 dankogai Exp dankogai $ +# $Id: Changes,v 1.80 2002/10/21 20:39:09 dankogai Exp dankogai $ # -$Revision: 1.75 $ $Date: 2002/06/01 18:07:49 $ +$Revision: 1.80 $ $Date: 2002/10/21 20:39:09 $ +! Encode.xs t/mime-header.t + Even more patches from NI-XS regarding Encode::utf8->decode(). + And one more test to t/mime-header.t to prove it + Message-Id: <E183i0Y-0003mo-00@mserv1c.vianw.co.uk> + +1.79 2002/10/21 06:05:37 +! Encode.xs + Further patches from NI-XS. Encode::utf8->decode() now checks the + value of utf8 flag of the argument. As a result, the fix to + lib/Encode/MIME/Header.pm is no longer neccessary but since it did + no harm (even speedwise) I'll leave it unreverted. +! ucm/cp949.ucm ucm/cp950.ucm + U+20AC EURO SIGN + U+00AE REGISTERED SIGN + were missing as a result of 1.78. Discovered by Moriyama-san. + Moriyama-san has also developed a test script that compares + (en|de)coded results to the corresponding Win32 API result and + all cp9?? maps are now verified. + Message-Id: <20021021025220.3AED.MSYK@mtg.biglobe.ne.jp> + +1.78 2002/10/20 15:44:00 +! lib/Encode/MIME/Header.pm + fixed so that it works with new Encode::utf8 +! Encode.pm Encode.xs + Encode::utf8 is now in Encode.xs by Nick In-XS. This allows + :encoding(UTF-8) to handle partial chars at end of buffers + correctly. + Message-Id: <20021020134935.2079.3@bactrian.ni-s.u-net.com> +! lib/Encode/Supported.pod + More nitpickings applied. ++ t/rt.pl MANIFEST +! t/CJKT.t + Moriyama-san has discovered a serious bug in t/CJKT.t; its roundtrip + tests were completely useless. To redeem that and get the peace of + mind again, I wrote t/rt.pl to test ALL '|0' ENTRIES in all + ucm/*.ucm Since this script takes too long to finish (30 seconds on + PIII-800MHz, FreeBSD), it is deliberately excluded from 'make test' + but you can easily run that by either renaming it or: + perl -Mblib t/rt.pl + Message-Id: <20021019065420.0C48.MSYK@mtg.biglobe.ne.jp> +! ucm/cp936.ucm ucm/cp949.ucm ucm/cp950.ucm + Other CJKT cp9?? also updated according to the URI below; + http://www.microsoft.com/typography/unicode/cscp.htm ++ bin/ucmsort MANIFEST + ucmsort is a crude utility that sorts CHARMAP entries in UCM files + to proper order. intended for hardcore develpers only. +! ucm/cp932.ucm JP/JP.pm AUTHORS + CP932 mapping which was based upon the mapping file at unicode.org + was found obsolete by MORIYAMA Masayuki msyk@mtg.biglobe.ne.jp>. He + has also supplied the patch so he was added to AUTHORS. +! lib/Encode/Supported.pod + ISO-8859-11 != TIS 620 + == TIS 620 + \xA0 ( ) + Message-Id: + <DC504E9C3384054C8506D3E6BB012460810D23@bsebe001.americas.nokia.com> + +1.77 2002/10/06 03:27:02 +! t/jperl.t + * Modified to accomodate up and comming patch by Inaba-san that + will fix tr/// needing eval qq{} + Message-Id: <9F78A19C-D6C3-11D6-BAC6-0003939A104C@dan.co.jp> +! encoding.pm + * pod fixes/enhancements to reflect the changes above +! lib/Encode/Alias.pm + "Encode::TW is correct, Encode::Alias not." - /Autrijus/ + Message-Id: <20021001015648.GB18710@not.autrijus.org> + +1.76 2002/08/25 15:09:51 +! t/big5-eten.utf + To reflect ucm change by Autrijus. t/big5-eten.enc was regenerated + but naturally identical to previous version -- dankogai +! ucm/big5-eten.ucm + Codepoint fixes -- autrijus + Message-Id: <20020805040236.GC5220@not.autrijus.org> += * + copied everything under perl-5.8.0/ext/Encode to make sure Encode + is in sync w/ perl core +! t/CJKT.t t/guess.t + Change 17175 by jhi@alpha on 2002/06/10 23:24:42 + Now that binmode(FH) does implicit ":bytes" revisit + the failing tests. The worrisome one is the Digest::MD5 + test-- how will it fare in CRLF lands now? +! t/CJKT.t t/guess.t + From: Radu Greab <radu@netsoft.ro> + Date: Mon, 10 Jun 2002 00:40:34 +0300 + Message-Id: <200206092140.g59LeYn15745@ix.netsoft.ro> + Fixes for en_US.UTF-8 failures, all but ext/PerlIO/t/fallback.t + ones which I cannot figure out. +! lib/Encode/Alias.pm + Subject: [Encode PATCH] spurious warning + From: Nicholas Clark <nick@unfortu.net> + Date: Sun, 2 Jun 2002 20:26:22 +0100 + Message-ID: <20020602192619.GA320@Bagpuss.unfortu.net> + +1.75 2002/06/01 18:07:49 ! lib/Encode/Alias.pm t/Alias.t lib/Encode/Supported.pod TW/TW.pm glibc compliance cited by Autrijus. http://www.li18nux.org/docs/html/CodesetAliasTable-V10.html @@ -679,7 +774,7 @@ $Revision: 1.75 $ $Date: 2002/06/01 18:07:49 $ Typo fixes and improvements by jhi Message-Id: <200204010201.FAA03564@alpha.hut.fi>, et al. -1.11 $Date: 2002/06/01 18:07:49 $ +1.11 $Date: 2002/10/21 20:39:09 $ + t/encoding.t + t/jperl.t ! MANIFEST diff --git a/ext/Encode/Encode.pm b/ext/Encode/Encode.pm index 635de301a2..62e2ae6e49 100644 --- a/ext/Encode/Encode.pm +++ b/ext/Encode/Encode.pm @@ -1,9 +1,9 @@ # -# $Id: Encode.pm,v 1.75 2002/06/01 18:07:42 dankogai Exp $ +# $Id: Encode.pm,v 1.80 2002/10/21 20:38:45 dankogai Exp $ # package Encode; use strict; -our $VERSION = do { my @r = (q$Revision: 1.75 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r }; +our $VERSION = do { my @r = (q$Revision: 1.80 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r }; our $DEBUG = 0; use XSLoader (); XSLoader::load(__PACKAGE__, $VERSION); @@ -243,21 +243,7 @@ sub predefine_encodings{ # was in Encode::utf8 package Encode::utf8; push @Encode::utf8::ISA, 'Encode::Encoding'; - *decode = sub{ - my ($obj,$octets,$chk) = @_; - my $str = Encode::decode_utf8($octets); - if (defined $str) { - $_[1] = '' if $chk; - return $str; - } - return undef; - }; - *encode = sub { - my ($obj,$string,$chk) = @_; - my $octets = Encode::encode_utf8($string); - $_[1] = '' if $chk; - return $octets; - }; + # encode and decode methods now in Encode.xs $Encode::Encoding{utf8} = bless {Name => "utf8"} => "Encode::utf8"; } diff --git a/ext/Encode/Encode.xs b/ext/Encode/Encode.xs index e6311064f2..df77b7a5b9 100644 --- a/ext/Encode/Encode.xs +++ b/ext/Encode/Encode.xs @@ -1,5 +1,5 @@ /* - $Id: Encode.xs,v 1.46 2002/05/20 15:25:44 dankogai Exp dankogai $ + $Id: Encode.xs,v 1.49 2002/10/21 19:47:47 dankogai Exp $ */ #define PERL_NO_GET_CONTEXT @@ -238,6 +238,134 @@ encode_method(pTHX_ encode_t * enc, encpage_t * dir, SV * src, return dst; } +MODULE = Encode PACKAGE = Encode::utf8 PREFIX = Method_ + +void +Method_decode(obj,src,check = 0) +SV * obj +SV * src +int check +CODE: +{ + STRLEN slen; + U8 *s = (U8 *) SvPV(src, slen); + U8 *e = (U8 *) SvEND(src); + SV *dst = newSV(slen); + SvPOK_only(dst); + SvCUR_set(dst,0); + if (SvUTF8(src)) { + s = utf8_to_bytes(s,&slen); + if (s) { + SvCUR_set(src,slen); + SvUTF8_off(src); + e = s+slen; + } + else { + croak("Cannot decode string with wide characters"); + } + } + while (s < e) { + if (UTF8_IS_INVARIANT(*s) || UTF8_IS_START(*s)) { + U8 skip = UTF8SKIP(s); + if ((s + skip) > e) { + /* Partial character - done */ + break; + } + else if (is_utf8_char(s)) { + /* Whole char is good */ + sv_catpvn(dst,(char *)s,skip); + s += skip; + continue; + } + else { + /* starts ok but isn't "good" */ + } + } + else { + /* Invalid start byte */ + } + /* If we get here there is something wrong with alleged UTF-8 */ + if (check & ENCODE_DIE_ON_ERR){ + Perl_croak(aTHX_ ERR_DECODE_NOMAP, "utf8", (UV)*s); + XSRETURN(0); + } + if (check & ENCODE_WARN_ON_ERR){ + Perl_warner(aTHX_ packWARN(WARN_UTF8), + ERR_DECODE_NOMAP, "utf8", (UV)*s); + } + if (check & ENCODE_RETURN_ON_ERR) { + break; + } + if (check & (ENCODE_PERLQQ|ENCODE_HTMLCREF|ENCODE_XMLCREF)){ + SV* perlqq = newSVpvf("\\x%02" UVXf, (UV)*s); + sv_catsv(dst, perlqq); + SvREFCNT_dec(perlqq); + } else { + sv_catpv(dst, FBCHAR_UTF8); + } + s++; + } + *SvEND(dst) = '\0'; + + /* Clear out translated part of source unless asked not to */ + if (check && !(check & ENCODE_LEAVE_SRC)){ + slen = e-s; + if (slen) { + sv_setpvn(src, (char*)s, slen); + } + SvCUR_set(src, slen); + } + SvUTF8_on(dst); + ST(0) = sv_2mortal(dst); + XSRETURN(1); +} + +void +Method_encode(obj,src,check = 0) +SV * obj +SV * src +int check +CODE: +{ + STRLEN slen; + U8 *s = (U8 *) SvPV(src, slen); + U8 *e = (U8 *) SvEND(src); + SV *dst = newSV(slen); + if (SvUTF8(src)) { + /* Already encoded - trust it and just copy the octets */ + sv_setpvn(dst,(char *)s,(e-s)); + s = e; + } + else { + /* Native bytes - can always encode */ + U8 *d = (U8 *) SvGROW(dst,2*slen); + while (s < e) { + UV uv = NATIVE_TO_UNI((UV) *s++); + if (UNI_IS_INVARIANT(uv)) + *d++ = (U8)UTF_TO_NATIVE(uv); + else { + *d++ = (U8)UTF8_EIGHT_BIT_HI(uv); + *d++ = (U8)UTF8_EIGHT_BIT_LO(uv); + } + } + SvCUR_set(dst, d- (U8 *)SvPVX(dst)); + *SvEND(dst) = '\0'; + } + + /* Clear out translated part of source unless asked not to */ + if (check && !(check & ENCODE_LEAVE_SRC)){ + slen = e-s; + if (slen) { + sv_setpvn(src, (char*)s, slen); + } + SvCUR_set(src, slen); + } + SvPOK_only(dst); + SvUTF8_off(dst); + ST(0) = sv_2mortal(dst); + XSRETURN(1); +} + MODULE = Encode PACKAGE = Encode::XS PREFIX = Method_ PROTOTYPES: ENABLE @@ -260,6 +388,9 @@ int check CODE: { encode_t *enc = INT2PTR(encode_t *, SvIV(SvRV(obj))); + if (SvUTF8(src)) { + sv_utf8_downgrade(src, FALSE); + } ST(0) = encode_method(aTHX_ enc, enc->t_utf8, src, check); SvUTF8_on(ST(0)); XSRETURN(1); diff --git a/ext/Encode/bin/piconv b/ext/Encode/bin/piconv index 321828f148..fb1d7d63e9 100644 --- a/ext/Encode/bin/piconv +++ b/ext/Encode/bin/piconv @@ -1,5 +1,5 @@ #!./perl -# $Id: piconv,v 1.25 2002/06/01 18:07:49 dankogai Exp dankogai $ +# $Id: piconv,v 1.25 2002/06/01 18:07:49 dankogai Exp $ # use 5.8.0; use strict; diff --git a/ext/Encode/bin/ucmsort b/ext/Encode/bin/ucmsort new file mode 100644 index 0000000000..2287198ad6 --- /dev/null +++ b/ext/Encode/bin/ucmsort @@ -0,0 +1,31 @@ +#!/usr/local/bin/perl +# +# $Id: ucmsort,v 0.1 2002/10/18 16:08:28 dankogai Exp $ +# +use strict; +my @lines; +my ($head, $tail); +while (<>){ + unless (m/^<U/o){ + unless(@lines){ + $head .= $_; + }else{ + $tail .= $_; + } + next; + } + chomp; + push @lines,[ split ]; +} + +print $head; +for (sort { + $a->[0] cmp $b->[0] # Unicode descending order + or $a->[2] cmp $b->[2] # fallback descending order + or $a->[1] cmp $b->[1] # Encoding descending order + } + @lines) { + print join(" " => @$_), "\n"; +} +print $tail; +__END__ diff --git a/ext/Encode/encoding.pm b/ext/Encode/encoding.pm index efb018752a..778b44bc45 100644 --- a/ext/Encode/encoding.pm +++ b/ext/Encode/encoding.pm @@ -1,5 +1,5 @@ package encoding; -our $VERSION = do { my @r = (q$Revision: 1.35 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r }; +our $VERSION = do { my @r = (q$Revision: 1.37 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r }; use Encode; use strict; @@ -144,7 +144,7 @@ the code in UTF-8: s/\bCamel\b/$Rakuda/; The B<encoding> pragma also modifies the filehandle disciplines of -STDIN, STDOUT, and STDERR to the specified encoding. Therefore, +STDIN and STDOUT to the specified encoding. Therefore, use encoding "euc-jp"; my $message = "Camel is the symbol of perl.\n"; @@ -237,6 +237,53 @@ resort to \x{....} just to spell your name in a native encoding. So feel free to put your strings in your encoding in quotes and regexes. +=head2 tr/// with ranges remain unaffected + +The B<encoding> pragma works by decoding string literals in +C<q//,qq//,qr//,qw///, qx//> and so forth. As of perl 5.8.0, this +does not apply to C<tr///>. Therefore, + + use encoding 'euc-jp'; + #.... + $kana =~ tr/\xA4\xA1-\xA4\xF3/\xA5\xA1-\xA5\xF3/; + # -------- -------- -------- -------- + +Does not work as + + $kana =~ tr/\x{3041}-\x{3093}/\x{30a1}-\x{30f3}/; + +=over + +=item Legend of characters above + + utf8 euc-jp charnames::viacode() + ----------------------------------------- + \x{3041} \xA4\xA1 HIRAGANA LETTER SMALL A + \x{3093} \xA4\xF3 HIRAGANA LETTER N + \x{30a1} \xA5\xA1 KATAKANA LETTER SMALL A + \x{30f3} \xA5\xF3 KATAKANA LETTER N + +=back + +=head3 workaround to tr///; + +You can, however, achieve the same as simply as follows; + + use encoding 'euc-jp'; + # .... + eval qq{ \$kana =~ tr/\xA4\xA1-\xA4\xF3/\xA5\xA1-\xA5\xF3/ }; + +Note the C<tr//> expression is surronded by C<qq{}>. The idea behind +is the same as classic idiom that makes C<tr///> 'interpolate'. + + tr/$from/$to/; # wrong! + eval qq{ tr/$from/$to/ }; # workaround. + +Nevertheless, in case of B<encoding> pragma even C<q//> is affected so +C<tr///> not being decoded was obviously against the will of Perl5 +Porters. In future version of perl, this counter-intuitive behaviour +of C<tr///> will be fixed so C<eval qq{}> trick will be unneccesary. + =head1 Non-ASCII Identifiers and Filter option The magic of C<use encoding> is not applied to the names of diff --git a/ext/Encode/lib/Encode/Alias.pm b/ext/Encode/lib/Encode/Alias.pm index 9e9cca5344..06226021e2 100644 --- a/ext/Encode/lib/Encode/Alias.pm +++ b/ext/Encode/lib/Encode/Alias.pm @@ -1,7 +1,7 @@ package Encode::Alias; use strict; use Encode; -our $VERSION = do { my @r = (q$Revision: 1.32 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r }; +our $VERSION = do { my @r = (q$Revision: 1.34 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r }; our $DEBUG = 0; use base qw(Exporter); @@ -219,7 +219,7 @@ sub init_aliases define_alias( qr/\bks_c_5601-1987$/i => '"cp949"' ); # for Encode::TW define_alias( qr/\bbig-?5$/i => '"big5-eten"' ); - define_alias( qr/\bbig5-?et(?:en)$/i => '"big5-eten"' ); + define_alias( qr/\bbig5-?et(?:en)?$/i => '"big5-eten"' ); define_alias( qr/\btca[-_]?big5$/i => '"big5-eten"' ); define_alias( qr/\bbig5-?hk(?:scs)?$/i => '"big5-hkscs"' ); define_alias( qr/\bhk(?:scs)?[-_]?big5$/i => '"big5-hkscs"' ); diff --git a/ext/Encode/lib/Encode/MIME/Header.pm b/ext/Encode/lib/Encode/MIME/Header.pm index 2844db346f..fb4fdd9585 100644 --- a/ext/Encode/lib/Encode/MIME/Header.pm +++ b/ext/Encode/lib/Encode/MIME/Header.pm @@ -1,7 +1,7 @@ package Encode::MIME::Header; use strict; # use warnings; -our $VERSION = do { my @r = (q$Revision: 1.5 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r }; +our $VERSION = do { my @r = (q$Revision: 1.7 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r }; use Encode qw(find_encoding encode_utf8); use MIME::Base64; @@ -74,7 +74,8 @@ sub decode_b{ my $enc = shift; my $d = find_encoding($enc) or croak(Unknown encoding "$enc"); my $db64 = decode_base64(shift); - return $d->decode($db64, Encode::FB_PERLQQ); + return $d->name eq 'utf8' ? + Encode::decode_utf8($db64) : $d->decode($db64, Encode::FB_PERLQQ); } sub decode_q{ @@ -82,7 +83,8 @@ sub decode_q{ my $d = find_encoding($enc) or croak(Unknown encoding "$enc"); $q =~ s/_/ /go; $q =~ s/=([0-9A-Fa-f]{2})/pack("C", hex($1))/ego; - return $d->decode($q, Encode::FB_PERLQQ); + return $d->name eq 'utf8' ? + Encode::decode_utf8($q) : $d->decode($q, Encode::FB_PERLQQ); } my $especials = diff --git a/ext/Encode/lib/Encode/Supported.pod b/ext/Encode/lib/Encode/Supported.pod index ec5da49332..e2645c4a66 100644 --- a/ext/Encode/lib/Encode/Supported.pod +++ b/ext/Encode/lib/Encode/Supported.pod @@ -120,8 +120,8 @@ L<http://czyborra.com/charsets/iso8859.html> for details. MacCroatian MacRomanian MacRumanian - Latin3 [1] iso-8859-3 - Latin4 [2] iso-8859-4 + Latin3[1] iso-8859-3 + Latin4[2] iso-8859-4 Cyrillics iso-8859-5 cp855 cp1251 MacCyrillic (See also next section) cp866 MacUkrainian Arabic iso-8859-6 cp864 cp1256 MacArabic @@ -133,7 +133,7 @@ L<http://czyborra.com/charsets/iso8859.html> for details. Nordics iso-8859-10 cp865 cp861 MacIcelandic MacSami - Thai iso-8859-11 [3] cp874 MacThai + Thai iso-8859-11[3] cp874 MacThai (iso-8859-12 is nonexistent. Reserved for Indics?) Baltics iso-8859-13 cp775 cp1257 Celtics iso-8859-14 @@ -144,7 +144,7 @@ L<http://czyborra.com/charsets/iso8859.html> for details. [1] Esperanto, Maltese, and Turkish. Turkish is now on 8859-9. [2] Baltics. Now on 8859-10, except for Latvian. - [3] Also know as TIS 620. + [3] TIS 620 + Non-Breaking Space (0xA0 / U+00A0) [4] Nicknamed Latin0; the Euro sign as well as French and Finnish letters that are missing from 8859-1 were added. @@ -182,9 +182,9 @@ This is also covered in Encode::Byte even though it is not an Note that Vietnamese is listed above. Also read "Encoding vs Charset" below. Also note that these are implemented in distinct modules by -countries, due the the size concerns (simplified Chinese is mapped +countries, due to the size concerns (simplified Chinese is mapped to 'CN', continental China, while traditional Chinese is mapped to -'TW', Taiwan). Please refer to their respective documentataion pages. +'TW', Taiwan). Please refer to their respective documentation pages. =over 4 @@ -241,7 +241,7 @@ to 'CN', continental China, while traditional Chinese is mapped to =item Encode::HanExtra -- More Chinese via CPAN -Due to size concerns, additional Chinese encodings below are +Due to the size concerns, additional Chinese encodings below are distributed separately on CPAN, under the name Encode::HanExtra. Standard DOS/Win Macintosh Comment/Reference @@ -301,7 +301,8 @@ For symbols and dingbats. =item Encode::MIME::Header Strictly speaking, MIME header encoding documented in RFC 2047 is more -of encapsulation than encoding. But included anyway. +of encapsulation than encoding. However, their support in modern +world is imperative so they are supported. ---------------------------------------------------------------- MIME-Header [RFC2047] @@ -686,7 +687,7 @@ retained it. This is how [RFC 2277] and [RFC 2278] bless C<charset>: scheme; this is also what is used as an identifier in MIME "charset=" parameters, and registered in the IANA charset registry ... (Note that this is NOT a term used by other standards bodies, such as ISO). - [RFC 2277] + [RFC 2277] =item EUC diff --git a/ext/Encode/t/CJKT.t b/ext/Encode/t/CJKT.t index 0c9bb7b65a..5421f2334a 100644 --- a/ext/Encode/t/CJKT.t +++ b/ext/Encode/t/CJKT.t @@ -20,7 +20,8 @@ BEGIN { $| = 1; } use strict; -use Test::More tests => 73; +use Test::More tests => 42; +#use Test::More tests => 73; #use Test::More qw(no_plan); use Encode; use File::Basename; @@ -92,10 +93,12 @@ for my $charset (sort keys %Charset){ } close $src; + my $unisave = $uni; eval{ $txt = $transcoder->encode($uni,1) }; $@ and print $@; ok(defined($txt), "encode $charset"); $seq++; is(length($uni), 0, "encode $charset completely"); $seq++; + $uni = $unisave; open $dst,">$dst_enc" or die "$dst_utf : $!"; binmode($dst); @@ -105,10 +108,5 @@ for my $charset (sort keys %Charset){ or ($DEBUG and rename $dst_enc, "$dst_enc.$seq"); $seq++; - for my $canon (@{$Charset{$charset}}){ - is($uni, decode($canon, encode($canon, $uni)), - "RT/$charset/$canon"); - $seq++; - } unlink($dst_utf, $dst_enc); } diff --git a/ext/Encode/t/big5-eten.utf b/ext/Encode/t/big5-eten.utf index 58253972d2..6b4b99a6be 100644 --- a/ext/Encode/t/big5-eten.utf +++ b/ext/Encode/t/big5-eten.utf @@ -193,8 +193,8 @@ 0xc7c0: ツヅテデトドナニヌãƒãƒŽãƒãƒãƒ‘ヒビピフブプヘベペホボãƒãƒžãƒŸãƒ メモャ 0xc7e0: ヤュユョヨラリルレãƒãƒ®ãƒ¯ãƒ°ãƒ±ãƒ²ãƒ³ãƒ´ãƒµãƒ¶ÐБВГДЕÐЖЗИЙК 0xc840: ЛМÐОПРСТУФХЦЧШЩЪЫЬÐЮЯабвгдеёжзий -0xc860: клмнопрÑтуфхцчшщъыьÑÑŽÑ⇧↸↹‌乚 刂 -0xc8a0: 冈ïŸâ ïŸ¯ïŸ°ïŸ±ïŸ²ïŸ³ïŸ´ïŸµïŸ¶ïŸ·ïŸ¸ïŸ¹ïŸºïŸ»ïŸ¼ïŸ½ïŸ¾ïŸ¿ï €ï ï ‚ï ƒï „ï …ï †ï ‡ï ˆï ‰ +0xc860: клмнопрÑтуфхцчшщъыьÑÑŽÑ⇧↸↹𠃌乚𠂊刂 +0xc8a0: 冈ïŸð§˜‡ïŸ¯ïŸ°ïŸ±ïŸ²ïŸ³ïŸ´ïŸµïŸ¶ïŸ·ïŸ¸ïŸ¹ïŸºïŸ»ïŸ¼ïŸ½ïŸ¾ïŸ¿ï €ï ï ‚ï ƒï „ï …ï †ï ‡ï ˆï ‰ 0xc8c0: ï Šï ‹ï Œï ï Žï ï ï ‘ï ’ï “ï ”ï •ï –ï¿¢ï¿¤ï¼‡ï¼‚ãˆ±â„–â„¡ã‚›ã‚œâº€âº„âº†âº‡âºˆâºŠâºŒâºâº•âºœ 0xc8e0: âºâº¥âº§âºªâº¬âº®âº¶âº¼âº¾â»†â»Šâ»Œâ»â»â»–⻗⻞⻣ ʃÉɛɔɵœøŋʊɪ 0xc940: 乂乜凵匚厂万丌乇äºå›—兀屮彳ä¸å†‡ä¸Žä¸®äº“仂仉仈冘勼å¬åŽ¹åœ 夃夬å°å·¿æ—¡æ®³ diff --git a/ext/Encode/t/jperl.t b/ext/Encode/t/jperl.t index 82f7a84dd6..f78698d40d 100644 --- a/ext/Encode/t/jperl.t +++ b/ext/Encode/t/jperl.t @@ -1,5 +1,5 @@ # -# $Id: jperl.t,v 1.24 2002/04/26 03:02:04 dankogai Exp $ +# $Id: jperl.t,v 1.25 2002/10/06 03:27:02 dankogai Exp $ # # This script is written in euc-jp @@ -23,7 +23,8 @@ BEGIN { no utf8; # we have raw Japanese encodings here use strict; -use Test::More tests => 18; +#use Test::More tests => 18; +use Test::More tests => 15; # black magic tests commented out my $Debug = shift; no encoding; # ensure @@ -60,14 +61,18 @@ is(length($Namae), 4, q{utf8:length}); } # should've been isnt() but no scoping is suported -- yet ok(! defined(${^ENCODING}), q{not scoped yet}); -{ - # now let's try some real black magic! - local(${^ENCODING}) = Encode::find_encoding("euc-jp"); - my $str = "\xbe\xae\xbb\xf4\x20\xc3\xc6"; - is (length($str), 4, q{black magic:length}); - is ($str, $Enamae, q{black magic:eq}); -} -ok(! defined(${^ENCODING}), q{out of black magic}); + +# +# The following tests are commented out to accomodate +# Inaba-San's patch to make tr/// work w/o eval qq{} +#{ +# # now let's try some real black magic! +# local(${^ENCODING}) = Encode::find_encoding("euc-jp"); +# my $str = "\xbe\xae\xbb\xf4\x20\xc3\xc6"; +# is (length($str), 4, q{black magic:length}); +# is ($str, $Enamae, q{black magic:eq}); +#} +#ok(! defined(${^ENCODING}), q{out of black magic}); use bytes; is (length($Namae), 10); diff --git a/ext/Encode/t/mime-header.t b/ext/Encode/t/mime-header.t index 745fb1c998..4c84c4fac8 100644 --- a/ext/Encode/t/mime-header.t +++ b/ext/Encode/t/mime-header.t @@ -1,5 +1,5 @@ # -# $Id: mime-header.t,v 1.5 2002/05/23 19:10:10 dankogai Exp $ +# $Id: mime-header.t,v 1.6 2002/10/21 19:47:47 dankogai Exp $ # This script is written in utf8 # BEGIN { @@ -23,7 +23,7 @@ no utf8; use strict; #use Test::More qw(no_plan); -use Test::More tests => 6; +use Test::More tests => 7; use_ok("Encode::MIME::Header"); my $eheader =<<'EOS'; @@ -41,10 +41,21 @@ CC: Andr\xE9 Pirard <PIRARD\@vm1.ulg.ac.be> Subject: If you can read this you understand the example. EOS -is(Encode::decode('MIME-Header', $eheader), $dheader, "decode (RFC2047)"); +is(Encode::decode('MIME-Header', $eheader), $dheader, "decode ASCII (RFC2047)"); use utf8; +my $uheader =<<'EOS'; +From: =?US-ASCII?Q?Keith_Moore?= <moore@cs.utk.edu> +To: =?ISO-8859-1?Q?Keld_J=F8rn_Simonsen?= <keld@dkuug.dk> +CC: =?ISO-8859-1?Q?Andr=E9?= Pirard <PIRARD@vm1.ulg.ac.be> +Subject: =?ISO-8859-1?B?SWYgeW91IGNhbiByZWFkIHRoaXMgeW8=?= + =?ISO-8859-2?B?dSB1bmRlcnN0YW5kIHRoZSBleGFtcGxlLg==?= +EOS + +is(Encode::decode('MIME-Header', $uheader), $dheader, "decode UTF-8 (RFC2047)"); + + $dheader=<<'EOS'; From: å°é£¼ å¼¾ <dankogai@dan.co.jp> To: dankogai@dan.co.jp (å°é£¼=Kogai, å¼¾=Dan) diff --git a/ext/Encode/t/rt.pl b/ext/Encode/t/rt.pl new file mode 100644 index 0000000000..cff5a3f84b --- /dev/null +++ b/ext/Encode/t/rt.pl @@ -0,0 +1,74 @@ +#!/usr/local/bin/perl +# +# $Id: rt.pl,v 1.1 2002/10/20 15:44:00 dankogai Exp $ +# + +BEGIN { + if ($ENV{'PERL_CORE'}){ + chdir 't'; + unshift @INC, '../lib'; + } + require Config; import Config; + if ($Config{'extensions'} !~ /\bEncode\b/) { + print "1..0 # Skip: Encode was not built\n"; + exit 0; + } + if (ord("A") == 193) { + print "1..0 # Skip: EBCDIC\n"; + exit 0; + } + use strict; + require Test::More; + my $ucmdir = "ucm"; + our $DEBUG; + our @ucm; + unless(@ARGV){ + use File::Spec; + Test::More->import(tests => 103); + opendir my $dh, $ucmdir or die "$ucmdir:$!"; + @ucm = + map {File::Spec->catfile($ucmdir, $_) } + sort grep {/\.ucm$/o} readdir($dh); + closedir $dh; + }else{ + Test::More->import("no_plan"); + $DEBUG = 1; + @ucm = @ARGV; + } +} + +use strict; +use Encode qw/encode decode/; +our $DEBUG; +our @ucm; + +for my $ucm (@ucm){ + my ($name, $nchar, $nrt, $nok) = rttest($ucm); + $nok += 0; + ok($nok == 0, "$ucm => $name ($nchar, $nrt, $nok)"); +} + +sub rttest{ + my $ucm = shift; + my ($name, $nchar, $nrt, $nok); + open my $rfh, "<$ucm" or die "$ucm:$!"; + # <U0000> \x00 |0 # <control> + while(<$rfh>){ + s/#.*//o; /^$/ and next; + unless ($name){ + /^<code_set_name>\s+"([^\"]+)"/io or next; + $name = $1 and next; + }else{ + /^<U([0-9a-f]+)>\s+(\S+)\s+\|(\d)/io or next; + $nchar++; + $3 == 0 or next; + $nrt++; + my $uni = chr(hex($1)); + my $enc = eval qq{ "$2" }; + decode($name, $enc) eq $uni or $nok++; + encode($name, $uni) eq $enc or $nok++; + } + } + return($name, $nchar, $nrt, $nok); +} +__END__ diff --git a/ext/Encode/ucm/big5-eten.ucm b/ext/Encode/ucm/big5-eten.ucm index 452b85b333..e3e4d58616 100644 --- a/ext/Encode/ucm/big5-eten.ucm +++ b/ext/Encode/ucm/big5-eten.ucm @@ -1,5 +1,5 @@ # -# $Id: big5-eten.ucm,v 1.2 2002/04/22 03:41:13 dankogai Exp $ +# $Id: big5-eten.ucm,v 1.3 2002/08/25 15:09:51 dankogai Exp $ # # ./compile -n big5-eten -o Encode/big5-eten.ucm Encode/big5-eten.enc <code_set_name> "big5-eten" @@ -313,8 +313,8 @@ CHARMAP <U044E> \xC8\x74 |0 <U044F> \xC8\x75 |0 <U0451> \xC8\x5B |0 -<U2008> \xC8\x7C |0 -<U200C> \xC8\x7A |0 +<U2008A> \xC8\x7C |0 +<U200CC> \xC8\x7A |0 <U2013> \xA1\x56 |0 <U2014> \xA1\x58 |0 <U2018> \xA1\xA5 |0 @@ -500,7 +500,7 @@ CHARMAP <U2640> \xA1\xF0 |0 <U2642> \xA1\xF1 |0 <U273D> \xC6\xE6 |0 -<U2760> \xC8\xA4 |0 +<U27607> \xC8\xA4 |0 <U2E80> \xC8\xD6 |0 <U2E84> \xC8\xD7 |0 <U2E86> \xC8\xD8 |0 diff --git a/ext/Encode/ucm/cp932.ucm b/ext/Encode/ucm/cp932.ucm index 8e211736f9..42b88e3535 100644 --- a/ext/Encode/ucm/cp932.ucm +++ b/ext/Encode/ucm/cp932.ucm @@ -1,8 +1,8 @@ # -# $Id: cp932.ucm,v 1.20 2002/04/04 19:50:53 dankogai Exp $ +# $Id: cp932.ucm,v 1.21 2002/10/20 15:44:00 dankogai Exp $ # # Original table can be obtained at -# http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP932.TXT +# http://www.microsoft.com/typography/unicode/932.txt # <code_set_name> "cp932" <mb_cur_min> 1 @@ -137,6 +137,7 @@ CHARMAP <U007D> \x7D |0 # RIGHT CURLY BRACKET <U007E> \x7E |0 # TILDE <U007F> \x7F |0 # DELETE +<U0080> \x80 |0 # <U00A7> \x81\x98 |0 # SECTION SIGN <U00A8> \x81\x4E |0 # DIAERESIS <U00B0> \x81\x8B |0 # DEGREE SIGN @@ -274,29 +275,51 @@ CHARMAP <U2033> \x81\x8D |0 # DOUBLE PRIME <U203B> \x81\xA6 |0 # REFERENCE MARK <U2103> \x81\x8E |0 # DEGREE CELSIUS -<U2116> \xFA\x59 |0 # NUMERO SIGN -<U2121> \xFA\x5A |0 # TELEPHONE SIGN +<U2116> \x87\x82 |0 # NUMERO SIGN +<U2116> \xFA\x59 |3 # NUMERO SIGN +<U2121> \x87\x84 |0 # TELEPHONE SIGN +<U2121> \xFA\x5A |3 # TELEPHONE SIGN <U212B> \x81\xF0 |0 # ANGSTROM SIGN -<U2160> \xFA\x4A |0 # ROMAN NUMERAL ONE -<U2161> \xFA\x4B |0 # ROMAN NUMERAL TWO -<U2162> \xFA\x4C |0 # ROMAN NUMERAL THREE -<U2163> \xFA\x4D |0 # ROMAN NUMERAL FOUR -<U2164> \xFA\x4E |0 # ROMAN NUMERAL FIVE -<U2165> \xFA\x4F |0 # ROMAN NUMERAL SIX -<U2166> \xFA\x50 |0 # ROMAN NUMERAL SEVEN -<U2167> \xFA\x51 |0 # ROMAN NUMERAL EIGHT -<U2168> \xFA\x52 |0 # ROMAN NUMERAL NINE -<U2169> \xFA\x53 |0 # ROMAN NUMERAL TEN +<U2160> \x87\x54 |0 # ROMAN NUMERAL ONE +<U2160> \xFA\x4A |3 # ROMAN NUMERAL ONE +<U2161> \x87\x55 |0 # ROMAN NUMERAL TWO +<U2161> \xFA\x4B |3 # ROMAN NUMERAL TWO +<U2162> \x87\x56 |0 # ROMAN NUMERAL THREE +<U2162> \xFA\x4C |3 # ROMAN NUMERAL THREE +<U2163> \x87\x57 |0 # ROMAN NUMERAL FOUR +<U2163> \xFA\x4D |3 # ROMAN NUMERAL FOUR +<U2164> \x87\x58 |0 # ROMAN NUMERAL FIVE +<U2164> \xFA\x4E |3 # ROMAN NUMERAL FIVE +<U2165> \x87\x59 |0 # ROMAN NUMERAL SIX +<U2165> \xFA\x4F |3 # ROMAN NUMERAL SIX +<U2166> \x87\x5A |0 # ROMAN NUMERAL SEVEN +<U2166> \xFA\x50 |3 # ROMAN NUMERAL SEVEN +<U2167> \x87\x5B |0 # ROMAN NUMERAL EIGHT +<U2167> \xFA\x51 |3 # ROMAN NUMERAL EIGHT +<U2168> \x87\x5C |0 # ROMAN NUMERAL NINE +<U2168> \xFA\x52 |3 # ROMAN NUMERAL NINE +<U2169> \x87\x5D |0 # ROMAN NUMERAL TEN +<U2169> \xFA\x53 |3 # ROMAN NUMERAL TEN <U2170> \xFA\x40 |0 # SMALL ROMAN NUMERAL ONE +<U2170> \xEE\xEF |3 # SMALL ROMAN NUMERAL ONE <U2171> \xFA\x41 |0 # SMALL ROMAN NUMERAL TWO +<U2171> \xEE\xF0 |3 # SMALL ROMAN NUMERAL TWO <U2172> \xFA\x42 |0 # SMALL ROMAN NUMERAL THREE +<U2172> \xEE\xF1 |3 # SMALL ROMAN NUMERAL THREE <U2173> \xFA\x43 |0 # SMALL ROMAN NUMERAL FOUR +<U2173> \xEE\xF2 |3 # SMALL ROMAN NUMERAL FOUR <U2174> \xFA\x44 |0 # SMALL ROMAN NUMERAL FIVE +<U2174> \xEE\xF3 |3 # SMALL ROMAN NUMERAL FIVE <U2175> \xFA\x45 |0 # SMALL ROMAN NUMERAL SIX +<U2175> \xEE\xF4 |3 # SMALL ROMAN NUMERAL SIX <U2176> \xFA\x46 |0 # SMALL ROMAN NUMERAL SEVEN +<U2176> \xEE\xF5 |3 # SMALL ROMAN NUMERAL SEVEN <U2177> \xFA\x47 |0 # SMALL ROMAN NUMERAL EIGHT +<U2177> \xEE\xF6 |3 # SMALL ROMAN NUMERAL EIGHT <U2178> \xFA\x48 |0 # SMALL ROMAN NUMERAL NINE +<U2178> \xEE\xF7 |3 # SMALL ROMAN NUMERAL NINE <U2179> \xFA\x49 |0 # SMALL ROMAN NUMERAL TEN +<U2179> \xEE\xF8 |3 # SMALL ROMAN NUMERAL TEN <U2190> \x81\xA9 |0 # LEFTWARDS ARROW <U2191> \x81\xAA |0 # UPWARDS ARROW <U2192> \x81\xA8 |0 # RIGHTWARDS ARROW @@ -310,25 +333,34 @@ CHARMAP <U2208> \x81\xB8 |0 # ELEMENT OF <U220B> \x81\xB9 |0 # CONTAINS AS MEMBER <U2211> \x87\x94 |0 # N-ARY SUMMATION -<U221A> \x87\x95 |0 # SQUARE ROOT +<U221A> \x81\xE3 |0 # SQUARE ROOT +<U221A> \x87\x95 |3 # SQUARE ROOT <U221D> \x81\xE5 |0 # PROPORTIONAL TO <U221E> \x81\x87 |0 # INFINITY <U221F> \x87\x98 |0 # RIGHT ANGLE -<U2220> \x87\x97 |0 # ANGLE +<U2220> \x81\xDA |0 # ANGLE +<U2220> \x87\x97 |3 # ANGLE <U2225> \x81\x61 |0 # PARALLEL TO <U2227> \x81\xC8 |0 # LOGICAL AND <U2228> \x81\xC9 |0 # LOGICAL OR -<U2229> \x87\x9B |0 # INTERSECTION -<U222A> \x87\x9C |0 # UNION -<U222B> \x87\x92 |0 # INTEGRAL +<U2229> \x81\xBF |0 # INTERSECTION +<U2229> \x87\x9B |3 # INTERSECTION +<U222A> \x81\xBE |0 # UNION +<U222A> \x87\x9C |3 # UNION +<U222B> \x81\xE7 |0 # INTEGRAL +<U222B> \x87\x92 |3 # INTEGRAL <U222C> \x81\xE8 |0 # DOUBLE INTEGRAL <U222E> \x87\x93 |0 # CONTOUR INTEGRAL <U2234> \x81\x88 |0 # THEREFORE -<U2235> \xFA\x5B |0 # BECAUSE +<U2235> \x81\xE6 |0 # BECAUSE +<U2235> \x87\x9A |3 # BECAUSE +<U2235> \xFA\x5B |3 # BECAUSE <U223D> \x81\xE4 |0 # REVERSED TILDE -<U2252> \x87\x90 |0 # APPROXIMATELY EQUAL TO OR THE IMAGE OF +<U2252> \x81\xE0 |0 # APPROXIMATELY EQUAL TO OR THE IMAGE OF +<U2252> \x87\x90 |3 # APPROXIMATELY EQUAL TO OR THE IMAGE OF <U2260> \x81\x82 |0 # NOT EQUAL TO -<U2261> \x87\x91 |0 # IDENTICAL TO +<U2261> \x81\xDF |0 # IDENTICAL TO +<U2261> \x87\x91 |3 # IDENTICAL TO <U2266> \x81\x85 |0 # LESS-THAN OVER EQUAL TO <U2267> \x81\x86 |0 # GREATER-THAN OVER EQUAL TO <U226A> \x81\xE1 |0 # MUCH LESS-THAN @@ -337,7 +369,8 @@ CHARMAP <U2283> \x81\xBD |0 # SUPERSET OF <U2286> \x81\xBA |0 # SUBSET OF OR EQUAL TO <U2287> \x81\xBB |0 # SUPERSET OF OR EQUAL TO -<U22A5> \x87\x96 |0 # UP TACK +<U22A5> \x81\xDB |0 # UP TACK +<U22A5> \x87\x96 |3 # UP TACK <U22BF> \x87\x99 |0 # RIGHT TRIANGLE <U2312> \x81\xDC |0 # ARC <U2460> \x87\x40 |0 # CIRCLED DIGIT ONE @@ -608,10 +641,16 @@ CHARMAP <U30F5> \x83\x95 |0 # KATAKANA LETTER SMALL KA <U30F6> \x83\x96 |0 # KATAKANA LETTER SMALL KE <U30FB> \x81\x45 |0 # KATAKANA MIDDLE DOT +<U30FB> \x85\x40 |3 # KATAKANA MIDDLE DOT +<U30FB> \x86\x40 |3 # KATAKANA MIDDLE DOT +<U30FB> \xEB\x40 |3 # KATAKANA MIDDLE DOT +<U30FB> \xEC\x40 |3 # KATAKANA MIDDLE DOT +<U30FB> \xEF\x40 |3 # KATAKANA MIDDLE DOT <U30FC> \x81\x5B |0 # KATAKANA-HIRAGANA PROLONGED SOUND MARK <U30FD> \x81\x52 |0 # KATAKANA ITERATION MARK <U30FE> \x81\x53 |0 # KATAKANA VOICED ITERATION MARK -<U3231> \xFA\x58 |0 # PARENTHESIZED IDEOGRAPH STOCK +<U3231> \x87\x8A |0 # PARENTHESIZED IDEOGRAPH STOCK +<U3231> \xFA\x58 |3 # PARENTHESIZED IDEOGRAPH STOCK <U3232> \x87\x8B |0 # PARENTHESIZED IDEOGRAPH HAVE <U3239> \x87\x8C |0 # PARENTHESIZED IDEOGRAPH REPRESENT <U32A4> \x87\x85 |0 # CIRCLED IDEOGRAPH HIGH @@ -669,6 +708,7 @@ CHARMAP <U4E21> \x97\xBC |0 # CJK UNIFIED IDEOGRAPH <U4E26> \x95\xC0 |0 # CJK UNIFIED IDEOGRAPH <U4E28> \xFA\x68 |0 # CJK UNIFIED IDEOGRAPH +<U4E28> \xED\x4C |3 # CJK UNIFIED IDEOGRAPH <U4E2A> \x98\xA2 |0 # CJK UNIFIED IDEOGRAPH <U4E2D> \x92\x86 |0 # CJK UNIFIED IDEOGRAPH <U4E31> \x98\xA3 |0 # CJK UNIFIED IDEOGRAPH @@ -754,6 +794,7 @@ CHARMAP <U4EDE> \x98\xBE |0 # CJK UNIFIED IDEOGRAPH <U4EDF> \x98\xC0 |0 # CJK UNIFIED IDEOGRAPH <U4EE1> \xFA\x69 |0 # CJK UNIFIED IDEOGRAPH +<U4EE1> \xED\x4D |3 # CJK UNIFIED IDEOGRAPH <U4EE3> \x91\xE3 |0 # CJK UNIFIED IDEOGRAPH <U4EE4> \x97\xDF |0 # CJK UNIFIED IDEOGRAPH <U4EE5> \x88\xC8 |0 # CJK UNIFIED IDEOGRAPH @@ -765,9 +806,12 @@ CHARMAP <U4EF7> \x98\xC1 |0 # CJK UNIFIED IDEOGRAPH <U4EFB> \x94\x43 |0 # CJK UNIFIED IDEOGRAPH <U4EFC> \xFA\x6A |0 # CJK UNIFIED IDEOGRAPH +<U4EFC> \xED\x4E |3 # CJK UNIFIED IDEOGRAPH <U4F00> \xFA\x6B |0 # CJK UNIFIED IDEOGRAPH +<U4F00> \xED\x4F |3 # CJK UNIFIED IDEOGRAPH <U4F01> \x8A\xE9 |0 # CJK UNIFIED IDEOGRAPH <U4F03> \xFA\x6C |0 # CJK UNIFIED IDEOGRAPH +<U4F03> \xED\x50 |3 # CJK UNIFIED IDEOGRAPH <U4F09> \x98\xC2 |0 # CJK UNIFIED IDEOGRAPH <U4F0A> \x88\xC9 |0 # CJK UNIFIED IDEOGRAPH <U4F0D> \x8C\xDE |0 # CJK UNIFIED IDEOGRAPH @@ -784,6 +828,7 @@ CHARMAP <U4F36> \x97\xE0 |0 # CJK UNIFIED IDEOGRAPH <U4F38> \x90\x4C |0 # CJK UNIFIED IDEOGRAPH <U4F39> \xFA\x6D |0 # CJK UNIFIED IDEOGRAPH +<U4F39> \xED\x51 |3 # CJK UNIFIED IDEOGRAPH <U4F3A> \x8E\x66 |0 # CJK UNIFIED IDEOGRAPH <U4F3C> \x8E\x97 |0 # CJK UNIFIED IDEOGRAPH <U4F3D> \x89\xBE |0 # CJK UNIFIED IDEOGRAPH @@ -798,6 +843,7 @@ CHARMAP <U4F53> \x91\xCC |0 # CJK UNIFIED IDEOGRAPH <U4F55> \x89\xBD |0 # CJK UNIFIED IDEOGRAPH <U4F56> \xFA\x6E |0 # CJK UNIFIED IDEOGRAPH +<U4F56> \xED\x52 |3 # CJK UNIFIED IDEOGRAPH <U4F57> \x98\xC7 |0 # CJK UNIFIED IDEOGRAPH <U4F59> \x97\x5D |0 # CJK UNIFIED IDEOGRAPH <U4F5A> \x98\xC3 |0 # CJK UNIFIED IDEOGRAPH @@ -818,15 +864,19 @@ CHARMAP <U4F86> \x98\xD2 |0 # CJK UNIFIED IDEOGRAPH <U4F88> \x98\xCA |0 # CJK UNIFIED IDEOGRAPH <U4F8A> \xFA\x70 |0 # CJK UNIFIED IDEOGRAPH +<U4F8A> \xED\x54 |3 # CJK UNIFIED IDEOGRAPH <U4F8B> \x97\xE1 |0 # CJK UNIFIED IDEOGRAPH <U4F8D> \x8E\x98 |0 # CJK UNIFIED IDEOGRAPH <U4F8F> \x98\xCB |0 # CJK UNIFIED IDEOGRAPH <U4F91> \x98\xD0 |0 # CJK UNIFIED IDEOGRAPH <U4F92> \xFA\x6F |0 # CJK UNIFIED IDEOGRAPH +<U4F92> \xED\x53 |3 # CJK UNIFIED IDEOGRAPH <U4F94> \xFA\x72 |0 # CJK UNIFIED IDEOGRAPH +<U4F94> \xED\x56 |3 # CJK UNIFIED IDEOGRAPH <U4F96> \x98\xD3 |0 # CJK UNIFIED IDEOGRAPH <U4F98> \x98\xCC |0 # CJK UNIFIED IDEOGRAPH <U4F9A> \xFA\x71 |0 # CJK UNIFIED IDEOGRAPH +<U4F9A> \xED\x55 |3 # CJK UNIFIED IDEOGRAPH <U4F9B> \x8B\x9F |0 # CJK UNIFIED IDEOGRAPH <U4F9D> \x88\xCB |0 # CJK UNIFIED IDEOGRAPH <U4FA0> \x8B\xA0 |0 # CJK UNIFIED IDEOGRAPH @@ -842,8 +892,10 @@ CHARMAP <U4FC3> \x91\xA3 |0 # CJK UNIFIED IDEOGRAPH <U4FC4> \x89\xE2 |0 # CJK UNIFIED IDEOGRAPH <U4FC9> \xFA\x61 |0 # CJK UNIFIED IDEOGRAPH +<U4FC9> \xED\x45 |3 # CJK UNIFIED IDEOGRAPH <U4FCA> \x8F\x72 |0 # CJK UNIFIED IDEOGRAPH <U4FCD> \xFA\x73 |0 # CJK UNIFIED IDEOGRAPH +<U4FCD> \xED\x57 |3 # CJK UNIFIED IDEOGRAPH <U4FCE> \x98\xD7 |0 # CJK UNIFIED IDEOGRAPH <U4FD0> \x98\xDC |0 # CJK UNIFIED IDEOGRAPH <U4FD1> \x98\xDA |0 # CJK UNIFIED IDEOGRAPH @@ -867,6 +919,7 @@ CHARMAP <U4FFA> \x89\xB4 |0 # CJK UNIFIED IDEOGRAPH <U4FFE> \x98\xEA |0 # CJK UNIFIED IDEOGRAPH <U4FFF> \xFA\x76 |0 # CJK UNIFIED IDEOGRAPH +<U4FFF> \xED\x5A |3 # CJK UNIFIED IDEOGRAPH <U5005> \x98\xE4 |0 # CJK UNIFIED IDEOGRAPH <U5006> \x98\xED |0 # CJK UNIFIED IDEOGRAPH <U5009> \x91\x71 |0 # CJK UNIFIED IDEOGRAPH @@ -880,9 +933,11 @@ CHARMAP <U5019> \x8C\xF3 |0 # CJK UNIFIED IDEOGRAPH <U501A> \x98\xDF |0 # CJK UNIFIED IDEOGRAPH <U501E> \xFA\x77 |0 # CJK UNIFIED IDEOGRAPH +<U501E> \xED\x5B |3 # CJK UNIFIED IDEOGRAPH <U501F> \x8E\xD8 |0 # CJK UNIFIED IDEOGRAPH <U5021> \x98\xE7 |0 # CJK UNIFIED IDEOGRAPH <U5022> \xFA\x75 |0 # CJK UNIFIED IDEOGRAPH +<U5022> \xED\x59 |3 # CJK UNIFIED IDEOGRAPH <U5023> \x95\xED |0 # CJK UNIFIED IDEOGRAPH <U5024> \x92\x6C |0 # CJK UNIFIED IDEOGRAPH <U5025> \x98\xE3 |0 # CJK UNIFIED IDEOGRAPH @@ -896,9 +951,12 @@ CHARMAP <U5036> \x8B\xE4 |0 # CJK UNIFIED IDEOGRAPH <U5039> \x8C\x90 |0 # CJK UNIFIED IDEOGRAPH <U5040> \xFA\x74 |0 # CJK UNIFIED IDEOGRAPH +<U5040> \xED\x58 |3 # CJK UNIFIED IDEOGRAPH <U5042> \xFA\x7A |0 # CJK UNIFIED IDEOGRAPH +<U5042> \xED\x5E |3 # CJK UNIFIED IDEOGRAPH <U5043> \x98\xEE |0 # CJK UNIFIED IDEOGRAPH <U5046> \xFA\x78 |0 # CJK UNIFIED IDEOGRAPH +<U5046> \xED\x5C |3 # CJK UNIFIED IDEOGRAPH <U5047> \x98\xEF |0 # CJK UNIFIED IDEOGRAPH <U5048> \x98\xF3 |0 # CJK UNIFIED IDEOGRAPH <U5049> \x88\xCC |0 # CJK UNIFIED IDEOGRAPH @@ -911,6 +969,7 @@ CHARMAP <U5065> \x8C\x92 |0 # CJK UNIFIED IDEOGRAPH <U506C> \x98\xF6 |0 # CJK UNIFIED IDEOGRAPH <U5070> \xFA\x79 |0 # CJK UNIFIED IDEOGRAPH +<U5070> \xED\x5D |3 # CJK UNIFIED IDEOGRAPH <U5072> \x8E\xC3 |0 # CJK UNIFIED IDEOGRAPH <U5074> \x91\xA4 |0 # CJK UNIFIED IDEOGRAPH <U5075> \x92\xE3 |0 # CJK UNIFIED IDEOGRAPH @@ -922,6 +981,7 @@ CHARMAP <U508D> \x96\x54 |0 # CJK UNIFIED IDEOGRAPH <U5091> \x8C\x86 |0 # CJK UNIFIED IDEOGRAPH <U5094> \xFA\x7B |0 # CJK UNIFIED IDEOGRAPH +<U5094> \xED\x5F |3 # CJK UNIFIED IDEOGRAPH <U5098> \x8E\x50 |0 # CJK UNIFIED IDEOGRAPH <U5099> \x94\xF5 |0 # CJK UNIFIED IDEOGRAPH <U509A> \x98\xF9 |0 # CJK UNIFIED IDEOGRAPH @@ -943,6 +1003,7 @@ CHARMAP <U50D5> \x96\x6C |0 # CJK UNIFIED IDEOGRAPH <U50D6> \x99\x44 |0 # CJK UNIFIED IDEOGRAPH <U50D8> \xFA\x7D |0 # CJK UNIFIED IDEOGRAPH +<U50D8> \xED\x61 |3 # CJK UNIFIED IDEOGRAPH <U50DA> \x97\xBB |0 # CJK UNIFIED IDEOGRAPH <U50DE> \x99\x45 |0 # CJK UNIFIED IDEOGRAPH <U50E3> \x99\x48 |0 # CJK UNIFIED IDEOGRAPH @@ -951,6 +1012,7 @@ CHARMAP <U50ED> \x99\x47 |0 # CJK UNIFIED IDEOGRAPH <U50EE> \x99\x49 |0 # CJK UNIFIED IDEOGRAPH <U50F4> \xFA\x7C |0 # CJK UNIFIED IDEOGRAPH +<U50F4> \xED\x60 |3 # CJK UNIFIED IDEOGRAPH <U50F5> \x99\x4B |0 # CJK UNIFIED IDEOGRAPH <U50F9> \x99\x4A |0 # CJK UNIFIED IDEOGRAPH <U50FB> \x95\xC6 |0 # CJK UNIFIED IDEOGRAPH @@ -984,6 +1046,7 @@ CHARMAP <U5148> \x90\xE6 |0 # CJK UNIFIED IDEOGRAPH <U5149> \x8C\xF5 |0 # CJK UNIFIED IDEOGRAPH <U514A> \xFA\x7E |0 # CJK UNIFIED IDEOGRAPH +<U514A> \xED\x62 |3 # CJK UNIFIED IDEOGRAPH <U514B> \x8D\x8E |0 # CJK UNIFIED IDEOGRAPH <U514C> \x99\x5B |0 # CJK UNIFIED IDEOGRAPH <U514D> \x96\xC6 |0 # CJK UNIFIED IDEOGRAPH @@ -995,6 +1058,7 @@ CHARMAP <U515C> \x8A\x95 |0 # CJK UNIFIED IDEOGRAPH <U5162> \x99\x5D |0 # CJK UNIFIED IDEOGRAPH <U5164> \xFA\x80 |0 # CJK UNIFIED IDEOGRAPH +<U5164> \xED\x63 |3 # CJK UNIFIED IDEOGRAPH <U5165> \x93\xFC |0 # CJK UNIFIED IDEOGRAPH <U5168> \x91\x53 |0 # CJK UNIFIED IDEOGRAPH <U5169> \x99\x5F |0 # CJK UNIFIED IDEOGRAPH @@ -1027,6 +1091,7 @@ CHARMAP <U5197> \x8F\xE7 |0 # CJK UNIFIED IDEOGRAPH <U5199> \x8E\xCA |0 # CJK UNIFIED IDEOGRAPH <U519D> \xFA\x81 |0 # CJK UNIFIED IDEOGRAPH +<U519D> \xED\x64 |3 # CJK UNIFIED IDEOGRAPH <U51A0> \x8A\xA5 |0 # CJK UNIFIED IDEOGRAPH <U51A2> \x99\x6E |0 # CJK UNIFIED IDEOGRAPH <U51A4> \x99\x6C |0 # CJK UNIFIED IDEOGRAPH @@ -1047,6 +1112,7 @@ CHARMAP <U51B7> \x97\xE2 |0 # CJK UNIFIED IDEOGRAPH <U51BD> \x99\x77 |0 # CJK UNIFIED IDEOGRAPH <U51BE> \xFA\x82 |0 # CJK UNIFIED IDEOGRAPH +<U51BE> \xED\x65 |3 # CJK UNIFIED IDEOGRAPH <U51C4> \x90\xA6 |0 # CJK UNIFIED IDEOGRAPH <U51C5> \x99\x78 |0 # CJK UNIFIED IDEOGRAPH <U51C6> \x8F\x79 |0 # CJK UNIFIED IDEOGRAPH @@ -1065,6 +1131,7 @@ CHARMAP <U51E9> \x99\x7D |0 # CJK UNIFIED IDEOGRAPH <U51EA> \x93\xE2 |0 # CJK UNIFIED IDEOGRAPH <U51EC> \xFA\x83 |0 # CJK UNIFIED IDEOGRAPH +<U51EC> \xED\x66 |3 # CJK UNIFIED IDEOGRAPH <U51ED> \x99\x7E |0 # CJK UNIFIED IDEOGRAPH <U51F0> \x99\x80 |0 # CJK UNIFIED IDEOGRAPH <U51F1> \x8A\x4D |0 # CJK UNIFIED IDEOGRAPH @@ -1087,6 +1154,7 @@ CHARMAP <U5211> \x8C\x59 |0 # CJK UNIFIED IDEOGRAPH <U5214> \x99\x85 |0 # CJK UNIFIED IDEOGRAPH <U5215> \xFA\x84 |0 # CJK UNIFIED IDEOGRAPH +<U5215> \xED\x67 |3 # CJK UNIFIED IDEOGRAPH <U5217> \x97\xF1 |0 # CJK UNIFIED IDEOGRAPH <U521D> \x8F\x89 |0 # CJK UNIFIED IDEOGRAPH <U5224> \x94\xBB |0 # CJK UNIFIED IDEOGRAPH @@ -1139,16 +1207,19 @@ CHARMAP <U5294> \x99\x99 |0 # CJK UNIFIED IDEOGRAPH <U529B> \x97\xCD |0 # CJK UNIFIED IDEOGRAPH <U529C> \xFA\x85 |0 # CJK UNIFIED IDEOGRAPH +<U529C> \xED\x68 |3 # CJK UNIFIED IDEOGRAPH <U529F> \x8C\xF7 |0 # CJK UNIFIED IDEOGRAPH <U52A0> \x89\xC1 |0 # CJK UNIFIED IDEOGRAPH <U52A3> \x97\xF2 |0 # CJK UNIFIED IDEOGRAPH <U52A6> \xFA\x86 |0 # CJK UNIFIED IDEOGRAPH +<U52A6> \xED\x69 |3 # CJK UNIFIED IDEOGRAPH <U52A9> \x8F\x95 |0 # CJK UNIFIED IDEOGRAPH <U52AA> \x93\x77 |0 # CJK UNIFIED IDEOGRAPH <U52AB> \x8D\x85 |0 # CJK UNIFIED IDEOGRAPH <U52AC> \x99\xA0 |0 # CJK UNIFIED IDEOGRAPH <U52AD> \x99\xA1 |0 # CJK UNIFIED IDEOGRAPH <U52AF> \xFB\x77 |0 # CJK UNIFIED IDEOGRAPH +<U52AF> \xEE\x5B |3 # CJK UNIFIED IDEOGRAPH <U52B1> \x97\xE3 |0 # CJK UNIFIED IDEOGRAPH <U52B4> \x98\x4A |0 # CJK UNIFIED IDEOGRAPH <U52B5> \x99\xA3 |0 # CJK UNIFIED IDEOGRAPH @@ -1156,6 +1227,7 @@ CHARMAP <U52BC> \x99\xA2 |0 # CJK UNIFIED IDEOGRAPH <U52BE> \x8A\x4E |0 # CJK UNIFIED IDEOGRAPH <U52C0> \xFA\x87 |0 # CJK UNIFIED IDEOGRAPH +<U52C0> \xED\x6A |3 # CJK UNIFIED IDEOGRAPH <U52C1> \x99\xA4 |0 # CJK UNIFIED IDEOGRAPH <U52C3> \x96\x75 |0 # CJK UNIFIED IDEOGRAPH <U52C5> \x92\xBA |0 # CJK UNIFIED IDEOGRAPH @@ -1168,6 +1240,7 @@ CHARMAP <U52D8> \x8A\xA8 |0 # CJK UNIFIED IDEOGRAPH <U52D9> \x96\xB1 |0 # CJK UNIFIED IDEOGRAPH <U52DB> \xFA\x88 |0 # CJK UNIFIED IDEOGRAPH +<U52DB> \xED\x6B |3 # CJK UNIFIED IDEOGRAPH <U52DD> \x8F\x9F |0 # CJK UNIFIED IDEOGRAPH <U52DE> \x99\xA7 |0 # CJK UNIFIED IDEOGRAPH <U52DF> \x95\xE5 |0 # CJK UNIFIED IDEOGRAPH @@ -1186,11 +1259,13 @@ CHARMAP <U52FE> \x8C\xF9 |0 # CJK UNIFIED IDEOGRAPH <U52FF> \x96\xDC |0 # CJK UNIFIED IDEOGRAPH <U5300> \xFA\x89 |0 # CJK UNIFIED IDEOGRAPH +<U5300> \xED\x6C |3 # CJK UNIFIED IDEOGRAPH <U5301> \x96\xE6 |0 # CJK UNIFIED IDEOGRAPH <U5302> \x93\xF5 |0 # CJK UNIFIED IDEOGRAPH <U5305> \x95\xEF |0 # CJK UNIFIED IDEOGRAPH <U5306> \x99\xB0 |0 # CJK UNIFIED IDEOGRAPH <U5307> \xFA\x8A |0 # CJK UNIFIED IDEOGRAPH +<U5307> \xED\x6D |3 # CJK UNIFIED IDEOGRAPH <U5308> \x99\xB1 |0 # CJK UNIFIED IDEOGRAPH <U530D> \x99\xB3 |0 # CJK UNIFIED IDEOGRAPH <U530F> \x99\xB5 |0 # CJK UNIFIED IDEOGRAPH @@ -1205,6 +1280,7 @@ CHARMAP <U5321> \x8B\xA7 |0 # CJK UNIFIED IDEOGRAPH <U5323> \x99\xB8 |0 # CJK UNIFIED IDEOGRAPH <U5324> \xFA\x8B |0 # CJK UNIFIED IDEOGRAPH +<U5324> \xED\x6E |3 # CJK UNIFIED IDEOGRAPH <U532A> \x94\xD9 |0 # CJK UNIFIED IDEOGRAPH <U532F> \x99\xB9 |0 # CJK UNIFIED IDEOGRAPH <U5331> \x99\xBA |0 # CJK UNIFIED IDEOGRAPH @@ -1241,6 +1317,7 @@ CHARMAP <U5370> \x88\xF3 |0 # CJK UNIFIED IDEOGRAPH <U5371> \x8A\xEB |0 # CJK UNIFIED IDEOGRAPH <U5372> \xFA\x8C |0 # CJK UNIFIED IDEOGRAPH +<U5372> \xED\x6F |3 # CJK UNIFIED IDEOGRAPH <U5373> \x91\xA6 |0 # CJK UNIFIED IDEOGRAPH <U5374> \x8B\x70 |0 # CJK UNIFIED IDEOGRAPH <U5375> \x97\x91 |0 # CJK UNIFIED IDEOGRAPH @@ -1251,6 +1328,7 @@ CHARMAP <U5382> \x99\xCA |0 # CJK UNIFIED IDEOGRAPH <U5384> \x96\xEF |0 # CJK UNIFIED IDEOGRAPH <U5393> \xFA\x8D |0 # CJK UNIFIED IDEOGRAPH +<U5393> \xED\x70 |3 # CJK UNIFIED IDEOGRAPH <U5396> \x99\xCB |0 # CJK UNIFIED IDEOGRAPH <U5398> \x97\xD0 |0 # CJK UNIFIED IDEOGRAPH <U539A> \x8C\xFA |0 # CJK UNIFIED IDEOGRAPH @@ -1264,6 +1342,7 @@ CHARMAP <U53AE> \x99\xCF |0 # CJK UNIFIED IDEOGRAPH <U53B0> \x99\xD0 |0 # CJK UNIFIED IDEOGRAPH <U53B2> \xFA\x8E |0 # CJK UNIFIED IDEOGRAPH +<U53B2> \xED\x71 |3 # CJK UNIFIED IDEOGRAPH <U53B3> \x8C\xB5 |0 # CJK UNIFIED IDEOGRAPH <U53B6> \x99\xD1 |0 # CJK UNIFIED IDEOGRAPH <U53BB> \x8B\x8E |0 # CJK UNIFIED IDEOGRAPH @@ -1282,6 +1361,7 @@ CHARMAP <U53D9> \x8F\x96 |0 # CJK UNIFIED IDEOGRAPH <U53DB> \x94\xBE |0 # CJK UNIFIED IDEOGRAPH <U53DD> \xFA\x8F |0 # CJK UNIFIED IDEOGRAPH +<U53DD> \xED\x72 |3 # CJK UNIFIED IDEOGRAPH <U53DF> \x99\xD5 |0 # CJK UNIFIED IDEOGRAPH <U53E1> \x89\x62 |0 # CJK UNIFIED IDEOGRAPH <U53E2> \x91\x70 |0 # CJK UNIFIED IDEOGRAPH @@ -1358,6 +1438,7 @@ CHARMAP <U5484> \x99\xF2 |0 # CJK UNIFIED IDEOGRAPH <U5486> \x99\xF4 |0 # CJK UNIFIED IDEOGRAPH <U548A> \xFA\x92 |0 # CJK UNIFIED IDEOGRAPH +<U548A> \xED\x75 |3 # CJK UNIFIED IDEOGRAPH <U548B> \x8D\xEE |0 # CJK UNIFIED IDEOGRAPH <U548C> \x98\x61 |0 # CJK UNIFIED IDEOGRAPH <U548E> \x99\xE9 |0 # CJK UNIFIED IDEOGRAPH @@ -1365,11 +1446,13 @@ CHARMAP <U5490> \x99\xF3 |0 # CJK UNIFIED IDEOGRAPH <U5492> \x99\xEE |0 # CJK UNIFIED IDEOGRAPH <U549C> \xFA\x91 |0 # CJK UNIFIED IDEOGRAPH +<U549C> \xED\x74 |3 # CJK UNIFIED IDEOGRAPH <U54A2> \x99\xF6 |0 # CJK UNIFIED IDEOGRAPH <U54A4> \x9A\x42 |0 # CJK UNIFIED IDEOGRAPH <U54A5> \x99\xF8 |0 # CJK UNIFIED IDEOGRAPH <U54A8> \x99\xFC |0 # CJK UNIFIED IDEOGRAPH <U54A9> \xFA\x93 |0 # CJK UNIFIED IDEOGRAPH +<U54A9> \xED\x76 |3 # CJK UNIFIED IDEOGRAPH <U54AB> \x9A\x40 |0 # CJK UNIFIED IDEOGRAPH <U54AC> \x99\xF9 |0 # CJK UNIFIED IDEOGRAPH <U54AF> \x9A\x5D |0 # CJK UNIFIED IDEOGRAPH @@ -1399,6 +1482,7 @@ CHARMAP <U54FA> \x9A\x4D |0 # CJK UNIFIED IDEOGRAPH <U54FD> \x9A\x4A |0 # CJK UNIFIED IDEOGRAPH <U54FF> \xFA\x94 |0 # CJK UNIFIED IDEOGRAPH +<U54FF> \xED\x77 |3 # CJK UNIFIED IDEOGRAPH <U5504> \x89\x53 |0 # CJK UNIFIED IDEOGRAPH <U5506> \x8D\xB4 |0 # CJK UNIFIED IDEOGRAPH <U5507> \x90\x4F |0 # CJK UNIFIED IDEOGRAPH @@ -1432,6 +1516,7 @@ CHARMAP <U5583> \x9A\x66 |0 # CJK UNIFIED IDEOGRAPH <U5584> \x91\x50 |0 # CJK UNIFIED IDEOGRAPH <U5586> \xFA\x95 |0 # CJK UNIFIED IDEOGRAPH +<U5586> \xED\x78 |3 # CJK UNIFIED IDEOGRAPH <U5587> \x9A\x68 |0 # CJK UNIFIED IDEOGRAPH <U5589> \x8D\x41 |0 # CJK UNIFIED IDEOGRAPH <U558A> \x9A\x5E |0 # CJK UNIFIED IDEOGRAPH @@ -1559,9 +1644,11 @@ CHARMAP <U5750> \x8D\xBF |0 # CJK UNIFIED IDEOGRAPH <U5751> \x8D\x42 |0 # CJK UNIFIED IDEOGRAPH <U5759> \xFA\x96 |0 # CJK UNIFIED IDEOGRAPH +<U5759> \xED\x79 |3 # CJK UNIFIED IDEOGRAPH <U5761> \x9A\xB1 |0 # CJK UNIFIED IDEOGRAPH <U5764> \x8D\xA3 |0 # CJK UNIFIED IDEOGRAPH <U5765> \xFA\x97 |0 # CJK UNIFIED IDEOGRAPH +<U5765> \xED\x7A |3 # CJK UNIFIED IDEOGRAPH <U5766> \x92\x52 |0 # CJK UNIFIED IDEOGRAPH <U5769> \x9A\xAE |0 # CJK UNIFIED IDEOGRAPH <U576A> \x92\xD8 |0 # CJK UNIFIED IDEOGRAPH @@ -1577,13 +1664,16 @@ CHARMAP <U57A4> \x9A\xB7 |0 # CJK UNIFIED IDEOGRAPH <U57AA> \x9A\xB8 |0 # CJK UNIFIED IDEOGRAPH <U57AC> \xFA\x98 |0 # CJK UNIFIED IDEOGRAPH +<U57AC> \xED\x7B |3 # CJK UNIFIED IDEOGRAPH <U57B0> \x9A\xB9 |0 # CJK UNIFIED IDEOGRAPH <U57B3> \x9A\xB6 |0 # CJK UNIFIED IDEOGRAPH <U57C0> \x9A\xAF |0 # CJK UNIFIED IDEOGRAPH <U57C3> \x9A\xBA |0 # CJK UNIFIED IDEOGRAPH <U57C6> \x9A\xBB |0 # CJK UNIFIED IDEOGRAPH <U57C7> \xFA\x9A |0 # CJK UNIFIED IDEOGRAPH +<U57C7> \xED\x7D |3 # CJK UNIFIED IDEOGRAPH <U57C8> \xFA\x99 |0 # CJK UNIFIED IDEOGRAPH +<U57C8> \xED\x7C |3 # CJK UNIFIED IDEOGRAPH <U57CB> \x96\x84 |0 # CJK UNIFIED IDEOGRAPH <U57CE> \x8F\xE9 |0 # CJK UNIFIED IDEOGRAPH <U57D2> \x9A\xBD |0 # CJK UNIFIED IDEOGRAPH @@ -1644,11 +1734,13 @@ CHARMAP <U5897> \x91\x9D |0 # CJK UNIFIED IDEOGRAPH <U589C> \x92\xC4 |0 # CJK UNIFIED IDEOGRAPH <U589E> \xFA\x9D |0 # CJK UNIFIED IDEOGRAPH +<U589E> \xED\x81 |3 # CJK UNIFIED IDEOGRAPH <U589F> \x9A\xD0 |0 # CJK UNIFIED IDEOGRAPH <U58A8> \x96\x6E |0 # CJK UNIFIED IDEOGRAPH <U58AB> \x9A\xD1 |0 # CJK UNIFIED IDEOGRAPH <U58AE> \x9A\xD6 |0 # CJK UNIFIED IDEOGRAPH <U58B2> \xFA\x9E |0 # CJK UNIFIED IDEOGRAPH +<U58B2> \xED\x82 |3 # CJK UNIFIED IDEOGRAPH <U58B3> \x95\xAD |0 # CJK UNIFIED IDEOGRAPH <U58B8> \x9A\xD5 |0 # CJK UNIFIED IDEOGRAPH <U58B9> \x9A\xCF |0 # CJK UNIFIED IDEOGRAPH @@ -1688,6 +1780,7 @@ CHARMAP <U5909> \x95\xCF |0 # CJK UNIFIED IDEOGRAPH <U590A> \x9A\xE8 |0 # CJK UNIFIED IDEOGRAPH <U590B> \xFA\x9F |0 # CJK UNIFIED IDEOGRAPH +<U590B> \xED\x83 |3 # CJK UNIFIED IDEOGRAPH <U590F> \x89\xC4 |0 # CJK UNIFIED IDEOGRAPH <U5910> \x9A\xE9 |0 # CJK UNIFIED IDEOGRAPH <U5915> \x97\x5B |0 # CJK UNIFIED IDEOGRAPH @@ -1720,16 +1813,20 @@ CHARMAP <U5950> \x9A\xF4 |0 # CJK UNIFIED IDEOGRAPH <U5951> \x8C\x5F |0 # CJK UNIFIED IDEOGRAPH <U5953> \xFA\xA0 |0 # CJK UNIFIED IDEOGRAPH +<U5953> \xED\x84 |3 # CJK UNIFIED IDEOGRAPH <U5954> \x96\x7A |0 # CJK UNIFIED IDEOGRAPH <U5955> \x9A\xF3 |0 # CJK UNIFIED IDEOGRAPH <U5957> \x93\x85 |0 # CJK UNIFIED IDEOGRAPH <U5958> \x9A\xF7 |0 # CJK UNIFIED IDEOGRAPH <U595A> \x9A\xF6 |0 # CJK UNIFIED IDEOGRAPH <U595B> \xFA\xA1 |0 # CJK UNIFIED IDEOGRAPH +<U595B> \xED\x85 |3 # CJK UNIFIED IDEOGRAPH <U595D> \xFA\xA2 |0 # CJK UNIFIED IDEOGRAPH +<U595D> \xED\x86 |3 # CJK UNIFIED IDEOGRAPH <U5960> \x9A\xF9 |0 # CJK UNIFIED IDEOGRAPH <U5962> \x9A\xF8 |0 # CJK UNIFIED IDEOGRAPH <U5963> \xFA\xA3 |0 # CJK UNIFIED IDEOGRAPH +<U5963> \xED\x87 |3 # CJK UNIFIED IDEOGRAPH <U5965> \x89\x9C |0 # CJK UNIFIED IDEOGRAPH <U5967> \x9A\xFA |0 # CJK UNIFIED IDEOGRAPH <U5968> \x8F\xA7 |0 # CJK UNIFIED IDEOGRAPH @@ -1754,12 +1851,14 @@ CHARMAP <U599D> \x9B\x42 |0 # CJK UNIFIED IDEOGRAPH <U59A3> \x9B\x45 |0 # CJK UNIFIED IDEOGRAPH <U59A4> \xFA\xA4 |0 # CJK UNIFIED IDEOGRAPH +<U59A4> \xED\x88 |3 # CJK UNIFIED IDEOGRAPH <U59A5> \x91\xC3 |0 # CJK UNIFIED IDEOGRAPH <U59A8> \x96\x57 |0 # CJK UNIFIED IDEOGRAPH <U59AC> \x93\x69 |0 # CJK UNIFIED IDEOGRAPH <U59B2> \x9B\x46 |0 # CJK UNIFIED IDEOGRAPH <U59B9> \x96\x85 |0 # CJK UNIFIED IDEOGRAPH <U59BA> \xFA\xA5 |0 # CJK UNIFIED IDEOGRAPH +<U59BA> \xED\x89 |3 # CJK UNIFIED IDEOGRAPH <U59BB> \x8D\xC8 |0 # CJK UNIFIED IDEOGRAPH <U59BE> \x8F\xA8 |0 # CJK UNIFIED IDEOGRAPH <U59C6> \x9B\x47 |0 # CJK UNIFIED IDEOGRAPH @@ -1844,6 +1943,7 @@ CHARMAP <U5B54> \x8D\x45 |0 # CJK UNIFIED IDEOGRAPH <U5B55> \x9B\x73 |0 # CJK UNIFIED IDEOGRAPH <U5B56> \xFA\xA6 |0 # CJK UNIFIED IDEOGRAPH +<U5B56> \xED\x8A |3 # CJK UNIFIED IDEOGRAPH <U5B57> \x8E\x9A |0 # CJK UNIFIED IDEOGRAPH <U5B58> \x91\xB6 |0 # CJK UNIFIED IDEOGRAPH <U5B5A> \x9B\x74 |0 # CJK UNIFIED IDEOGRAPH @@ -1897,6 +1997,7 @@ CHARMAP <U5BB9> \x97\x65 |0 # CJK UNIFIED IDEOGRAPH <U5BBF> \x8F\x68 |0 # CJK UNIFIED IDEOGRAPH <U5BC0> \xFA\xA7 |0 # CJK UNIFIED IDEOGRAPH +<U5BC0> \xED\x8B |3 # CJK UNIFIED IDEOGRAPH <U5BC2> \x8E\xE2 |0 # CJK UNIFIED IDEOGRAPH <U5BC3> \x9B\x83 |0 # CJK UNIFIED IDEOGRAPH <U5BC4> \x8A\xF1 |0 # CJK UNIFIED IDEOGRAPH @@ -1910,6 +2011,7 @@ CHARMAP <U5BD3> \x8B\xF5 |0 # CJK UNIFIED IDEOGRAPH <U5BD4> \x9B\x86 |0 # CJK UNIFIED IDEOGRAPH <U5BD8> \xFA\xA9 |0 # CJK UNIFIED IDEOGRAPH +<U5BD8> \xED\x8D |3 # CJK UNIFIED IDEOGRAPH <U5BDB> \x8A\xB0 |0 # CJK UNIFIED IDEOGRAPH <U5BDD> \x90\x51 |0 # CJK UNIFIED IDEOGRAPH <U5BDE> \x9B\x8B |0 # CJK UNIFIED IDEOGRAPH @@ -1924,6 +2026,7 @@ CHARMAP <U5BE9> \x90\x52 |0 # CJK UNIFIED IDEOGRAPH <U5BEB> \x9B\x8D |0 # CJK UNIFIED IDEOGRAPH <U5BEC> \xFA\xAA |0 # CJK UNIFIED IDEOGRAPH +<U5BEC> \xED\x8E |3 # CJK UNIFIED IDEOGRAPH <U5BEE> \x97\xBE |0 # CJK UNIFIED IDEOGRAPH <U5BF0> \x9B\x8E |0 # CJK UNIFIED IDEOGRAPH <U5BF3> \x9B\x90 |0 # CJK UNIFIED IDEOGRAPH @@ -1951,6 +2054,7 @@ CHARMAP <U5C16> \x90\xEB |0 # CJK UNIFIED IDEOGRAPH <U5C1A> \x8F\xAE |0 # CJK UNIFIED IDEOGRAPH <U5C1E> \xFA\xAB |0 # CJK UNIFIED IDEOGRAPH +<U5C1E> \xED\x8F |3 # CJK UNIFIED IDEOGRAPH <U5C20> \x9B\x96 |0 # CJK UNIFIED IDEOGRAPH <U5C22> \x9B\x97 |0 # CJK UNIFIED IDEOGRAPH <U5C24> \x96\xDE |0 # CJK UNIFIED IDEOGRAPH @@ -1996,6 +2100,7 @@ CHARMAP <U5C94> \x9B\xA9 |0 # CJK UNIFIED IDEOGRAPH <U5CA1> \x89\xAA |0 # CJK UNIFIED IDEOGRAPH <U5CA6> \xFA\xAC |0 # CJK UNIFIED IDEOGRAPH +<U5CA6> \xED\x90 |3 # CJK UNIFIED IDEOGRAPH <U5CA8> \x91\x5A |0 # CJK UNIFIED IDEOGRAPH <U5CA9> \x8A\xE2 |0 # CJK UNIFIED IDEOGRAPH <U5CAB> \x9B\xAB |0 # CJK UNIFIED IDEOGRAPH @@ -2006,6 +2111,7 @@ CHARMAP <U5CB7> \x9B\xAF |0 # CJK UNIFIED IDEOGRAPH <U5CB8> \x8A\xDD |0 # CJK UNIFIED IDEOGRAPH <U5CBA> \xFA\xAD |0 # CJK UNIFIED IDEOGRAPH +<U5CBA> \xED\x91 |3 # CJK UNIFIED IDEOGRAPH <U5CBB> \x9B\xAC |0 # CJK UNIFIED IDEOGRAPH <U5CBC> \x9B\xAE |0 # CJK UNIFIED IDEOGRAPH <U5CBE> \x9B\xB1 |0 # CJK UNIFIED IDEOGRAPH @@ -2021,6 +2127,7 @@ CHARMAP <U5CEF> \x95\xF5 |0 # CJK UNIFIED IDEOGRAPH <U5CF0> \x95\xF4 |0 # CJK UNIFIED IDEOGRAPH <U5CF5> \xFA\xAE |0 # CJK UNIFIED IDEOGRAPH +<U5CF5> \xED\x92 |3 # CJK UNIFIED IDEOGRAPH <U5CF6> \x93\x87 |0 # CJK UNIFIED IDEOGRAPH <U5CFA> \x9B\xB6 |0 # CJK UNIFIED IDEOGRAPH <U5CFB> \x8F\x73 |0 # CJK UNIFIED IDEOGRAPH @@ -2040,18 +2147,22 @@ CHARMAP <U5D1F> \x9B\xBE |0 # CJK UNIFIED IDEOGRAPH <U5D22> \x9B\xC2 |0 # CJK UNIFIED IDEOGRAPH <U5D27> \xFA\xAF |0 # CJK UNIFIED IDEOGRAPH +<U5D27> \xED\x93 |3 # CJK UNIFIED IDEOGRAPH <U5D29> \x95\xF6 |0 # CJK UNIFIED IDEOGRAPH <U5D42> \xFA\xB2 |0 # CJK UNIFIED IDEOGRAPH +<U5D42> \xED\x96 |3 # CJK UNIFIED IDEOGRAPH <U5D4B> \x9B\xC9 |0 # CJK UNIFIED IDEOGRAPH <U5D4C> \x9B\xC6 |0 # CJK UNIFIED IDEOGRAPH <U5D4E> \x9B\xC8 |0 # CJK UNIFIED IDEOGRAPH <U5D50> \x97\x92 |0 # CJK UNIFIED IDEOGRAPH <U5D52> \x9B\xC7 |0 # CJK UNIFIED IDEOGRAPH <U5D53> \xFA\xB0 |0 # CJK UNIFIED IDEOGRAPH +<U5D53> \xED\x94 |3 # CJK UNIFIED IDEOGRAPH <U5D5C> \x9B\xBD |0 # CJK UNIFIED IDEOGRAPH <U5D69> \x90\x93 |0 # CJK UNIFIED IDEOGRAPH <U5D6C> \x9B\xCA |0 # CJK UNIFIED IDEOGRAPH <U5D6D> \xFA\xB3 |0 # CJK UNIFIED IDEOGRAPH +<U5D6D> \xED\x97 |3 # CJK UNIFIED IDEOGRAPH <U5D6F> \x8D\xB5 |0 # CJK UNIFIED IDEOGRAPH <U5D73> \x9B\xCB |0 # CJK UNIFIED IDEOGRAPH <U5D76> \x9B\xCC |0 # CJK UNIFIED IDEOGRAPH @@ -2067,7 +2178,9 @@ CHARMAP <U5DAE> \x9B\xD3 |0 # CJK UNIFIED IDEOGRAPH <U5DB7> \x9B\xD6 |0 # CJK UNIFIED IDEOGRAPH <U5DB8> \xFA\xB4 |0 # CJK UNIFIED IDEOGRAPH +<U5DB8> \xED\x98 |3 # CJK UNIFIED IDEOGRAPH <U5DB9> \xFA\xB5 |0 # CJK UNIFIED IDEOGRAPH +<U5DB9> \xED\x99 |3 # CJK UNIFIED IDEOGRAPH <U5DBA> \x97\xE4 |0 # CJK UNIFIED IDEOGRAPH <U5DBC> \x9B\xD7 |0 # CJK UNIFIED IDEOGRAPH <U5DBD> \x9B\xD4 |0 # CJK UNIFIED IDEOGRAPH @@ -2075,6 +2188,7 @@ CHARMAP <U5DCC> \x8A\xDE |0 # CJK UNIFIED IDEOGRAPH <U5DCD> \x9B\xD9 |0 # CJK UNIFIED IDEOGRAPH <U5DD0> \xFA\xB6 |0 # CJK UNIFIED IDEOGRAPH +<U5DD0> \xED\x9A |3 # CJK UNIFIED IDEOGRAPH <U5DD2> \x9B\xDB |0 # CJK UNIFIED IDEOGRAPH <U5DD3> \x9B\xDA |0 # CJK UNIFIED IDEOGRAPH <U5DD6> \x9B\xDC |0 # CJK UNIFIED IDEOGRAPH @@ -2220,6 +2334,7 @@ CHARMAP <U5F1B> \x92\x6F |0 # CJK UNIFIED IDEOGRAPH <U5F1F> \x92\xED |0 # CJK UNIFIED IDEOGRAPH <U5F21> \xFA\xB7 |0 # CJK UNIFIED IDEOGRAPH +<U5F21> \xED\x9B |3 # CJK UNIFIED IDEOGRAPH <U5F25> \x96\xED |0 # CJK UNIFIED IDEOGRAPH <U5F26> \x8C\xB7 |0 # CJK UNIFIED IDEOGRAPH <U5F27> \x8C\xCA |0 # CJK UNIFIED IDEOGRAPH @@ -2228,6 +2343,7 @@ CHARMAP <U5F2F> \x9C\x5E |0 # CJK UNIFIED IDEOGRAPH <U5F31> \x8E\xE3 |0 # CJK UNIFIED IDEOGRAPH <U5F34> \xFA\xB8 |0 # CJK UNIFIED IDEOGRAPH +<U5F34> \xED\x9C |3 # CJK UNIFIED IDEOGRAPH <U5F35> \x92\xA3 |0 # CJK UNIFIED IDEOGRAPH <U5F37> \x8B\xAD |0 # CJK UNIFIED IDEOGRAPH <U5F38> \x9C\x59 |0 # CJK UNIFIED IDEOGRAPH @@ -2235,6 +2351,7 @@ CHARMAP <U5F3E> \x92\x65 |0 # CJK UNIFIED IDEOGRAPH <U5F41> \x9C\x5A |0 # CJK UNIFIED IDEOGRAPH <U5F45> \xFA\x67 |0 # CJK UNIFIED IDEOGRAPH +<U5F45> \xED\x4B |3 # CJK UNIFIED IDEOGRAPH <U5F48> \x9C\x5B |0 # CJK UNIFIED IDEOGRAPH <U5F4A> \x8B\xAE |0 # CJK UNIFIED IDEOGRAPH <U5F4C> \x9C\x5C |0 # CJK UNIFIED IDEOGRAPH @@ -2250,6 +2367,7 @@ CHARMAP <U5F62> \x8C\x60 |0 # CJK UNIFIED IDEOGRAPH <U5F66> \x95\x46 |0 # CJK UNIFIED IDEOGRAPH <U5F67> \xFA\xB9 |0 # CJK UNIFIED IDEOGRAPH +<U5F67> \xED\x9D |3 # CJK UNIFIED IDEOGRAPH <U5F69> \x8D\xCA |0 # CJK UNIFIED IDEOGRAPH <U5F6A> \x95\x56 |0 # CJK UNIFIED IDEOGRAPH <U5F6B> \x92\xA4 |0 # CJK UNIFIED IDEOGRAPH @@ -2291,6 +2409,7 @@ CHARMAP <U5FB3> \x93\xBF |0 # CJK UNIFIED IDEOGRAPH <U5FB4> \x92\xA5 |0 # CJK UNIFIED IDEOGRAPH <U5FB7> \xFA\xBA |0 # CJK UNIFIED IDEOGRAPH +<U5FB7> \xED\x9E |3 # CJK UNIFIED IDEOGRAPH <U5FB9> \x93\x4F |0 # CJK UNIFIED IDEOGRAPH <U5FBC> \x9C\x74 |0 # CJK UNIFIED IDEOGRAPH <U5FBD> \x8B\x4A |0 # CJK UNIFIED IDEOGRAPH @@ -2305,6 +2424,7 @@ CHARMAP <U5FDC> \x89\x9E |0 # CJK UNIFIED IDEOGRAPH <U5FDD> \x9C\x7A |0 # CJK UNIFIED IDEOGRAPH <U5FDE> \xFA\xBB |0 # CJK UNIFIED IDEOGRAPH +<U5FDE> \xED\x9F |3 # CJK UNIFIED IDEOGRAPH <U5FE0> \x92\x89 |0 # CJK UNIFIED IDEOGRAPH <U5FE4> \x9C\x77 |0 # CJK UNIFIED IDEOGRAPH <U5FEB> \x89\xF5 |0 # CJK UNIFIED IDEOGRAPH @@ -2350,6 +2470,7 @@ CHARMAP <U6059> \x9C\x99 |0 # CJK UNIFIED IDEOGRAPH <U605A> \x9C\x8B |0 # CJK UNIFIED IDEOGRAPH <U605D> \xFA\xBC |0 # CJK UNIFIED IDEOGRAPH +<U605D> \xED\xA0 |3 # CJK UNIFIED IDEOGRAPH <U605F> \x9C\x8F |0 # CJK UNIFIED IDEOGRAPH <U6060> \x9C\x7E |0 # CJK UNIFIED IDEOGRAPH <U6062> \x89\xF8 |0 # CJK UNIFIED IDEOGRAPH @@ -2370,8 +2491,10 @@ CHARMAP <U6083> \x9C\x9D |0 # CJK UNIFIED IDEOGRAPH <U6084> \x9C\x9F |0 # CJK UNIFIED IDEOGRAPH <U6085> \xFA\xBD |0 # CJK UNIFIED IDEOGRAPH +<U6085> \xED\xA1 |3 # CJK UNIFIED IDEOGRAPH <U6089> \x8E\xBB |0 # CJK UNIFIED IDEOGRAPH <U608A> \xFA\xBE |0 # CJK UNIFIED IDEOGRAPH +<U608A> \xED\xA2 |3 # CJK UNIFIED IDEOGRAPH <U608B> \x9C\xA5 |0 # CJK UNIFIED IDEOGRAPH <U608C> \x92\xEE |0 # CJK UNIFIED IDEOGRAPH <U608D> \x9C\x9B |0 # CJK UNIFIED IDEOGRAPH @@ -2402,10 +2525,12 @@ CHARMAP <U60D1> \x98\x66 |0 # CJK UNIFIED IDEOGRAPH <U60D3> \x9C\xA9 |0 # CJK UNIFIED IDEOGRAPH <U60D5> \xFA\xC0 |0 # CJK UNIFIED IDEOGRAPH +<U60D5> \xED\xA4 |3 # CJK UNIFIED IDEOGRAPH <U60D8> \x9C\xAF |0 # CJK UNIFIED IDEOGRAPH <U60DA> \x8D\x9B |0 # CJK UNIFIED IDEOGRAPH <U60DC> \x90\xC9 |0 # CJK UNIFIED IDEOGRAPH <U60DE> \xFA\xBF |0 # CJK UNIFIED IDEOGRAPH +<U60DE> \xED\xA3 |3 # CJK UNIFIED IDEOGRAPH <U60DF> \x88\xD2 |0 # CJK UNIFIED IDEOGRAPH <U60E0> \x9C\xA8 |0 # CJK UNIFIED IDEOGRAPH <U60E1> \x9C\xA6 |0 # CJK UNIFIED IDEOGRAPH @@ -2415,6 +2540,7 @@ CHARMAP <U60F0> \x91\xC4 |0 # CJK UNIFIED IDEOGRAPH <U60F1> \x9C\xBB |0 # CJK UNIFIED IDEOGRAPH <U60F2> \xFA\xC2 |0 # CJK UNIFIED IDEOGRAPH +<U60F2> \xED\xA6 |3 # CJK UNIFIED IDEOGRAPH <U60F3> \x91\x7A |0 # CJK UNIFIED IDEOGRAPH <U60F4> \x9C\xB6 |0 # CJK UNIFIED IDEOGRAPH <U60F6> \x9C\xB3 |0 # CJK UNIFIED IDEOGRAPH @@ -2432,18 +2558,22 @@ CHARMAP <U610E> \x9C\xBD |0 # CJK UNIFIED IDEOGRAPH <U610F> \x88\xD3 |0 # CJK UNIFIED IDEOGRAPH <U6111> \xFA\xC3 |0 # CJK UNIFIED IDEOGRAPH +<U6111> \xED\xA7 |3 # CJK UNIFIED IDEOGRAPH <U6115> \x9C\xB1 |0 # CJK UNIFIED IDEOGRAPH <U611A> \x8B\xF0 |0 # CJK UNIFIED IDEOGRAPH <U611B> \x88\xA4 |0 # CJK UNIFIED IDEOGRAPH <U611F> \x8A\xB4 |0 # CJK UNIFIED IDEOGRAPH <U6120> \xFA\xC1 |0 # CJK UNIFIED IDEOGRAPH +<U6120> \xED\xA5 |3 # CJK UNIFIED IDEOGRAPH <U6121> \x9C\xB9 |0 # CJK UNIFIED IDEOGRAPH <U6127> \x9C\xC1 |0 # CJK UNIFIED IDEOGRAPH <U6128> \x9C\xC0 |0 # CJK UNIFIED IDEOGRAPH <U612C> \x9C\xC5 |0 # CJK UNIFIED IDEOGRAPH <U6130> \xFA\xC5 |0 # CJK UNIFIED IDEOGRAPH +<U6130> \xED\xA9 |3 # CJK UNIFIED IDEOGRAPH <U6134> \x9C\xC6 |0 # CJK UNIFIED IDEOGRAPH <U6137> \xFA\xC4 |0 # CJK UNIFIED IDEOGRAPH +<U6137> \xED\xA8 |3 # CJK UNIFIED IDEOGRAPH <U613C> \x9C\xC4 |0 # CJK UNIFIED IDEOGRAPH <U613D> \x9C\xC7 |0 # CJK UNIFIED IDEOGRAPH <U613E> \x9C\xBF |0 # CJK UNIFIED IDEOGRAPH @@ -2489,6 +2619,7 @@ CHARMAP <U6194> \x9C\xDC |0 # CJK UNIFIED IDEOGRAPH <U6196> \x9C\xD9 |0 # CJK UNIFIED IDEOGRAPH <U6198> \xFA\xC6 |0 # CJK UNIFIED IDEOGRAPH +<U6198> \xED\xAA |3 # CJK UNIFIED IDEOGRAPH <U6199> \x9C\xD8 |0 # CJK UNIFIED IDEOGRAPH <U619A> \x9C\xDD |0 # CJK UNIFIED IDEOGRAPH <U61A4> \x95\xAE |0 # CJK UNIFIED IDEOGRAPH @@ -2534,6 +2665,7 @@ CHARMAP <U6211> \x89\xE4 |0 # CJK UNIFIED IDEOGRAPH <U6212> \x89\xFA |0 # CJK UNIFIED IDEOGRAPH <U6213> \xFA\xC7 |0 # CJK UNIFIED IDEOGRAPH +<U6213> \xED\xAB |3 # CJK UNIFIED IDEOGRAPH <U6214> \x9C\xFB |0 # CJK UNIFIED IDEOGRAPH <U6216> \x88\xBD |0 # CJK UNIFIED IDEOGRAPH <U621A> \x90\xCA |0 # CJK UNIFIED IDEOGRAPH @@ -2594,6 +2726,7 @@ CHARMAP <U629C> \x94\xB2 |0 # CJK UNIFIED IDEOGRAPH <U629E> \x91\xF0 |0 # CJK UNIFIED IDEOGRAPH <U62A6> \xFA\xC8 |0 # CJK UNIFIED IDEOGRAPH +<U62A6> \xED\xAC |3 # CJK UNIFIED IDEOGRAPH <U62AB> \x94\xE2 |0 # CJK UNIFIED IDEOGRAPH <U62AC> \x9D\xAB |0 # CJK UNIFIED IDEOGRAPH <U62B1> \x95\xF8 |0 # CJK UNIFIED IDEOGRAPH @@ -2716,6 +2849,7 @@ CHARMAP <U63EE> \x8A\xF6 |0 # CJK UNIFIED IDEOGRAPH <U63F4> \x89\x87 |0 # CJK UNIFIED IDEOGRAPH <U63F5> \xFA\xC9 |0 # CJK UNIFIED IDEOGRAPH +<U63F5> \xED\xAD |3 # CJK UNIFIED IDEOGRAPH <U63F6> \x9D\x88 |0 # CJK UNIFIED IDEOGRAPH <U63FA> \x97\x68 |0 # CJK UNIFIED IDEOGRAPH <U6406> \x9D\x8C |0 # CJK UNIFIED IDEOGRAPH @@ -2737,6 +2871,7 @@ CHARMAP <U644E> \x9D\x97 |0 # CJK UNIFIED IDEOGRAPH <U6458> \x93\x45 |0 # CJK UNIFIED IDEOGRAPH <U6460> \xFA\xCA |0 # CJK UNIFIED IDEOGRAPH +<U6460> \xED\xAE |3 # CJK UNIFIED IDEOGRAPH <U6467> \x9D\x94 |0 # CJK UNIFIED IDEOGRAPH <U6469> \x96\x80 |0 # CJK UNIFIED IDEOGRAPH <U646F> \x9D\x95 |0 # CJK UNIFIED IDEOGRAPH @@ -2750,6 +2885,7 @@ CHARMAP <U6495> \x9D\x99 |0 # CJK UNIFIED IDEOGRAPH <U649A> \x94\x51 |0 # CJK UNIFIED IDEOGRAPH <U649D> \xFA\xCB |0 # CJK UNIFIED IDEOGRAPH +<U649D> \xED\xAF |3 # CJK UNIFIED IDEOGRAPH <U649E> \x93\xB3 |0 # CJK UNIFIED IDEOGRAPH <U64A4> \x93\x50 |0 # CJK UNIFIED IDEOGRAPH <U64A5> \x9D\x9B |0 # CJK UNIFIED IDEOGRAPH @@ -2768,6 +2904,7 @@ CHARMAP <U64C7> \x9D\xA2 |0 # CJK UNIFIED IDEOGRAPH <U64CD> \x91\x80 |0 # CJK UNIFIED IDEOGRAPH <U64CE> \xFA\xCC |0 # CJK UNIFIED IDEOGRAPH +<U64CE> \xED\xB0 |3 # CJK UNIFIED IDEOGRAPH <U64D2> \x9D\xA0 |0 # CJK UNIFIED IDEOGRAPH <U64D4> \x9D\x5E |0 # CJK UNIFIED IDEOGRAPH <U64D8> \x9D\xA4 |0 # CJK UNIFIED IDEOGRAPH @@ -2811,6 +2948,7 @@ CHARMAP <U6548> \x9D\xC1 |0 # CJK UNIFIED IDEOGRAPH <U654D> \x9D\xC4 |0 # CJK UNIFIED IDEOGRAPH <U654E> \xFA\xCD |0 # CJK UNIFIED IDEOGRAPH +<U654E> \xED\xB1 |3 # CJK UNIFIED IDEOGRAPH <U654F> \x95\x71 |0 # CJK UNIFIED IDEOGRAPH <U6551> \x8B\x7E |0 # CJK UNIFIED IDEOGRAPH <U6555> \x9D\xC3 |0 # CJK UNIFIED IDEOGRAPH @@ -2883,11 +3021,13 @@ CHARMAP <U65FA> \x89\xA0 |0 # CJK UNIFIED IDEOGRAPH <U65FB> \x9D\xDF |0 # CJK UNIFIED IDEOGRAPH <U6600> \xFA\xCE |0 # CJK UNIFIED IDEOGRAPH +<U6600> \xED\xB2 |3 # CJK UNIFIED IDEOGRAPH <U6602> \x8D\x56 |0 # CJK UNIFIED IDEOGRAPH <U6603> \x9D\xDE |0 # CJK UNIFIED IDEOGRAPH <U6606> \x8D\xA9 |0 # CJK UNIFIED IDEOGRAPH <U6607> \x8F\xB8 |0 # CJK UNIFIED IDEOGRAPH <U6609> \xFA\xD1 |0 # CJK UNIFIED IDEOGRAPH +<U6609> \xED\xB5 |3 # CJK UNIFIED IDEOGRAPH <U660A> \x9D\xDD |0 # CJK UNIFIED IDEOGRAPH <U660C> \x8F\xB9 |0 # CJK UNIFIED IDEOGRAPH <U660E> \x96\xBE |0 # CJK UNIFIED IDEOGRAPH @@ -2895,22 +3035,28 @@ CHARMAP <U6613> \x88\xD5 |0 # CJK UNIFIED IDEOGRAPH <U6614> \x90\xCC |0 # CJK UNIFIED IDEOGRAPH <U6615> \xFA\xCF |0 # CJK UNIFIED IDEOGRAPH +<U6615> \xED\xB3 |3 # CJK UNIFIED IDEOGRAPH <U661C> \x9D\xE4 |0 # CJK UNIFIED IDEOGRAPH <U661E> \xFA\xD3 |0 # CJK UNIFIED IDEOGRAPH +<U661E> \xED\xB7 |3 # CJK UNIFIED IDEOGRAPH <U661F> \x90\xAF |0 # CJK UNIFIED IDEOGRAPH <U6620> \x89\x66 |0 # CJK UNIFIED IDEOGRAPH <U6624> \xFA\xD4 |0 # CJK UNIFIED IDEOGRAPH +<U6624> \xED\xB8 |3 # CJK UNIFIED IDEOGRAPH <U6625> \x8F\x74 |0 # CJK UNIFIED IDEOGRAPH <U6627> \x96\x86 |0 # CJK UNIFIED IDEOGRAPH <U6628> \x8D\xF0 |0 # CJK UNIFIED IDEOGRAPH <U662D> \x8F\xBA |0 # CJK UNIFIED IDEOGRAPH <U662E> \xFA\xD2 |0 # CJK UNIFIED IDEOGRAPH +<U662E> \xED\xB6 |3 # CJK UNIFIED IDEOGRAPH <U662F> \x90\xA5 |0 # CJK UNIFIED IDEOGRAPH <U6631> \xFA\x63 |0 # CJK UNIFIED IDEOGRAPH +<U6631> \xED\x47 |3 # CJK UNIFIED IDEOGRAPH <U6634> \x9D\xE3 |0 # CJK UNIFIED IDEOGRAPH <U6635> \x9D\xE1 |0 # CJK UNIFIED IDEOGRAPH <U6636> \x9D\xE2 |0 # CJK UNIFIED IDEOGRAPH <U663B> \xFA\xD0 |0 # CJK UNIFIED IDEOGRAPH +<U663B> \xED\xB4 |3 # CJK UNIFIED IDEOGRAPH <U663C> \x92\x8B |0 # CJK UNIFIED IDEOGRAPH <U663F> \x9E\x45 |0 # CJK UNIFIED IDEOGRAPH <U6641> \x9D\xE8 |0 # CJK UNIFIED IDEOGRAPH @@ -2922,13 +3068,16 @@ CHARMAP <U664F> \x9D\xE5 |0 # CJK UNIFIED IDEOGRAPH <U6652> \x8E\x4E |0 # CJK UNIFIED IDEOGRAPH <U6657> \xFA\xD6 |0 # CJK UNIFIED IDEOGRAPH +<U6657> \xED\xBA |3 # CJK UNIFIED IDEOGRAPH <U6659> \xFA\xD7 |0 # CJK UNIFIED IDEOGRAPH +<U6659> \xED\xBB |3 # CJK UNIFIED IDEOGRAPH <U665D> \x9D\xEA |0 # CJK UNIFIED IDEOGRAPH <U665E> \x9D\xE9 |0 # CJK UNIFIED IDEOGRAPH <U665F> \x9D\xEE |0 # CJK UNIFIED IDEOGRAPH <U6662> \x9D\xEF |0 # CJK UNIFIED IDEOGRAPH <U6664> \x9D\xEB |0 # CJK UNIFIED IDEOGRAPH <U6665> \xFA\xD5 |0 # CJK UNIFIED IDEOGRAPH +<U6665> \xED\xB9 |3 # CJK UNIFIED IDEOGRAPH <U6666> \x8A\x41 |0 # CJK UNIFIED IDEOGRAPH <U6667> \x9D\xEC |0 # CJK UNIFIED IDEOGRAPH <U6668> \x9D\xED |0 # CJK UNIFIED IDEOGRAPH @@ -2937,6 +3086,7 @@ CHARMAP <U666F> \x8C\x69 |0 # CJK UNIFIED IDEOGRAPH <U6670> \x9D\xF0 |0 # CJK UNIFIED IDEOGRAPH <U6673> \xFA\xD9 |0 # CJK UNIFIED IDEOGRAPH +<U6673> \xED\xBD |3 # CJK UNIFIED IDEOGRAPH <U6674> \x90\xB0 |0 # CJK UNIFIED IDEOGRAPH <U6676> \x8F\xBB |0 # CJK UNIFIED IDEOGRAPH <U667A> \x92\x71 |0 # CJK UNIFIED IDEOGRAPH @@ -2952,19 +3102,23 @@ CHARMAP <U6697> \x88\xC3 |0 # CJK UNIFIED IDEOGRAPH <U6698> \x9D\xF6 |0 # CJK UNIFIED IDEOGRAPH <U6699> \xFA\xDA |0 # CJK UNIFIED IDEOGRAPH +<U6699> \xED\xBE |3 # CJK UNIFIED IDEOGRAPH <U669D> \x9D\xF7 |0 # CJK UNIFIED IDEOGRAPH <U66A0> \xFA\xDB |0 # CJK UNIFIED IDEOGRAPH +<U66A0> \xED\xBF |3 # CJK UNIFIED IDEOGRAPH <U66A2> \x92\xA8 |0 # CJK UNIFIED IDEOGRAPH <U66A6> \x97\xEF |0 # CJK UNIFIED IDEOGRAPH <U66AB> \x8E\x62 |0 # CJK UNIFIED IDEOGRAPH <U66AE> \x95\xE9 |0 # CJK UNIFIED IDEOGRAPH <U66B2> \xFA\xDC |0 # CJK UNIFIED IDEOGRAPH +<U66B2> \xED\xC0 |3 # CJK UNIFIED IDEOGRAPH <U66B4> \x96\x5C |0 # CJK UNIFIED IDEOGRAPH <U66B8> \x9E\x41 |0 # CJK UNIFIED IDEOGRAPH <U66B9> \x9D\xF9 |0 # CJK UNIFIED IDEOGRAPH <U66BC> \x9D\xFC |0 # CJK UNIFIED IDEOGRAPH <U66BE> \x9D\xFB |0 # CJK UNIFIED IDEOGRAPH <U66BF> \xFA\xDD |0 # CJK UNIFIED IDEOGRAPH +<U66BF> \xED\xC1 |3 # CJK UNIFIED IDEOGRAPH <U66C1> \x9D\xF8 |0 # CJK UNIFIED IDEOGRAPH <U66C4> \x9E\x40 |0 # CJK UNIFIED IDEOGRAPH <U66C7> \x93\xDC |0 # CJK UNIFIED IDEOGRAPH @@ -2986,7 +3140,9 @@ CHARMAP <U66F8> \x8F\x91 |0 # CJK UNIFIED IDEOGRAPH <U66F9> \x91\x82 |0 # CJK UNIFIED IDEOGRAPH <U66FA> \xFA\xDE |0 # CJK UNIFIED IDEOGRAPH +<U66FA> \xED\xC2 |3 # CJK UNIFIED IDEOGRAPH <U66FB> \xFA\x66 |0 # CJK UNIFIED IDEOGRAPH +<U66FB> \xED\x4A |3 # CJK UNIFIED IDEOGRAPH <U66FC> \x99\xD6 |0 # CJK UNIFIED IDEOGRAPH <U66FD> \x91\x5D |0 # CJK UNIFIED IDEOGRAPH <U66FE> \x91\x5C |0 # CJK UNIFIED IDEOGRAPH @@ -2998,6 +3154,7 @@ CHARMAP <U670B> \x95\xFC |0 # CJK UNIFIED IDEOGRAPH <U670D> \x95\x9E |0 # CJK UNIFIED IDEOGRAPH <U670E> \xFA\xDF |0 # CJK UNIFIED IDEOGRAPH +<U670E> \xED\xC3 |3 # CJK UNIFIED IDEOGRAPH <U670F> \x9E\x4B |0 # CJK UNIFIED IDEOGRAPH <U6714> \x8D\xF1 |0 # CJK UNIFIED IDEOGRAPH <U6715> \x92\xBD |0 # CJK UNIFIED IDEOGRAPH @@ -3043,6 +3200,7 @@ CHARMAP <U6764> \x9E\x5C |0 # CJK UNIFIED IDEOGRAPH <U6765> \x97\x88 |0 # CJK UNIFIED IDEOGRAPH <U6766> \xFA\xE1 |0 # CJK UNIFIED IDEOGRAPH +<U6766> \xED\xC5 |3 # CJK UNIFIED IDEOGRAPH <U676A> \x9E\x61 |0 # CJK UNIFIED IDEOGRAPH <U676D> \x8D\x59 |0 # CJK UNIFIED IDEOGRAPH <U676F> \x94\x74 |0 # CJK UNIFIED IDEOGRAPH @@ -3079,7 +3237,9 @@ CHARMAP <U67B8> \x9E\x6D |0 # CJK UNIFIED IDEOGRAPH <U67B9> \x9E\x73 |0 # CJK UNIFIED IDEOGRAPH <U67BB> \xFA\xE2 |0 # CJK UNIFIED IDEOGRAPH +<U67BB> \xED\xC6 |3 # CJK UNIFIED IDEOGRAPH <U67C0> \xFA\xE4 |0 # CJK UNIFIED IDEOGRAPH +<U67C0> \xED\xC8 |3 # CJK UNIFIED IDEOGRAPH <U67C1> \x91\xC6 |0 # CJK UNIFIED IDEOGRAPH <U67C4> \x95\xBF |0 # CJK UNIFIED IDEOGRAPH <U67C6> \x9E\x75 |0 # CJK UNIFIED IDEOGRAPH @@ -3109,6 +3269,7 @@ CHARMAP <U67FE> \x96\x8F |0 # CJK UNIFIED IDEOGRAPH <U67FF> \x8A\x60 |0 # CJK UNIFIED IDEOGRAPH <U6801> \xFA\xE5 |0 # CJK UNIFIED IDEOGRAPH +<U6801> \xED\xC9 |3 # CJK UNIFIED IDEOGRAPH <U6802> \x92\xCC |0 # CJK UNIFIED IDEOGRAPH <U6803> \x93\xC8 |0 # CJK UNIFIED IDEOGRAPH <U6804> \x89\x68 |0 # CJK UNIFIED IDEOGRAPH @@ -3132,6 +3293,7 @@ CHARMAP <U6842> \x8C\x6A |0 # CJK UNIFIED IDEOGRAPH <U6843> \x93\x8D |0 # CJK UNIFIED IDEOGRAPH <U6844> \xFA\xE6 |0 # CJK UNIFIED IDEOGRAPH +<U6844> \xED\xCA |3 # CJK UNIFIED IDEOGRAPH <U6846> \x9E\x79 |0 # CJK UNIFIED IDEOGRAPH <U6848> \x88\xC4 |0 # CJK UNIFIED IDEOGRAPH <U684D> \x9E\x7C |0 # CJK UNIFIED IDEOGRAPH @@ -3139,6 +3301,7 @@ CHARMAP <U6850> \x8B\xCB |0 # CJK UNIFIED IDEOGRAPH <U6851> \x8C\x4B |0 # CJK UNIFIED IDEOGRAPH <U6852> \xFA\xE3 |0 # CJK UNIFIED IDEOGRAPH +<U6852> \xED\xC7 |3 # CJK UNIFIED IDEOGRAPH <U6853> \x8A\xBA |0 # CJK UNIFIED IDEOGRAPH <U6854> \x8B\x6A |0 # CJK UNIFIED IDEOGRAPH <U6859> \x9E\x82 |0 # CJK UNIFIED IDEOGRAPH @@ -3181,11 +3344,13 @@ CHARMAP <U68C4> \x8A\xFC |0 # CJK UNIFIED IDEOGRAPH <U68C6> \x9E\xB0 |0 # CJK UNIFIED IDEOGRAPH <U68C8> \xFA\x64 |0 # CJK UNIFIED IDEOGRAPH +<U68C8> \xED\x48 |3 # CJK UNIFIED IDEOGRAPH <U68C9> \x96\xC7 |0 # CJK UNIFIED IDEOGRAPH <U68CA> \x9E\x97 |0 # CJK UNIFIED IDEOGRAPH <U68CB> \x8A\xFB |0 # CJK UNIFIED IDEOGRAPH <U68CD> \x9E\x9E |0 # CJK UNIFIED IDEOGRAPH <U68CF> \xFA\xE7 |0 # CJK UNIFIED IDEOGRAPH +<U68CF> \xED\xCB |3 # CJK UNIFIED IDEOGRAPH <U68D2> \x96\x5F |0 # CJK UNIFIED IDEOGRAPH <U68D4> \x9E\x9F |0 # CJK UNIFIED IDEOGRAPH <U68D5> \x9E\xA1 |0 # CJK UNIFIED IDEOGRAPH @@ -3243,6 +3408,7 @@ CHARMAP <U6961> \x9E\xBE |0 # CJK UNIFIED IDEOGRAPH <U6962> \x93\xE8 |0 # CJK UNIFIED IDEOGRAPH <U6968> \xFA\xE9 |0 # CJK UNIFIED IDEOGRAPH +<U6968> \xED\xCD |3 # CJK UNIFIED IDEOGRAPH <U696A> \x9E\xC2 |0 # CJK UNIFIED IDEOGRAPH <U696B> \x9E\xB5 |0 # CJK UNIFIED IDEOGRAPH <U696D> \x8B\xC6 |0 # CJK UNIFIED IDEOGRAPH @@ -3265,6 +3431,7 @@ CHARMAP <U6994> \x98\x50 |0 # CJK UNIFIED IDEOGRAPH <U6995> \x9E\xD5 |0 # CJK UNIFIED IDEOGRAPH <U6998> \xFA\xEB |0 # CJK UNIFIED IDEOGRAPH +<U6998> \xED\xCF |3 # CJK UNIFIED IDEOGRAPH <U699B> \x90\x59 |0 # CJK UNIFIED IDEOGRAPH <U699C> \x9E\xD4 |0 # CJK UNIFIED IDEOGRAPH <U69A0> \x9E\xD3 |0 # CJK UNIFIED IDEOGRAPH @@ -3291,6 +3458,7 @@ CHARMAP <U69DD> \x9E\xCD |0 # CJK UNIFIED IDEOGRAPH <U69DE> \x9E\xD7 |0 # CJK UNIFIED IDEOGRAPH <U69E2> \xFA\xEC |0 # CJK UNIFIED IDEOGRAPH +<U69E2> \xED\xD0 |3 # CJK UNIFIED IDEOGRAPH <U69E7> \x9E\xDF |0 # CJK UNIFIED IDEOGRAPH <U69E8> \x9E\xD8 |0 # CJK UNIFIED IDEOGRAPH <U69EB> \x9E\xE5 |0 # CJK UNIFIED IDEOGRAPH @@ -3321,6 +3489,7 @@ CHARMAP <U6A2B> \x8A\x7E |0 # CJK UNIFIED IDEOGRAPH <U6A2E> \x9E\xD1 |0 # CJK UNIFIED IDEOGRAPH <U6A30> \xFA\xED |0 # CJK UNIFIED IDEOGRAPH +<U6A30> \xED\xD1 |3 # CJK UNIFIED IDEOGRAPH <U6A35> \x8F\xBF |0 # CJK UNIFIED IDEOGRAPH <U6A36> \x9E\xEE |0 # CJK UNIFIED IDEOGRAPH <U6A38> \x9E\xF5 |0 # CJK UNIFIED IDEOGRAPH @@ -3329,6 +3498,7 @@ CHARMAP <U6A3D> \x92\x4D |0 # CJK UNIFIED IDEOGRAPH <U6A44> \x9E\xEB |0 # CJK UNIFIED IDEOGRAPH <U6A46> \xFA\xEF |0 # CJK UNIFIED IDEOGRAPH +<U6A46> \xED\xD3 |3 # CJK UNIFIED IDEOGRAPH <U6A47> \x9E\xF0 |0 # CJK UNIFIED IDEOGRAPH <U6A48> \x9E\xF4 |0 # CJK UNIFIED IDEOGRAPH <U6A4B> \x8B\xB4 |0 # CJK UNIFIED IDEOGRAPH @@ -3339,10 +3509,13 @@ CHARMAP <U6A62> \x9E\xF1 |0 # CJK UNIFIED IDEOGRAPH <U6A66> \x9E\xF3 |0 # CJK UNIFIED IDEOGRAPH <U6A6B> \xFA\xEE |0 # CJK UNIFIED IDEOGRAPH +<U6A6B> \xED\xD2 |3 # CJK UNIFIED IDEOGRAPH <U6A72> \x9E\xED |0 # CJK UNIFIED IDEOGRAPH <U6A73> \xFA\xF0 |0 # CJK UNIFIED IDEOGRAPH +<U6A73> \xED\xD4 |3 # CJK UNIFIED IDEOGRAPH <U6A78> \x9E\xEF |0 # CJK UNIFIED IDEOGRAPH <U6A7E> \xFA\xF1 |0 # CJK UNIFIED IDEOGRAPH +<U6A7E> \xED\xD5 |3 # CJK UNIFIED IDEOGRAPH <U6A7F> \x8A\x80 |0 # CJK UNIFIED IDEOGRAPH <U6A80> \x92\x68 |0 # CJK UNIFIED IDEOGRAPH <U6A84> \x9E\xFA |0 # CJK UNIFIED IDEOGRAPH @@ -3370,7 +3543,9 @@ CHARMAP <U6ADE> \x9F\x48 |0 # CJK UNIFIED IDEOGRAPH <U6ADF> \x9F\x4A |0 # CJK UNIFIED IDEOGRAPH <U6AE2> \xFA\xF2 |0 # CJK UNIFIED IDEOGRAPH +<U6AE2> \xED\xD6 |3 # CJK UNIFIED IDEOGRAPH <U6AE4> \xFA\xF3 |0 # CJK UNIFIED IDEOGRAPH +<U6AE4> \xED\xD7 |3 # CJK UNIFIED IDEOGRAPH <U6AE8> \x94\xA5 |0 # CJK UNIFIED IDEOGRAPH <U6AEA> \x9F\x4D |0 # CJK UNIFIED IDEOGRAPH <U6AFA> \x9F\x51 |0 # CJK UNIFIED IDEOGRAPH @@ -3454,6 +3629,7 @@ CHARMAP <U6BD3> \x9F\x79 |0 # CJK UNIFIED IDEOGRAPH <U6BD4> \x94\xE4 |0 # CJK UNIFIED IDEOGRAPH <U6BD6> \xFA\xF4 |0 # CJK UNIFIED IDEOGRAPH +<U6BD6> \xED\xD8 |3 # CJK UNIFIED IDEOGRAPH <U6BD8> \x94\xF9 |0 # CJK UNIFIED IDEOGRAPH <U6BDB> \x96\xD1 |0 # CJK UNIFIED IDEOGRAPH <U6BDF> \x9F\x7A |0 # CJK UNIFIED IDEOGRAPH @@ -3475,6 +3651,7 @@ CHARMAP <U6C38> \x89\x69 |0 # CJK UNIFIED IDEOGRAPH <U6C3E> \x94\xC3 |0 # CJK UNIFIED IDEOGRAPH <U6C3F> \xFA\xF5 |0 # CJK UNIFIED IDEOGRAPH +<U6C3F> \xED\xD9 |3 # CJK UNIFIED IDEOGRAPH <U6C40> \x92\xF3 |0 # CJK UNIFIED IDEOGRAPH <U6C41> \x8F\x60 |0 # CJK UNIFIED IDEOGRAPH <U6C42> \x8B\x81 |0 # CJK UNIFIED IDEOGRAPH @@ -3484,6 +3661,7 @@ CHARMAP <U6C57> \x8A\xBE |0 # CJK UNIFIED IDEOGRAPH <U6C5A> \x89\x98 |0 # CJK UNIFIED IDEOGRAPH <U6C5C> \xFA\xF6 |0 # CJK UNIFIED IDEOGRAPH +<U6C5C> \xED\xDA |3 # CJK UNIFIED IDEOGRAPH <U6C5D> \x93\xF0 |0 # CJK UNIFIED IDEOGRAPH <U6C5E> \x9F\x87 |0 # CJK UNIFIED IDEOGRAPH <U6C5F> \x8D\x5D |0 # CJK UNIFIED IDEOGRAPH @@ -3492,6 +3670,7 @@ CHARMAP <U6C68> \x9F\x91 |0 # CJK UNIFIED IDEOGRAPH <U6C6A> \x9F\x8A |0 # CJK UNIFIED IDEOGRAPH <U6C6F> \xFA\xF8 |0 # CJK UNIFIED IDEOGRAPH +<U6C6F> \xED\xDC |3 # CJK UNIFIED IDEOGRAPH <U6C70> \x91\xBF |0 # CJK UNIFIED IDEOGRAPH <U6C72> \x8B\x82 |0 # CJK UNIFIED IDEOGRAPH <U6C73> \x9F\x92 |0 # CJK UNIFIED IDEOGRAPH @@ -3502,6 +3681,7 @@ CHARMAP <U6C82> \x9F\x8B |0 # CJK UNIFIED IDEOGRAPH <U6C83> \x97\x80 |0 # CJK UNIFIED IDEOGRAPH <U6C86> \xFA\xF7 |0 # CJK UNIFIED IDEOGRAPH +<U6C86> \xED\xDB |3 # CJK UNIFIED IDEOGRAPH <U6C88> \x92\xBE |0 # CJK UNIFIED IDEOGRAPH <U6C8C> \x93\xD7 |0 # CJK UNIFIED IDEOGRAPH <U6C8D> \x9F\x8C |0 # CJK UNIFIED IDEOGRAPH @@ -3537,6 +3717,7 @@ CHARMAP <U6CD7> \x9F\x99 |0 # CJK UNIFIED IDEOGRAPH <U6CD9> \x9F\xA2 |0 # CJK UNIFIED IDEOGRAPH <U6CDA> \xFA\xF9 |0 # CJK UNIFIED IDEOGRAPH +<U6CDA> \xED\xDD |3 # CJK UNIFIED IDEOGRAPH <U6CDB> \x9F\xA0 |0 # CJK UNIFIED IDEOGRAPH <U6CDD> \x9F\x9B |0 # CJK UNIFIED IDEOGRAPH <U6CE1> \x96\x41 |0 # CJK UNIFIED IDEOGRAPH @@ -3550,6 +3731,7 @@ CHARMAP <U6CF1> \x9F\x96 |0 # CJK UNIFIED IDEOGRAPH <U6CF3> \x89\x6A |0 # CJK UNIFIED IDEOGRAPH <U6D04> \xFA\xFA |0 # CJK UNIFIED IDEOGRAPH +<U6D04> \xED\xDE |3 # CJK UNIFIED IDEOGRAPH <U6D0B> \x97\x6D |0 # CJK UNIFIED IDEOGRAPH <U6D0C> \x9F\xAE |0 # CJK UNIFIED IDEOGRAPH <U6D12> \x9F\xAD |0 # CJK UNIFIED IDEOGRAPH @@ -3584,22 +3766,26 @@ CHARMAP <U6D6C> \x8A\x5C |0 # CJK UNIFIED IDEOGRAPH <U6D6E> \x95\x82 |0 # CJK UNIFIED IDEOGRAPH <U6D6F> \xFA\xFC |0 # CJK UNIFIED IDEOGRAPH +<U6D6F> \xED\xE0 |3 # CJK UNIFIED IDEOGRAPH <U6D74> \x97\x81 |0 # CJK UNIFIED IDEOGRAPH <U6D77> \x8A\x43 |0 # CJK UNIFIED IDEOGRAPH <U6D78> \x90\x5A |0 # CJK UNIFIED IDEOGRAPH <U6D79> \x9F\xB3 |0 # CJK UNIFIED IDEOGRAPH <U6D85> \x9F\xB8 |0 # CJK UNIFIED IDEOGRAPH <U6D87> \xFA\xFB |0 # CJK UNIFIED IDEOGRAPH +<U6D87> \xED\xDF |3 # CJK UNIFIED IDEOGRAPH <U6D88> \x8F\xC1 |0 # CJK UNIFIED IDEOGRAPH <U6D8C> \x97\x4F |0 # CJK UNIFIED IDEOGRAPH <U6D8E> \x9F\xB5 |0 # CJK UNIFIED IDEOGRAPH <U6D93> \x9F\xB0 |0 # CJK UNIFIED IDEOGRAPH <U6D95> \x9F\xB6 |0 # CJK UNIFIED IDEOGRAPH <U6D96> \xFB\x40 |0 # CJK UNIFIED IDEOGRAPH +<U6D96> \xED\xE1 |3 # CJK UNIFIED IDEOGRAPH <U6D99> \x97\xDC |0 # CJK UNIFIED IDEOGRAPH <U6D9B> \x93\x93 |0 # CJK UNIFIED IDEOGRAPH <U6D9C> \x93\xC0 |0 # CJK UNIFIED IDEOGRAPH <U6DAC> \xFB\x41 |0 # CJK UNIFIED IDEOGRAPH +<U6DAC> \xED\xE2 |3 # CJK UNIFIED IDEOGRAPH <U6DAF> \x8A\x55 |0 # CJK UNIFIED IDEOGRAPH <U6DB2> \x89\x74 |0 # CJK UNIFIED IDEOGRAPH <U6DB5> \x9F\xBC |0 # CJK UNIFIED IDEOGRAPH @@ -3612,6 +3798,7 @@ CHARMAP <U6DCB> \x97\xD2 |0 # CJK UNIFIED IDEOGRAPH <U6DCC> \x9F\xC3 |0 # CJK UNIFIED IDEOGRAPH <U6DCF> \xFB\x42 |0 # CJK UNIFIED IDEOGRAPH +<U6DCF> \xED\xE3 |3 # CJK UNIFIED IDEOGRAPH <U6DD1> \x8F\x69 |0 # CJK UNIFIED IDEOGRAPH <U6DD2> \x9F\xC5 |0 # CJK UNIFIED IDEOGRAPH <U6DD5> \x9F\xCA |0 # CJK UNIFIED IDEOGRAPH @@ -3628,14 +3815,17 @@ CHARMAP <U6DEE> \x9F\xCC |0 # CJK UNIFIED IDEOGRAPH <U6DF1> \x90\x5B |0 # CJK UNIFIED IDEOGRAPH <U6DF2> \xFB\x44 |0 # CJK UNIFIED IDEOGRAPH +<U6DF2> \xED\xE5 |3 # CJK UNIFIED IDEOGRAPH <U6DF3> \x8F\x7E |0 # CJK UNIFIED IDEOGRAPH <U6DF5> \x95\xA3 |0 # CJK UNIFIED IDEOGRAPH <U6DF7> \x8D\xAC |0 # CJK UNIFIED IDEOGRAPH <U6DF8> \xFB\x43 |0 # CJK UNIFIED IDEOGRAPH +<U6DF8> \xED\xE4 |3 # CJK UNIFIED IDEOGRAPH <U6DF9> \x9F\xB9 |0 # CJK UNIFIED IDEOGRAPH <U6DFA> \x9F\xC7 |0 # CJK UNIFIED IDEOGRAPH <U6DFB> \x93\x59 |0 # CJK UNIFIED IDEOGRAPH <U6DFC> \xFB\x45 |0 # CJK UNIFIED IDEOGRAPH +<U6DFC> \xED\xE6 |3 # CJK UNIFIED IDEOGRAPH <U6E05> \x90\xB4 |0 # CJK UNIFIED IDEOGRAPH <U6E07> \x8A\x89 |0 # CJK UNIFIED IDEOGRAPH <U6E08> \x8D\xCF |0 # CJK UNIFIED IDEOGRAPH @@ -3656,6 +3846,7 @@ CHARMAP <U6E25> \x88\xAD |0 # CJK UNIFIED IDEOGRAPH <U6E26> \x89\x51 |0 # CJK UNIFIED IDEOGRAPH <U6E27> \xFB\x48 |0 # CJK UNIFIED IDEOGRAPH +<U6E27> \xED\xE9 |3 # CJK UNIFIED IDEOGRAPH <U6E29> \x89\xB7 |0 # CJK UNIFIED IDEOGRAPH <U6E2B> \x9F\xD6 |0 # CJK UNIFIED IDEOGRAPH <U6E2C> \x91\xAA |0 # CJK UNIFIED IDEOGRAPH @@ -3664,8 +3855,10 @@ CHARMAP <U6E2F> \x8D\x60 |0 # CJK UNIFIED IDEOGRAPH <U6E38> \x9F\xE0 |0 # CJK UNIFIED IDEOGRAPH <U6E39> \xFB\x46 |0 # CJK UNIFIED IDEOGRAPH +<U6E39> \xED\xE7 |3 # CJK UNIFIED IDEOGRAPH <U6E3A> \x9F\xDB |0 # CJK UNIFIED IDEOGRAPH <U6E3C> \xFB\x49 |0 # CJK UNIFIED IDEOGRAPH +<U6E3C> \xED\xEA |3 # CJK UNIFIED IDEOGRAPH <U6E3E> \x9F\xD3 |0 # CJK UNIFIED IDEOGRAPH <U6E43> \x9F\xDA |0 # CJK UNIFIED IDEOGRAPH <U6E4A> \x96\xA9 |0 # CJK UNIFIED IDEOGRAPH @@ -3675,6 +3868,7 @@ CHARMAP <U6E58> \x8F\xC3 |0 # CJK UNIFIED IDEOGRAPH <U6E5B> \x92\x58 |0 # CJK UNIFIED IDEOGRAPH <U6E5C> \xFB\x47 |0 # CJK UNIFIED IDEOGRAPH +<U6E5C> \xED\xE8 |3 # CJK UNIFIED IDEOGRAPH <U6E5F> \x9F\xD2 |0 # CJK UNIFIED IDEOGRAPH <U6E67> \x97\x4E |0 # CJK UNIFIED IDEOGRAPH <U6E6B> \x9F\xD5 |0 # CJK UNIFIED IDEOGRAPH @@ -3704,6 +3898,7 @@ CHARMAP <U6EBA> \x93\x4D |0 # CJK UNIFIED IDEOGRAPH <U6EBD> \x9F\xE7 |0 # CJK UNIFIED IDEOGRAPH <U6EBF> \xFB\x4A |0 # CJK UNIFIED IDEOGRAPH +<U6EBF> \xED\xEB |3 # CJK UNIFIED IDEOGRAPH <U6EC2> \x9F\xEF |0 # CJK UNIFIED IDEOGRAPH <U6EC4> \x9F\xE9 |0 # CJK UNIFIED IDEOGRAPH <U6EC5> \x96\xC5 |0 # CJK UNIFIED IDEOGRAPH @@ -3766,6 +3961,7 @@ CHARMAP <U6F84> \x90\x9F |0 # CJK UNIFIED IDEOGRAPH <U6F86> \xE0\x43 |0 # CJK UNIFIED IDEOGRAPH <U6F88> \xFB\x4B |0 # CJK UNIFIED IDEOGRAPH +<U6F88> \xED\xEC |3 # CJK UNIFIED IDEOGRAPH <U6F8E> \xE0\x4F |0 # CJK UNIFIED IDEOGRAPH <U6F91> \xE0\x50 |0 # CJK UNIFIED IDEOGRAPH <U6F97> \x8A\xC0 |0 # CJK UNIFIED IDEOGRAPH @@ -3776,6 +3972,7 @@ CHARMAP <U6FB1> \x93\x62 |0 # CJK UNIFIED IDEOGRAPH <U6FB3> \xE0\x53 |0 # CJK UNIFIED IDEOGRAPH <U6FB5> \xFB\x4C |0 # CJK UNIFIED IDEOGRAPH +<U6FB5> \xED\xED |3 # CJK UNIFIED IDEOGRAPH <U6FB9> \xE0\x57 |0 # CJK UNIFIED IDEOGRAPH <U6FC0> \x8C\x83 |0 # CJK UNIFIED IDEOGRAPH <U6FC1> \x91\xF7 |0 # CJK UNIFIED IDEOGRAPH @@ -3797,12 +3994,15 @@ CHARMAP <U6FF1> \xE0\x5F |0 # CJK UNIFIED IDEOGRAPH <U6FF3> \xE0\x4A |0 # CJK UNIFIED IDEOGRAPH <U6FF5> \xFB\x4D |0 # CJK UNIFIED IDEOGRAPH +<U6FF5> \xED\xEE |3 # CJK UNIFIED IDEOGRAPH <U6FF6> \xE8\x89 |0 # CJK UNIFIED IDEOGRAPH <U6FFA> \xE0\x64 |0 # CJK UNIFIED IDEOGRAPH <U6FFE> \xE0\x68 |0 # CJK UNIFIED IDEOGRAPH <U7001> \xE0\x66 |0 # CJK UNIFIED IDEOGRAPH <U7005> \xFB\x4E |0 # CJK UNIFIED IDEOGRAPH +<U7005> \xED\xEF |3 # CJK UNIFIED IDEOGRAPH <U7007> \xFB\x4F |0 # CJK UNIFIED IDEOGRAPH +<U7007> \xED\xF0 |3 # CJK UNIFIED IDEOGRAPH <U7009> \xE0\x62 |0 # CJK UNIFIED IDEOGRAPH <U700B> \xE0\x63 |0 # CJK UNIFIED IDEOGRAPH <U700F> \xE0\x67 |0 # CJK UNIFIED IDEOGRAPH @@ -3817,6 +4017,7 @@ CHARMAP <U7026> \x92\x95 |0 # CJK UNIFIED IDEOGRAPH <U7027> \x91\xEB |0 # CJK UNIFIED IDEOGRAPH <U7028> \xFB\x50 |0 # CJK UNIFIED IDEOGRAPH +<U7028> \xED\xF1 |3 # CJK UNIFIED IDEOGRAPH <U702C> \x90\xA3 |0 # CJK UNIFIED IDEOGRAPH <U7030> \xE0\x6F |0 # CJK UNIFIED IDEOGRAPH <U7032> \xE0\x71 |0 # CJK UNIFIED IDEOGRAPH @@ -3832,12 +4033,14 @@ CHARMAP <U707C> \x8E\xDC |0 # CJK UNIFIED IDEOGRAPH <U707D> \x8D\xD0 |0 # CJK UNIFIED IDEOGRAPH <U7085> \xFB\x51 |0 # CJK UNIFIED IDEOGRAPH +<U7085> \xED\xF2 |3 # CJK UNIFIED IDEOGRAPH <U7089> \x98\x46 |0 # CJK UNIFIED IDEOGRAPH <U708A> \x90\x86 |0 # CJK UNIFIED IDEOGRAPH <U708E> \x89\x8A |0 # CJK UNIFIED IDEOGRAPH <U7092> \xE0\x75 |0 # CJK UNIFIED IDEOGRAPH <U7099> \xE0\x74 |0 # CJK UNIFIED IDEOGRAPH <U70AB> \xFB\x52 |0 # CJK UNIFIED IDEOGRAPH +<U70AB> \xED\xF3 |3 # CJK UNIFIED IDEOGRAPH <U70AC> \xE0\x78 |0 # CJK UNIFIED IDEOGRAPH <U70AD> \x92\x59 |0 # CJK UNIFIED IDEOGRAPH <U70AE> \xE0\x7B |0 # CJK UNIFIED IDEOGRAPH @@ -3847,6 +4050,7 @@ CHARMAP <U70B9> \x93\x5F |0 # CJK UNIFIED IDEOGRAPH <U70BA> \x88\xD7 |0 # CJK UNIFIED IDEOGRAPH <U70BB> \xFA\x62 |0 # CJK UNIFIED IDEOGRAPH +<U70BB> \xED\x46 |3 # CJK UNIFIED IDEOGRAPH <U70C8> \x97\xF3 |0 # CJK UNIFIED IDEOGRAPH <U70CB> \xE0\x7D |0 # CJK UNIFIED IDEOGRAPH <U70CF> \x89\x47 |0 # CJK UNIFIED IDEOGRAPH @@ -3857,8 +4061,10 @@ CHARMAP <U70F9> \x96\x42 |0 # CJK UNIFIED IDEOGRAPH <U70FD> \xE0\x82 |0 # CJK UNIFIED IDEOGRAPH <U7104> \xFB\x54 |0 # CJK UNIFIED IDEOGRAPH +<U7104> \xED\xF5 |3 # CJK UNIFIED IDEOGRAPH <U7109> \xE0\x81 |0 # CJK UNIFIED IDEOGRAPH <U710F> \xFB\x53 |0 # CJK UNIFIED IDEOGRAPH +<U710F> \xED\xF4 |3 # CJK UNIFIED IDEOGRAPH <U7114> \x89\x8B |0 # CJK UNIFIED IDEOGRAPH <U7119> \xE0\x84 |0 # CJK UNIFIED IDEOGRAPH <U711A> \x95\xB0 |0 # CJK UNIFIED IDEOGRAPH @@ -3868,7 +4074,9 @@ CHARMAP <U7136> \x91\x52 |0 # CJK UNIFIED IDEOGRAPH <U713C> \x8F\xC4 |0 # CJK UNIFIED IDEOGRAPH <U7146> \xFB\x56 |0 # CJK UNIFIED IDEOGRAPH +<U7146> \xED\xF7 |3 # CJK UNIFIED IDEOGRAPH <U7147> \xFB\x57 |0 # CJK UNIFIED IDEOGRAPH +<U7147> \xED\xF8 |3 # CJK UNIFIED IDEOGRAPH <U7149> \x97\xF9 |0 # CJK UNIFIED IDEOGRAPH <U714C> \xE0\x8A |0 # CJK UNIFIED IDEOGRAPH <U714E> \x90\xF7 |0 # CJK UNIFIED IDEOGRAPH @@ -3876,6 +4084,7 @@ CHARMAP <U7156> \xE0\x8B |0 # CJK UNIFIED IDEOGRAPH <U7159> \x89\x8C |0 # CJK UNIFIED IDEOGRAPH <U715C> \xFB\x55 |0 # CJK UNIFIED IDEOGRAPH +<U715C> \xED\xF6 |3 # CJK UNIFIED IDEOGRAPH <U7162> \xE0\x89 |0 # CJK UNIFIED IDEOGRAPH <U7164> \x94\x81 |0 # CJK UNIFIED IDEOGRAPH <U7165> \xE0\x85 |0 # CJK UNIFIED IDEOGRAPH @@ -3899,6 +4108,7 @@ CHARMAP <U71B9> \xE0\x94 |0 # CJK UNIFIED IDEOGRAPH <U71BE> \xE0\x95 |0 # CJK UNIFIED IDEOGRAPH <U71C1> \xFB\x59 |0 # CJK UNIFIED IDEOGRAPH +<U71C1> \xED\xFA |3 # CJK UNIFIED IDEOGRAPH <U71C3> \x94\x52 |0 # CJK UNIFIED IDEOGRAPH <U71C8> \x93\x95 |0 # CJK UNIFIED IDEOGRAPH <U71C9> \xE0\x97 |0 # CJK UNIFIED IDEOGRAPH @@ -3921,6 +4131,7 @@ CHARMAP <U71FB> \xE0\x8E |0 # CJK UNIFIED IDEOGRAPH <U71FC> \xE0\x9E |0 # CJK UNIFIED IDEOGRAPH <U71FE> \xFB\x5A |0 # CJK UNIFIED IDEOGRAPH +<U71FE> \xED\xFB |3 # CJK UNIFIED IDEOGRAPH <U71FF> \xE0\xA0 |0 # CJK UNIFIED IDEOGRAPH <U7206> \x94\x9A |0 # CJK UNIFIED IDEOGRAPH <U720D> \xE0\xA1 |0 # CJK UNIFIED IDEOGRAPH @@ -3973,10 +4184,12 @@ CHARMAP <U72AC> \x8C\xA2 |0 # CJK UNIFIED IDEOGRAPH <U72AF> \x94\xC6 |0 # CJK UNIFIED IDEOGRAPH <U72B1> \xFB\x5B |0 # CJK UNIFIED IDEOGRAPH +<U72B1> \xED\xFC |3 # CJK UNIFIED IDEOGRAPH <U72B2> \xE0\xBA |0 # CJK UNIFIED IDEOGRAPH <U72B6> \x8F\xF3 |0 # CJK UNIFIED IDEOGRAPH <U72B9> \xE0\xB9 |0 # CJK UNIFIED IDEOGRAPH <U72BE> \xFB\x5C |0 # CJK UNIFIED IDEOGRAPH +<U72BE> \xEE\x40 |3 # CJK UNIFIED IDEOGRAPH <U72C2> \x8B\xB6 |0 # CJK UNIFIED IDEOGRAPH <U72C3> \xE0\xBB |0 # CJK UNIFIED IDEOGRAPH <U72C4> \xE0\xBD |0 # CJK UNIFIED IDEOGRAPH @@ -4006,6 +4219,7 @@ CHARMAP <U731D> \xE0\xCA |0 # CJK UNIFIED IDEOGRAPH <U731F> \x97\xC2 |0 # CJK UNIFIED IDEOGRAPH <U7324> \xFB\x5D |0 # CJK UNIFIED IDEOGRAPH +<U7324> \xEE\x41 |3 # CJK UNIFIED IDEOGRAPH <U7325> \xE0\xCE |0 # CJK UNIFIED IDEOGRAPH <U7329> \xE0\xCD |0 # CJK UNIFIED IDEOGRAPH <U732A> \x92\x96 |0 # CJK UNIFIED IDEOGRAPH @@ -4029,6 +4243,7 @@ CHARMAP <U7372> \x8A\x6C |0 # CJK UNIFIED IDEOGRAPH <U7375> \xE0\xD8 |0 # CJK UNIFIED IDEOGRAPH <U7377> \xFB\x5F |0 # CJK UNIFIED IDEOGRAPH +<U7377> \xEE\x43 |3 # CJK UNIFIED IDEOGRAPH <U7378> \xE0\xD7 |0 # CJK UNIFIED IDEOGRAPH <U737A> \xE0\xDA |0 # CJK UNIFIED IDEOGRAPH <U737B> \xE0\xD9 |0 # CJK UNIFIED IDEOGRAPH @@ -4042,37 +4257,48 @@ CHARMAP <U73B3> \xE0\xDC |0 # CJK UNIFIED IDEOGRAPH <U73BB> \xE0\xDE |0 # CJK UNIFIED IDEOGRAPH <U73BD> \xFB\x60 |0 # CJK UNIFIED IDEOGRAPH +<U73BD> \xEE\x44 |3 # CJK UNIFIED IDEOGRAPH <U73C0> \xE0\xDF |0 # CJK UNIFIED IDEOGRAPH <U73C2> \x89\xCF |0 # CJK UNIFIED IDEOGRAPH <U73C8> \xE0\xDB |0 # CJK UNIFIED IDEOGRAPH <U73C9> \xFB\x61 |0 # CJK UNIFIED IDEOGRAPH +<U73C9> \xEE\x45 |3 # CJK UNIFIED IDEOGRAPH <U73CA> \x8E\x58 |0 # CJK UNIFIED IDEOGRAPH <U73CD> \x92\xBF |0 # CJK UNIFIED IDEOGRAPH <U73CE> \xE0\xDD |0 # CJK UNIFIED IDEOGRAPH <U73D2> \xFB\x64 |0 # CJK UNIFIED IDEOGRAPH +<U73D2> \xEE\x48 |3 # CJK UNIFIED IDEOGRAPH <U73D6> \xFB\x62 |0 # CJK UNIFIED IDEOGRAPH +<U73D6> \xEE\x46 |3 # CJK UNIFIED IDEOGRAPH <U73DE> \xE0\xE2 |0 # CJK UNIFIED IDEOGRAPH <U73E0> \x8E\xEC |0 # CJK UNIFIED IDEOGRAPH <U73E3> \xFB\x63 |0 # CJK UNIFIED IDEOGRAPH +<U73E3> \xEE\x47 |3 # CJK UNIFIED IDEOGRAPH <U73E5> \xE0\xE0 |0 # CJK UNIFIED IDEOGRAPH <U73EA> \x8C\x5D |0 # CJK UNIFIED IDEOGRAPH <U73ED> \x94\xC7 |0 # CJK UNIFIED IDEOGRAPH <U73EE> \xE0\xE1 |0 # CJK UNIFIED IDEOGRAPH <U73F1> \xE0\xFC |0 # CJK UNIFIED IDEOGRAPH <U73F5> \xFB\x66 |0 # CJK UNIFIED IDEOGRAPH +<U73F5> \xEE\x4A |3 # CJK UNIFIED IDEOGRAPH <U73F8> \xE0\xE7 |0 # CJK UNIFIED IDEOGRAPH <U73FE> \x8C\xBB |0 # CJK UNIFIED IDEOGRAPH <U7403> \x8B\x85 |0 # CJK UNIFIED IDEOGRAPH <U7405> \xE0\xE4 |0 # CJK UNIFIED IDEOGRAPH <U7406> \x97\x9D |0 # CJK UNIFIED IDEOGRAPH <U7407> \xFB\x65 |0 # CJK UNIFIED IDEOGRAPH +<U7407> \xEE\x49 |3 # CJK UNIFIED IDEOGRAPH <U7409> \x97\xAE |0 # CJK UNIFIED IDEOGRAPH <U7422> \x91\xF4 |0 # CJK UNIFIED IDEOGRAPH <U7425> \xE0\xE6 |0 # CJK UNIFIED IDEOGRAPH <U7426> \xFB\x67 |0 # CJK UNIFIED IDEOGRAPH +<U7426> \xEE\x4B |3 # CJK UNIFIED IDEOGRAPH <U7429> \xFB\x69 |0 # CJK UNIFIED IDEOGRAPH +<U7429> \xEE\x4D |3 # CJK UNIFIED IDEOGRAPH <U742A> \xFB\x68 |0 # CJK UNIFIED IDEOGRAPH +<U742A> \xEE\x4C |3 # CJK UNIFIED IDEOGRAPH <U742E> \xFB\x6A |0 # CJK UNIFIED IDEOGRAPH +<U742E> \xEE\x4E |3 # CJK UNIFIED IDEOGRAPH <U7432> \xE0\xE8 |0 # CJK UNIFIED IDEOGRAPH <U7433> \x97\xD4 |0 # CJK UNIFIED IDEOGRAPH <U7434> \x8B\xD5 |0 # CJK UNIFIED IDEOGRAPH @@ -4090,6 +4316,7 @@ CHARMAP <U745F> \xE0\xEC |0 # CJK UNIFIED IDEOGRAPH <U7460> \x97\xDA |0 # CJK UNIFIED IDEOGRAPH <U7462> \xFB\x6B |0 # CJK UNIFIED IDEOGRAPH +<U7462> \xEE\x4F |3 # CJK UNIFIED IDEOGRAPH <U7463> \xE0\xF2 |0 # CJK UNIFIED IDEOGRAPH <U7464> \xEA\xA2 |0 # CJK UNIFIED IDEOGRAPH <U7469> \xE0\xF0 |0 # CJK UNIFIED IDEOGRAPH @@ -4101,9 +4328,11 @@ CHARMAP <U747E> \xE0\xF5 |0 # CJK UNIFIED IDEOGRAPH <U7483> \x97\x9E |0 # CJK UNIFIED IDEOGRAPH <U7489> \xFB\x6C |0 # CJK UNIFIED IDEOGRAPH +<U7489> \xEE\x50 |3 # CJK UNIFIED IDEOGRAPH <U748B> \xE0\xF6 |0 # CJK UNIFIED IDEOGRAPH <U749E> \xE0\xF7 |0 # CJK UNIFIED IDEOGRAPH <U749F> \xFB\x6D |0 # CJK UNIFIED IDEOGRAPH +<U749F> \xEE\x51 |3 # CJK UNIFIED IDEOGRAPH <U74A2> \xE0\xE3 |0 # CJK UNIFIED IDEOGRAPH <U74A7> \xE0\xF8 |0 # CJK UNIFIED IDEOGRAPH <U74B0> \x8A\xC2 |0 # CJK UNIFIED IDEOGRAPH @@ -4126,6 +4355,7 @@ CHARMAP <U74F7> \xE1\x49 |0 # CJK UNIFIED IDEOGRAPH <U74F8> \xE1\x48 |0 # CJK UNIFIED IDEOGRAPH <U7501> \xFB\x6E |0 # CJK UNIFIED IDEOGRAPH +<U7501> \xEE\x52 |3 # CJK UNIFIED IDEOGRAPH <U7503> \xE1\x4B |0 # CJK UNIFIED IDEOGRAPH <U7504> \xE1\x4A |0 # CJK UNIFIED IDEOGRAPH <U7505> \xE1\x4C |0 # CJK UNIFIED IDEOGRAPH @@ -4147,6 +4377,7 @@ CHARMAP <U752B> \x95\xE1 |0 # CJK UNIFIED IDEOGRAPH <U752C> \xE1\x54 |0 # CJK UNIFIED IDEOGRAPH <U752F> \xFA\xA8 |0 # CJK UNIFIED IDEOGRAPH +<U752F> \xED\x8C |3 # CJK UNIFIED IDEOGRAPH <U7530> \x93\x63 |0 # CJK UNIFIED IDEOGRAPH <U7531> \x97\x52 |0 # CJK UNIFIED IDEOGRAPH <U7532> \x8D\x62 |0 # CJK UNIFIED IDEOGRAPH @@ -4182,6 +4413,7 @@ CHARMAP <U756B> \xE1\x60 |0 # CJK UNIFIED IDEOGRAPH <U756D> \xE1\x61 |0 # CJK UNIFIED IDEOGRAPH <U756F> \xFB\x6F |0 # CJK UNIFIED IDEOGRAPH +<U756F> \xEE\x53 |3 # CJK UNIFIED IDEOGRAPH <U7570> \x88\xD9 |0 # CJK UNIFIED IDEOGRAPH <U7573> \x8F\xF4 |0 # CJK UNIFIED IDEOGRAPH <U7574> \xE1\x66 |0 # CJK UNIFIED IDEOGRAPH @@ -4277,6 +4509,7 @@ CHARMAP <U767E> \x95\x53 |0 # CJK UNIFIED IDEOGRAPH <U7680> \xE1\xA3 |0 # CJK UNIFIED IDEOGRAPH <U7682> \xFB\x70 |0 # CJK UNIFIED IDEOGRAPH +<U7682> \xEE\x54 |3 # CJK UNIFIED IDEOGRAPH <U7683> \xE1\xA4 |0 # CJK UNIFIED IDEOGRAPH <U7684> \x93\x49 |0 # CJK UNIFIED IDEOGRAPH <U7686> \x8A\x46 |0 # CJK UNIFIED IDEOGRAPH @@ -4290,9 +4523,13 @@ CHARMAP <U7699> \xE1\xAA |0 # CJK UNIFIED IDEOGRAPH <U769A> \xE1\xAB |0 # CJK UNIFIED IDEOGRAPH <U769B> \xFB\x73 |0 # CJK UNIFIED IDEOGRAPH +<U769B> \xEE\x57 |3 # CJK UNIFIED IDEOGRAPH <U769C> \xFB\x71 |0 # CJK UNIFIED IDEOGRAPH +<U769C> \xEE\x55 |3 # CJK UNIFIED IDEOGRAPH <U769E> \xFB\x72 |0 # CJK UNIFIED IDEOGRAPH +<U769E> \xEE\x56 |3 # CJK UNIFIED IDEOGRAPH <U76A6> \xFB\x74 |0 # CJK UNIFIED IDEOGRAPH +<U76A6> \xEE\x58 |3 # CJK UNIFIED IDEOGRAPH <U76AE> \x94\xE7 |0 # CJK UNIFIED IDEOGRAPH <U76B0> \xE1\xAC |0 # CJK UNIFIED IDEOGRAPH <U76B4> \xE1\xAD |0 # CJK UNIFIED IDEOGRAPH @@ -4347,6 +4584,7 @@ CHARMAP <U773C> \x8A\xE1 |0 # CJK UNIFIED IDEOGRAPH <U7740> \x92\x85 |0 # CJK UNIFIED IDEOGRAPH <U7746> \xFB\x76 |0 # CJK UNIFIED IDEOGRAPH +<U7746> \xEE\x5A |3 # CJK UNIFIED IDEOGRAPH <U7747> \xE1\xC7 |0 # CJK UNIFIED IDEOGRAPH <U775A> \xE1\xC8 |0 # CJK UNIFIED IDEOGRAPH <U775B> \xE1\xCB |0 # CJK UNIFIED IDEOGRAPH @@ -4398,6 +4636,7 @@ CHARMAP <U7815> \x8D\xD3 |0 # CJK UNIFIED IDEOGRAPH <U7820> \xE1\xE7 |0 # CJK UNIFIED IDEOGRAPH <U7821> \xFB\x78 |0 # CJK UNIFIED IDEOGRAPH +<U7821> \xEE\x5C |3 # CJK UNIFIED IDEOGRAPH <U7825> \x93\x75 |0 # CJK UNIFIED IDEOGRAPH <U7826> \x8D\xD4 |0 # CJK UNIFIED IDEOGRAPH <U7827> \x8B\x6D |0 # CJK UNIFIED IDEOGRAPH @@ -4407,14 +4646,17 @@ CHARMAP <U783F> \x8D\x7B |0 # CJK UNIFIED IDEOGRAPH <U7845> \xE1\xE9 |0 # CJK UNIFIED IDEOGRAPH <U784E> \xFB\x79 |0 # CJK UNIFIED IDEOGRAPH +<U784E> \xEE\x5D |3 # CJK UNIFIED IDEOGRAPH <U785D> \x8F\xC9 |0 # CJK UNIFIED IDEOGRAPH <U7864> \xFB\x7A |0 # CJK UNIFIED IDEOGRAPH +<U7864> \xEE\x5E |3 # CJK UNIFIED IDEOGRAPH <U786B> \x97\xB0 |0 # CJK UNIFIED IDEOGRAPH <U786C> \x8D\x64 |0 # CJK UNIFIED IDEOGRAPH <U786F> \x8C\xA5 |0 # CJK UNIFIED IDEOGRAPH <U7872> \x94\xA1 |0 # CJK UNIFIED IDEOGRAPH <U7874> \xE1\xEB |0 # CJK UNIFIED IDEOGRAPH <U787A> \xFB\x7B |0 # CJK UNIFIED IDEOGRAPH +<U787A> \xEE\x5F |3 # CJK UNIFIED IDEOGRAPH <U787C> \xE1\xED |0 # CJK UNIFIED IDEOGRAPH <U7881> \x8C\xE9 |0 # CJK UNIFIED IDEOGRAPH <U7886> \xE1\xEC |0 # CJK UNIFIED IDEOGRAPH @@ -4462,6 +4704,7 @@ CHARMAP <U792B> \xE2\x49 |0 # CJK UNIFIED IDEOGRAPH <U792C> \xE2\x48 |0 # CJK UNIFIED IDEOGRAPH <U7930> \xFB\x7C |0 # CJK UNIFIED IDEOGRAPH +<U7930> \xEE\x60 |3 # CJK UNIFIED IDEOGRAPH <U793A> \x8E\xA6 |0 # CJK UNIFIED IDEOGRAPH <U793C> \x97\xE7 |0 # CJK UNIFIED IDEOGRAPH <U793E> \x8E\xD0 |0 # CJK UNIFIED IDEOGRAPH @@ -4496,7 +4739,9 @@ CHARMAP <U798E> \x92\xF5 |0 # CJK UNIFIED IDEOGRAPH <U798F> \x95\x9F |0 # CJK UNIFIED IDEOGRAPH <U7994> \xFB\x81 |0 # CJK UNIFIED IDEOGRAPH +<U7994> \xEE\x64 |3 # CJK UNIFIED IDEOGRAPH <U799B> \xFB\x83 |0 # CJK UNIFIED IDEOGRAPH +<U799B> \xEE\x66 |3 # CJK UNIFIED IDEOGRAPH <U799D> \xE2\x54 |0 # CJK UNIFIED IDEOGRAPH <U79A6> \x8B\x9A |0 # CJK UNIFIED IDEOGRAPH <U79A7> \xE2\x55 |0 # CJK UNIFIED IDEOGRAPH @@ -4600,6 +4845,7 @@ CHARMAP <U7ACD> \xE2\x87 |0 # CJK UNIFIED IDEOGRAPH <U7ACF> \xE2\x88 |0 # CJK UNIFIED IDEOGRAPH <U7AD1> \xFB\x84 |0 # CJK UNIFIED IDEOGRAPH +<U7AD1> \xEE\x67 |3 # CJK UNIFIED IDEOGRAPH <U7AD2> \x9A\xF2 |0 # CJK UNIFIED IDEOGRAPH <U7AD3> \xE2\x8A |0 # CJK UNIFIED IDEOGRAPH <U7AD5> \xE2\x89 |0 # CJK UNIFIED IDEOGRAPH @@ -4615,8 +4861,10 @@ CHARMAP <U7AE5> \x93\xB6 |0 # CJK UNIFIED IDEOGRAPH <U7AE6> \xE2\x90 |0 # CJK UNIFIED IDEOGRAPH <U7AE7> \xFB\x85 |0 # CJK UNIFIED IDEOGRAPH +<U7AE7> \xEE\x68 |3 # CJK UNIFIED IDEOGRAPH <U7AEA> \x92\x47 |0 # CJK UNIFIED IDEOGRAPH <U7AEB> \xFB\x87 |0 # CJK UNIFIED IDEOGRAPH +<U7AEB> \xEE\x6A |3 # CJK UNIFIED IDEOGRAPH <U7AED> \xE2\x91 |0 # CJK UNIFIED IDEOGRAPH <U7AEF> \x92\x5B |0 # CJK UNIFIED IDEOGRAPH <U7AF0> \xE2\x92 |0 # CJK UNIFIED IDEOGRAPH @@ -4684,6 +4932,7 @@ CHARMAP <U7B9C> \xE2\xB1 |0 # CJK UNIFIED IDEOGRAPH <U7B9D> \xE2\xAD |0 # CJK UNIFIED IDEOGRAPH <U7B9E> \xFB\x88 |0 # CJK UNIFIED IDEOGRAPH +<U7B9E> \xEE\x6B |3 # CJK UNIFIED IDEOGRAPH <U7B9F> \xE2\xAF |0 # CJK UNIFIED IDEOGRAPH <U7BA1> \x8A\xC7 |0 # CJK UNIFIED IDEOGRAPH <U7BAA> \x92\x5C |0 # CJK UNIFIED IDEOGRAPH @@ -4833,6 +5082,7 @@ CHARMAP <U7D45> \xE3\x44 |0 # CJK UNIFIED IDEOGRAPH <U7D46> \xE3\x4A |0 # CJK UNIFIED IDEOGRAPH <U7D48> \xFB\x8A |0 # CJK UNIFIED IDEOGRAPH +<U7D48> \xEE\x6D |3 # CJK UNIFIED IDEOGRAPH <U7D4B> \xE3\x45 |0 # CJK UNIFIED IDEOGRAPH <U7D4C> \x8C\x6F |0 # CJK UNIFIED IDEOGRAPH <U7D4E> \xE3\x4D |0 # CJK UNIFIED IDEOGRAPH @@ -4841,6 +5091,7 @@ CHARMAP <U7D56> \xE3\x4C |0 # CJK UNIFIED IDEOGRAPH <U7D5B> \xE3\x55 |0 # CJK UNIFIED IDEOGRAPH <U7D5C> \xFB\x8B |0 # CJK UNIFIED IDEOGRAPH +<U7D5C> \xEE\x6E |3 # CJK UNIFIED IDEOGRAPH <U7D5E> \x8D\x69 |0 # CJK UNIFIED IDEOGRAPH <U7D61> \x97\x8D |0 # CJK UNIFIED IDEOGRAPH <U7D62> \x88\xBA |0 # CJK UNIFIED IDEOGRAPH @@ -4864,6 +5115,7 @@ CHARMAP <U7D9C> \x91\x8E |0 # CJK UNIFIED IDEOGRAPH <U7D9F> \xE3\x65 |0 # CJK UNIFIED IDEOGRAPH <U7DA0> \xFB\x8D |0 # CJK UNIFIED IDEOGRAPH +<U7DA0> \xEE\x70 |3 # CJK UNIFIED IDEOGRAPH <U7DA2> \xE3\x61 |0 # CJK UNIFIED IDEOGRAPH <U7DA3> \xE3\x5B |0 # CJK UNIFIED IDEOGRAPH <U7DAB> \xE3\x5F |0 # CJK UNIFIED IDEOGRAPH @@ -4877,6 +5129,7 @@ CHARMAP <U7DB4> \x92\xD4 |0 # CJK UNIFIED IDEOGRAPH <U7DB5> \xE3\x5C |0 # CJK UNIFIED IDEOGRAPH <U7DB7> \xFB\x8C |0 # CJK UNIFIED IDEOGRAPH +<U7DB7> \xEE\x6F |3 # CJK UNIFIED IDEOGRAPH <U7DB8> \xE3\x64 |0 # CJK UNIFIED IDEOGRAPH <U7DBA> \xE3\x59 |0 # CJK UNIFIED IDEOGRAPH <U7DBB> \x92\x5D |0 # CJK UNIFIED IDEOGRAPH @@ -4891,6 +5144,7 @@ CHARMAP <U7DD2> \x8F\x8F |0 # CJK UNIFIED IDEOGRAPH <U7DD5> \xE3\x8E |0 # CJK UNIFIED IDEOGRAPH <U7DD6> \xFB\x8E |0 # CJK UNIFIED IDEOGRAPH +<U7DD6> \xEE\x71 |3 # CJK UNIFIED IDEOGRAPH <U7DD8> \xE3\x67 |0 # CJK UNIFIED IDEOGRAPH <U7DDA> \x90\xFC |0 # CJK UNIFIED IDEOGRAPH <U7DDC> \xE3\x63 |0 # CJK UNIFIED IDEOGRAPH @@ -4938,6 +5192,7 @@ CHARMAP <U7E4B> \x8C\x71 |0 # CJK UNIFIED IDEOGRAPH <U7E4D> \x8F\x4A |0 # CJK UNIFIED IDEOGRAPH <U7E52> \xFB\x8F |0 # CJK UNIFIED IDEOGRAPH +<U7E52> \xEE\x72 |3 # CJK UNIFIED IDEOGRAPH <U7E54> \x90\x44 |0 # CJK UNIFIED IDEOGRAPH <U7E55> \x91\x55 |0 # CJK UNIFIED IDEOGRAPH <U7E56> \xE3\x84 |0 # CJK UNIFIED IDEOGRAPH @@ -4961,6 +5216,7 @@ CHARMAP <U7E88> \xE3\x92 |0 # CJK UNIFIED IDEOGRAPH <U7E89> \xE3\x93 |0 # CJK UNIFIED IDEOGRAPH <U7E8A> \xFA\x5C |0 # CJK UNIFIED IDEOGRAPH +<U7E8A> \xED\x40 |3 # CJK UNIFIED IDEOGRAPH <U7E8C> \xE3\x94 |0 # CJK UNIFIED IDEOGRAPH <U7E8E> \xE3\x9A |0 # CJK UNIFIED IDEOGRAPH <U7E8F> \x93\x5A |0 # CJK UNIFIED IDEOGRAPH @@ -4976,6 +5232,7 @@ CHARMAP <U7F3A> \xE3\x9E |0 # CJK UNIFIED IDEOGRAPH <U7F45> \xE3\x9F |0 # CJK UNIFIED IDEOGRAPH <U7F47> \xFB\x90 |0 # CJK UNIFIED IDEOGRAPH +<U7F47> \xEE\x73 |3 # CJK UNIFIED IDEOGRAPH <U7F4C> \xE3\xA0 |0 # CJK UNIFIED IDEOGRAPH <U7F4D> \xE3\xA1 |0 # CJK UNIFIED IDEOGRAPH <U7F4E> \xE3\xA2 |0 # CJK UNIFIED IDEOGRAPH @@ -5012,6 +5269,7 @@ CHARMAP <U7F9D> \xE3\xB6 |0 # CJK UNIFIED IDEOGRAPH <U7F9E> \xE3\xB5 |0 # CJK UNIFIED IDEOGRAPH <U7FA1> \xFB\x91 |0 # CJK UNIFIED IDEOGRAPH +<U7FA1> \xEE\x74 |3 # CJK UNIFIED IDEOGRAPH <U7FA3> \xE3\xB8 |0 # CJK UNIFIED IDEOGRAPH <U7FA4> \x8C\x51 |0 # CJK UNIFIED IDEOGRAPH <U7FA8> \x91\x41 |0 # CJK UNIFIED IDEOGRAPH @@ -5308,6 +5566,7 @@ CHARMAP <U82FA> \xE4\x95 |0 # CJK UNIFIED IDEOGRAPH <U82FB> \xE4\x98 |0 # CJK UNIFIED IDEOGRAPH <U8301> \xFB\x93 |0 # CJK UNIFIED IDEOGRAPH +<U8301> \xEE\x76 |3 # CJK UNIFIED IDEOGRAPH <U8302> \x96\xCE |0 # CJK UNIFIED IDEOGRAPH <U8303> \xE4\x97 |0 # CJK UNIFIED IDEOGRAPH <U8304> \x89\xD6 |0 # CJK UNIFIED IDEOGRAPH @@ -5339,12 +5598,14 @@ CHARMAP <U8352> \x8D\x72 |0 # CJK UNIFIED IDEOGRAPH <U8358> \x91\x91 |0 # CJK UNIFIED IDEOGRAPH <U8362> \xFB\x94 |0 # CJK UNIFIED IDEOGRAPH +<U8362> \xEE\x77 |3 # CJK UNIFIED IDEOGRAPH <U8373> \xE4\xB8 |0 # CJK UNIFIED IDEOGRAPH <U8375> \xE4\xB9 |0 # CJK UNIFIED IDEOGRAPH <U8377> \x89\xD7 |0 # CJK UNIFIED IDEOGRAPH <U837B> \x89\xAC |0 # CJK UNIFIED IDEOGRAPH <U837C> \xE4\xB6 |0 # CJK UNIFIED IDEOGRAPH <U837F> \xFB\x95 |0 # CJK UNIFIED IDEOGRAPH +<U837F> \xEE\x78 |3 # CJK UNIFIED IDEOGRAPH <U8385> \xE4\xAC |0 # CJK UNIFIED IDEOGRAPH <U8387> \xE4\xB4 |0 # CJK UNIFIED IDEOGRAPH <U8389> \xE4\xBB |0 # CJK UNIFIED IDEOGRAPH @@ -5366,6 +5627,7 @@ CHARMAP <U83C1> \xE4\xC5 |0 # CJK UNIFIED IDEOGRAPH <U83C5> \x90\x9B |0 # CJK UNIFIED IDEOGRAPH <U83C7> \xFB\x96 |0 # CJK UNIFIED IDEOGRAPH +<U83C7> \xEE\x79 |3 # CJK UNIFIED IDEOGRAPH <U83CA> \x8B\x65 |0 # CJK UNIFIED IDEOGRAPH <U83CC> \x8B\xDB |0 # CJK UNIFIED IDEOGRAPH <U83CE> \xE4\xC0 |0 # CJK UNIFIED IDEOGRAPH @@ -5383,6 +5645,7 @@ CHARMAP <U83F2> \xE4\xC9 |0 # CJK UNIFIED IDEOGRAPH <U83F4> \xE4\xBD |0 # CJK UNIFIED IDEOGRAPH <U83F6> \xFB\x97 |0 # CJK UNIFIED IDEOGRAPH +<U83F6> \xEE\x7A |3 # CJK UNIFIED IDEOGRAPH <U83F7> \xE4\xC6 |0 # CJK UNIFIED IDEOGRAPH <U83FB> \xE4\xD0 |0 # CJK UNIFIED IDEOGRAPH <U83FD> \xE4\xC1 |0 # CJK UNIFIED IDEOGRAPH @@ -5406,6 +5669,7 @@ CHARMAP <U843D> \x97\x8E |0 # CJK UNIFIED IDEOGRAPH <U8446> \xE4\xDC |0 # CJK UNIFIED IDEOGRAPH <U8448> \xFB\x98 |0 # CJK UNIFIED IDEOGRAPH +<U8448> \xEE\x7B |3 # CJK UNIFIED IDEOGRAPH <U8449> \x97\x74 |0 # CJK UNIFIED IDEOGRAPH <U844E> \x97\xA8 |0 # CJK UNIFIED IDEOGRAPH <U8457> \x92\x98 |0 # CJK UNIFIED IDEOGRAPH @@ -5437,6 +5701,7 @@ CHARMAP <U84AD> \xE4\xD8 |0 # CJK UNIFIED IDEOGRAPH <U84B2> \x8A\x97 |0 # CJK UNIFIED IDEOGRAPH <U84B4> \xFB\x99 |0 # CJK UNIFIED IDEOGRAPH +<U84B4> \xEE\x7C |3 # CJK UNIFIED IDEOGRAPH <U84B8> \x8F\xF6 |0 # CJK UNIFIED IDEOGRAPH <U84B9> \xE4\xE3 |0 # CJK UNIFIED IDEOGRAPH <U84BB> \xE4\xE8 |0 # CJK UNIFIED IDEOGRAPH @@ -5455,6 +5720,7 @@ CHARMAP <U84D9> \xE4\xE6 |0 # CJK UNIFIED IDEOGRAPH <U84DA> \xE4\xE9 |0 # CJK UNIFIED IDEOGRAPH <U84DC> \xFA\x60 |0 # CJK UNIFIED IDEOGRAPH +<U84DC> \xED\x44 |3 # CJK UNIFIED IDEOGRAPH <U84EC> \x96\x48 |0 # CJK UNIFIED IDEOGRAPH <U84EE> \x98\x40 |0 # CJK UNIFIED IDEOGRAPH <U84F4> \xE4\xF1 |0 # CJK UNIFIED IDEOGRAPH @@ -5485,16 +5751,19 @@ CHARMAP <U854B> \xE5\x42 |0 # CJK UNIFIED IDEOGRAPH <U854E> \x8B\xBC |0 # CJK UNIFIED IDEOGRAPH <U8553> \xFB\x9A |0 # CJK UNIFIED IDEOGRAPH +<U8553> \xEE\x7D |3 # CJK UNIFIED IDEOGRAPH <U8555> \xE5\x43 |0 # CJK UNIFIED IDEOGRAPH <U8557> \x95\x99 |0 # CJK UNIFIED IDEOGRAPH <U8558> \xE4\xFB |0 # CJK UNIFIED IDEOGRAPH <U8559> \xFB\x9B |0 # CJK UNIFIED IDEOGRAPH +<U8559> \xEE\x7E |3 # CJK UNIFIED IDEOGRAPH <U855A> \xE4\xD4 |0 # CJK UNIFIED IDEOGRAPH <U8563> \xE4\xFA |0 # CJK UNIFIED IDEOGRAPH <U8568> \x98\x6E |0 # CJK UNIFIED IDEOGRAPH <U8569> \x93\xA0 |0 # CJK UNIFIED IDEOGRAPH <U856A> \x95\x93 |0 # CJK UNIFIED IDEOGRAPH <U856B> \xFB\x9C |0 # CJK UNIFIED IDEOGRAPH +<U856B> \xEE\x80 |3 # CJK UNIFIED IDEOGRAPH <U856D> \xE5\x4A |0 # CJK UNIFIED IDEOGRAPH <U8577> \xE5\x50 |0 # CJK UNIFIED IDEOGRAPH <U857E> \xE5\x51 |0 # CJK UNIFIED IDEOGRAPH @@ -5520,6 +5789,7 @@ CHARMAP <U85AE> \x96\xF7 |0 # CJK UNIFIED IDEOGRAPH <U85AF> \x8F\x92 |0 # CJK UNIFIED IDEOGRAPH <U85B0> \xFB\x9E |0 # CJK UNIFIED IDEOGRAPH +<U85B0> \xEE\x82 |3 # CJK UNIFIED IDEOGRAPH <U85B9> \xE5\x56 |0 # CJK UNIFIED IDEOGRAPH <U85BA> \xE5\x54 |0 # CJK UNIFIED IDEOGRAPH <U85C1> \x98\x6D |0 # CJK UNIFIED IDEOGRAPH @@ -5667,6 +5937,7 @@ CHARMAP <U87FE> \xE5\xB7 |0 # CJK UNIFIED IDEOGRAPH <U8805> \xE5\xA2 |0 # CJK UNIFIED IDEOGRAPH <U8807> \xFB\xA1 |0 # CJK UNIFIED IDEOGRAPH +<U8807> \xEE\x85 |3 # CJK UNIFIED IDEOGRAPH <U880D> \xE5\xB6 |0 # CJK UNIFIED IDEOGRAPH <U880E> \xE5\xBA |0 # CJK UNIFIED IDEOGRAPH <U880F> \xE5\xB5 |0 # CJK UNIFIED IDEOGRAPH @@ -5745,6 +6016,7 @@ CHARMAP <U88F3> \x8F\xD6 |0 # CJK UNIFIED IDEOGRAPH <U88F4> \xE5\xE8 |0 # CJK UNIFIED IDEOGRAPH <U88F5> \xFB\xA2 |0 # CJK UNIFIED IDEOGRAPH +<U88F5> \xEE\x86 |3 # CJK UNIFIED IDEOGRAPH <U88F8> \x97\x87 |0 # CJK UNIFIED IDEOGRAPH <U88F9> \xE5\xE5 |0 # CJK UNIFIED IDEOGRAPH <U88FC> \xE5\xE7 |0 # CJK UNIFIED IDEOGRAPH @@ -5759,6 +6031,7 @@ CHARMAP <U8912> \x96\x4A |0 # CJK UNIFIED IDEOGRAPH <U8913> \xE5\xEE |0 # CJK UNIFIED IDEOGRAPH <U891C> \xFA\x5D |0 # CJK UNIFIED IDEOGRAPH +<U891C> \xED\x41 |3 # CJK UNIFIED IDEOGRAPH <U891D> \xE5\xFA |0 # CJK UNIFIED IDEOGRAPH <U891E> \xE5\xF0 |0 # CJK UNIFIED IDEOGRAPH <U8925> \xE5\xF1 |0 # CJK UNIFIED IDEOGRAPH @@ -5830,6 +6103,7 @@ CHARMAP <U8A0E> \x93\xA2 |0 # CJK UNIFIED IDEOGRAPH <U8A10> \xE6\x5F |0 # CJK UNIFIED IDEOGRAPH <U8A12> \xFB\xA3 |0 # CJK UNIFIED IDEOGRAPH +<U8A12> \xEE\x87 |3 # CJK UNIFIED IDEOGRAPH <U8A13> \x8C\x50 |0 # CJK UNIFIED IDEOGRAPH <U8A16> \xE6\x5E |0 # CJK UNIFIED IDEOGRAPH <U8A17> \x91\xF5 |0 # CJK UNIFIED IDEOGRAPH @@ -5846,6 +6120,7 @@ CHARMAP <U8A34> \x91\x69 |0 # CJK UNIFIED IDEOGRAPH <U8A36> \xE6\x64 |0 # CJK UNIFIED IDEOGRAPH <U8A37> \xFB\xA4 |0 # CJK UNIFIED IDEOGRAPH +<U8A37> \xEE\x88 |3 # CJK UNIFIED IDEOGRAPH <U8A3A> \x90\x66 |0 # CJK UNIFIED IDEOGRAPH <U8A3B> \x92\x90 |0 # CJK UNIFIED IDEOGRAPH <U8A3C> \x8F\xD8 |0 # CJK UNIFIED IDEOGRAPH @@ -5873,6 +6148,7 @@ CHARMAP <U8A72> \x8A\x59 |0 # CJK UNIFIED IDEOGRAPH <U8A73> \x8F\xDA |0 # CJK UNIFIED IDEOGRAPH <U8A79> \xFB\xA5 |0 # CJK UNIFIED IDEOGRAPH +<U8A79> \xEE\x89 |3 # CJK UNIFIED IDEOGRAPH <U8A7C> \xE6\x6A |0 # CJK UNIFIED IDEOGRAPH <U8A82> \xE6\x6F |0 # CJK UNIFIED IDEOGRAPH <U8A84> \xE6\x70 |0 # CJK UNIFIED IDEOGRAPH @@ -5894,6 +6170,7 @@ CHARMAP <U8AA5> \xE6\x74 |0 # CJK UNIFIED IDEOGRAPH <U8AA6> \xE6\x75 |0 # CJK UNIFIED IDEOGRAPH <U8AA7> \xFB\xA6 |0 # CJK UNIFIED IDEOGRAPH +<U8AA7> \xEE\x8A |3 # CJK UNIFIED IDEOGRAPH <U8AA8> \xE6\x71 |0 # CJK UNIFIED IDEOGRAPH <U8AAC> \x90\xE0 |0 # CJK UNIFIED IDEOGRAPH <U8AAD> \x93\xC7 |0 # CJK UNIFIED IDEOGRAPH @@ -5902,6 +6179,7 @@ CHARMAP <U8AB9> \x94\xEE |0 # CJK UNIFIED IDEOGRAPH <U8ABC> \x8B\x62 |0 # CJK UNIFIED IDEOGRAPH <U8ABE> \xFB\xA7 |0 # CJK UNIFIED IDEOGRAPH +<U8ABE> \xEE\x8B |3 # CJK UNIFIED IDEOGRAPH <U8ABF> \x92\xB2 |0 # CJK UNIFIED IDEOGRAPH <U8AC2> \xE6\x7A |0 # CJK UNIFIED IDEOGRAPH <U8AC4> \xE6\x78 |0 # CJK UNIFIED IDEOGRAPH @@ -5917,6 +6195,7 @@ CHARMAP <U8ADC> \x92\xB3 |0 # CJK UNIFIED IDEOGRAPH <U8ADE> \xE6\x86 |0 # CJK UNIFIED IDEOGRAPH <U8ADF> \xFB\xA8 |0 # CJK UNIFIED IDEOGRAPH +<U8ADF> \xEE\x8C |3 # CJK UNIFIED IDEOGRAPH <U8AE0> \xE6\x83 |0 # CJK UNIFIED IDEOGRAPH <U8AE1> \xE6\x8B |0 # CJK UNIFIED IDEOGRAPH <U8AE2> \xE6\x84 |0 # CJK UNIFIED IDEOGRAPH @@ -5929,6 +6208,7 @@ CHARMAP <U8AF1> \xE6\x81 |0 # CJK UNIFIED IDEOGRAPH <U8AF3> \xE6\x7D |0 # CJK UNIFIED IDEOGRAPH <U8AF6> \xFB\xAA |0 # CJK UNIFIED IDEOGRAPH +<U8AF6> \xEE\x8E |3 # CJK UNIFIED IDEOGRAPH <U8AF7> \xE6\x85 |0 # CJK UNIFIED IDEOGRAPH <U8AF8> \x8F\x94 |0 # CJK UNIFIED IDEOGRAPH <U8AFA> \x8C\xBF |0 # CJK UNIFIED IDEOGRAPH @@ -5963,6 +6243,7 @@ CHARMAP <U8B4E> \xE6\x99 |0 # CJK UNIFIED IDEOGRAPH <U8B4F> \xE6\x98 |0 # CJK UNIFIED IDEOGRAPH <U8B53> \xFB\xAB |0 # CJK UNIFIED IDEOGRAPH +<U8B53> \xEE\x8F |3 # CJK UNIFIED IDEOGRAPH <U8B56> \xE6\x9B |0 # CJK UNIFIED IDEOGRAPH <U8B58> \x8E\xAF |0 # CJK UNIFIED IDEOGRAPH <U8B5A> \xE6\x9D |0 # CJK UNIFIED IDEOGRAPH @@ -5980,6 +6261,7 @@ CHARMAP <U8B77> \x8C\xEC |0 # CJK UNIFIED IDEOGRAPH <U8B7D> \xE6\xA3 |0 # CJK UNIFIED IDEOGRAPH <U8B7F> \xFB\xAC |0 # CJK UNIFIED IDEOGRAPH +<U8B7F> \xEE\x90 |3 # CJK UNIFIED IDEOGRAPH <U8B80> \xE6\xA4 |0 # CJK UNIFIED IDEOGRAPH <U8B83> \x8E\x5D |0 # CJK UNIFIED IDEOGRAPH <U8B8A> \x9D\xCC |0 # CJK UNIFIED IDEOGRAPH @@ -6070,7 +6352,9 @@ CHARMAP <U8CEA> \x8E\xBF |0 # CJK UNIFIED IDEOGRAPH <U8CED> \x93\x71 |0 # CJK UNIFIED IDEOGRAPH <U8CF0> \xFB\xAD |0 # CJK UNIFIED IDEOGRAPH +<U8CF0> \xEE\x91 |3 # CJK UNIFIED IDEOGRAPH <U8CF4> \xFB\xAE |0 # CJK UNIFIED IDEOGRAPH +<U8CF4> \xEE\x92 |3 # CJK UNIFIED IDEOGRAPH <U8CFA> \xE6\xCF |0 # CJK UNIFIED IDEOGRAPH <U8CFB> \xE6\xD0 |0 # CJK UNIFIED IDEOGRAPH <U8CFC> \x8D\x77 |0 # CJK UNIFIED IDEOGRAPH @@ -6085,6 +6369,7 @@ CHARMAP <U8D0F> \xE6\xD5 |0 # CJK UNIFIED IDEOGRAPH <U8D10> \xE6\xD7 |0 # CJK UNIFIED IDEOGRAPH <U8D12> \xFB\xAF |0 # CJK UNIFIED IDEOGRAPH +<U8D12> \xEE\x93 |3 # CJK UNIFIED IDEOGRAPH <U8D13> \xE6\xD9 |0 # CJK UNIFIED IDEOGRAPH <U8D14> \xE6\xDB |0 # CJK UNIFIED IDEOGRAPH <U8D16> \xE6\xDC |0 # CJK UNIFIED IDEOGRAPH @@ -6098,6 +6383,7 @@ CHARMAP <U8D73> \xE6\xE0 |0 # CJK UNIFIED IDEOGRAPH <U8D74> \x95\x8B |0 # CJK UNIFIED IDEOGRAPH <U8D76> \xFB\xB0 |0 # CJK UNIFIED IDEOGRAPH +<U8D76> \xEE\x94 |3 # CJK UNIFIED IDEOGRAPH <U8D77> \x8B\x4E |0 # CJK UNIFIED IDEOGRAPH <U8D81> \xE6\xE1 |0 # CJK UNIFIED IDEOGRAPH <U8D85> \x92\xB4 |0 # CJK UNIFIED IDEOGRAPH @@ -6184,6 +6470,7 @@ CHARMAP <U8ECC> \x8B\x4F |0 # CJK UNIFIED IDEOGRAPH <U8ECD> \x8C\x52 |0 # CJK UNIFIED IDEOGRAPH <U8ECF> \xFB\xB2 |0 # CJK UNIFIED IDEOGRAPH +<U8ECF> \xEE\x96 |3 # CJK UNIFIED IDEOGRAPH <U8ED2> \x8C\xAC |0 # CJK UNIFIED IDEOGRAPH <U8EDB> \xE7\x62 |0 # CJK UNIFIED IDEOGRAPH <U8EDF> \x93\xEE |0 # CJK UNIFIED IDEOGRAPH @@ -6335,6 +6622,7 @@ CHARMAP <U9063> \x8C\xAD |0 # CJK UNIFIED IDEOGRAPH <U9065> \x97\x79 |0 # CJK UNIFIED IDEOGRAPH <U9067> \xFB\xB5 |0 # CJK UNIFIED IDEOGRAPH +<U9067> \xEE\x99 |3 # CJK UNIFIED IDEOGRAPH <U9068> \xE7\xA9 |0 # CJK UNIFIED IDEOGRAPH <U9069> \x93\x4B |0 # CJK UNIFIED IDEOGRAPH <U906D> \x91\x98 |0 # CJK UNIFIED IDEOGRAPH @@ -6372,6 +6660,7 @@ CHARMAP <U90CE> \x98\x59 |0 # CJK UNIFIED IDEOGRAPH <U90DB> \xE7\xBC |0 # CJK UNIFIED IDEOGRAPH <U90DE> \xFB\xB6 |0 # CJK UNIFIED IDEOGRAPH +<U90DE> \xEE\x9A |3 # CJK UNIFIED IDEOGRAPH <U90E1> \x8C\x53 |0 # CJK UNIFIED IDEOGRAPH <U90E2> \xE7\xB9 |0 # CJK UNIFIED IDEOGRAPH <U90E4> \xE7\xBA |0 # CJK UNIFIED IDEOGRAPH @@ -6383,8 +6672,10 @@ CHARMAP <U9102> \xE7\xBD |0 # CJK UNIFIED IDEOGRAPH <U9112> \xE7\xBE |0 # CJK UNIFIED IDEOGRAPH <U9115> \xFB\xB8 |0 # CJK UNIFIED IDEOGRAPH +<U9115> \xEE\x9C |3 # CJK UNIFIED IDEOGRAPH <U9119> \xE7\xBF |0 # CJK UNIFIED IDEOGRAPH <U9127> \xFB\xB9 |0 # CJK UNIFIED IDEOGRAPH +<U9127> \xEE\x9D |3 # CJK UNIFIED IDEOGRAPH <U912D> \x93\x41 |0 # CJK UNIFIED IDEOGRAPH <U9130> \xE7\xC1 |0 # CJK UNIFIED IDEOGRAPH <U9132> \xE7\xC0 |0 # CJK UNIFIED IDEOGRAPH @@ -6442,30 +6733,40 @@ CHARMAP <U91D1> \x8B\xE0 |0 # CJK UNIFIED IDEOGRAPH <U91D6> \xE7\xD9 |0 # CJK UNIFIED IDEOGRAPH <U91D7> \xFB\xBB |0 # CJK UNIFIED IDEOGRAPH +<U91D7> \xEE\x9F |3 # CJK UNIFIED IDEOGRAPH <U91D8> \x93\x42 |0 # CJK UNIFIED IDEOGRAPH <U91DA> \xFB\xBA |0 # CJK UNIFIED IDEOGRAPH +<U91DA> \xEE\x9E |3 # CJK UNIFIED IDEOGRAPH <U91DB> \xE7\xDC |0 # CJK UNIFIED IDEOGRAPH <U91DC> \x8A\x98 |0 # CJK UNIFIED IDEOGRAPH <U91DD> \x90\x6A |0 # CJK UNIFIED IDEOGRAPH <U91DE> \xFB\xBC |0 # CJK UNIFIED IDEOGRAPH +<U91DE> \xEE\xA0 |3 # CJK UNIFIED IDEOGRAPH <U91DF> \xE7\xDA |0 # CJK UNIFIED IDEOGRAPH <U91E1> \xE7\xDB |0 # CJK UNIFIED IDEOGRAPH <U91E3> \x92\xDE |0 # CJK UNIFIED IDEOGRAPH <U91E4> \xFB\xBF |0 # CJK UNIFIED IDEOGRAPH +<U91E4> \xEE\xA3 |3 # CJK UNIFIED IDEOGRAPH <U91E5> \xFB\xC0 |0 # CJK UNIFIED IDEOGRAPH +<U91E5> \xEE\xA4 |3 # CJK UNIFIED IDEOGRAPH <U91E6> \x96\x74 |0 # CJK UNIFIED IDEOGRAPH <U91E7> \x8B\xFA |0 # CJK UNIFIED IDEOGRAPH <U91ED> \xFB\xBD |0 # CJK UNIFIED IDEOGRAPH +<U91ED> \xEE\xA1 |3 # CJK UNIFIED IDEOGRAPH <U91EE> \xFB\xBE |0 # CJK UNIFIED IDEOGRAPH +<U91EE> \xEE\xA2 |3 # CJK UNIFIED IDEOGRAPH <U91F5> \xE7\xDE |0 # CJK UNIFIED IDEOGRAPH <U91F6> \xE7\xDF |0 # CJK UNIFIED IDEOGRAPH <U91FC> \xE7\xDD |0 # CJK UNIFIED IDEOGRAPH <U91FF> \xE7\xE1 |0 # CJK UNIFIED IDEOGRAPH <U9206> \xFB\xC1 |0 # CJK UNIFIED IDEOGRAPH +<U9206> \xEE\xA5 |3 # CJK UNIFIED IDEOGRAPH <U920A> \xFB\xC3 |0 # CJK UNIFIED IDEOGRAPH +<U920A> \xEE\xA7 |3 # CJK UNIFIED IDEOGRAPH <U920D> \x93\xDD |0 # CJK UNIFIED IDEOGRAPH <U920E> \x8A\x62 |0 # CJK UNIFIED IDEOGRAPH <U9210> \xFB\xC2 |0 # CJK UNIFIED IDEOGRAPH +<U9210> \xEE\xA6 |3 # CJK UNIFIED IDEOGRAPH <U9211> \xE7\xE5 |0 # CJK UNIFIED IDEOGRAPH <U9214> \xE7\xE2 |0 # CJK UNIFIED IDEOGRAPH <U9215> \xE7\xE4 |0 # CJK UNIFIED IDEOGRAPH @@ -6475,20 +6776,27 @@ CHARMAP <U9234> \x97\xE9 |0 # CJK UNIFIED IDEOGRAPH <U9237> \x8C\xD8 |0 # CJK UNIFIED IDEOGRAPH <U9239> \xFB\xCA |0 # CJK UNIFIED IDEOGRAPH +<U9239> \xEE\xAE |3 # CJK UNIFIED IDEOGRAPH <U923A> \xFB\xC4 |0 # CJK UNIFIED IDEOGRAPH +<U923A> \xEE\xA8 |3 # CJK UNIFIED IDEOGRAPH <U923C> \xFB\xC6 |0 # CJK UNIFIED IDEOGRAPH +<U923C> \xEE\xAA |3 # CJK UNIFIED IDEOGRAPH <U923F> \xE7\xED |0 # CJK UNIFIED IDEOGRAPH <U9240> \xFB\xC5 |0 # CJK UNIFIED IDEOGRAPH +<U9240> \xEE\xA9 |3 # CJK UNIFIED IDEOGRAPH <U9244> \x93\x53 |0 # CJK UNIFIED IDEOGRAPH <U9245> \xE7\xE8 |0 # CJK UNIFIED IDEOGRAPH <U9248> \xE7\xEB |0 # CJK UNIFIED IDEOGRAPH <U9249> \xE7\xE9 |0 # CJK UNIFIED IDEOGRAPH <U924B> \xE7\xEE |0 # CJK UNIFIED IDEOGRAPH <U924E> \xFB\xC7 |0 # CJK UNIFIED IDEOGRAPH +<U924E> \xEE\xAB |3 # CJK UNIFIED IDEOGRAPH <U9250> \xE7\xEF |0 # CJK UNIFIED IDEOGRAPH <U9251> \xFB\xC9 |0 # CJK UNIFIED IDEOGRAPH +<U9251> \xEE\xAD |3 # CJK UNIFIED IDEOGRAPH <U9257> \xE7\xE7 |0 # CJK UNIFIED IDEOGRAPH <U9259> \xFB\xC8 |0 # CJK UNIFIED IDEOGRAPH +<U9259> \xEE\xAC |3 # CJK UNIFIED IDEOGRAPH <U925A> \xE7\xF4 |0 # CJK UNIFIED IDEOGRAPH <U925B> \x89\x94 |0 # CJK UNIFIED IDEOGRAPH <U925E> \xE7\xE6 |0 # CJK UNIFIED IDEOGRAPH @@ -6496,14 +6804,18 @@ CHARMAP <U9264> \xE7\xEA |0 # CJK UNIFIED IDEOGRAPH <U9266> \x8F\xDE |0 # CJK UNIFIED IDEOGRAPH <U9267> \xFB\xCB |0 # CJK UNIFIED IDEOGRAPH +<U9267> \xEE\xAF |3 # CJK UNIFIED IDEOGRAPH <U9271> \x8D\x7A |0 # CJK UNIFIED IDEOGRAPH <U9277> \xFB\xCD |0 # CJK UNIFIED IDEOGRAPH +<U9277> \xEE\xB1 |3 # CJK UNIFIED IDEOGRAPH <U9278> \xFB\xCE |0 # CJK UNIFIED IDEOGRAPH +<U9278> \xEE\xB2 |3 # CJK UNIFIED IDEOGRAPH <U927E> \x96\x67 |0 # CJK UNIFIED IDEOGRAPH <U9280> \x8B\xE2 |0 # CJK UNIFIED IDEOGRAPH <U9283> \x8F\x65 |0 # CJK UNIFIED IDEOGRAPH <U9285> \x93\xBA |0 # CJK UNIFIED IDEOGRAPH <U9288> \xFA\x5F |0 # CJK UNIFIED IDEOGRAPH +<U9288> \xED\x43 |3 # CJK UNIFIED IDEOGRAPH <U9291> \x91\x4C |0 # CJK UNIFIED IDEOGRAPH <U9293> \xE7\xF2 |0 # CJK UNIFIED IDEOGRAPH <U9295> \xE7\xEC |0 # CJK UNIFIED IDEOGRAPH @@ -6513,19 +6825,27 @@ CHARMAP <U929B> \xE7\xF3 |0 # CJK UNIFIED IDEOGRAPH <U929C> \xE7\xF0 |0 # CJK UNIFIED IDEOGRAPH <U92A7> \xFB\xCC |0 # CJK UNIFIED IDEOGRAPH +<U92A7> \xEE\xB0 |3 # CJK UNIFIED IDEOGRAPH <U92AD> \x91\x4B |0 # CJK UNIFIED IDEOGRAPH <U92B7> \xE7\xF7 |0 # CJK UNIFIED IDEOGRAPH <U92B9> \xE7\xF6 |0 # CJK UNIFIED IDEOGRAPH <U92CF> \xE7\xF5 |0 # CJK UNIFIED IDEOGRAPH <U92D0> \xFB\xD2 |0 # CJK UNIFIED IDEOGRAPH +<U92D0> \xEE\xB6 |3 # CJK UNIFIED IDEOGRAPH <U92D2> \x96\x4E |0 # CJK UNIFIED IDEOGRAPH <U92D3> \xFB\xD6 |0 # CJK UNIFIED IDEOGRAPH +<U92D3> \xEE\xBA |3 # CJK UNIFIED IDEOGRAPH <U92D5> \xFB\xD4 |0 # CJK UNIFIED IDEOGRAPH +<U92D5> \xEE\xB8 |3 # CJK UNIFIED IDEOGRAPH <U92D7> \xFB\xD0 |0 # CJK UNIFIED IDEOGRAPH +<U92D7> \xEE\xB4 |3 # CJK UNIFIED IDEOGRAPH <U92D9> \xFB\xD1 |0 # CJK UNIFIED IDEOGRAPH +<U92D9> \xEE\xB5 |3 # CJK UNIFIED IDEOGRAPH <U92E0> \xFB\xD5 |0 # CJK UNIFIED IDEOGRAPH +<U92E0> \xEE\xB9 |3 # CJK UNIFIED IDEOGRAPH <U92E4> \x8F\x9B |0 # CJK UNIFIED IDEOGRAPH <U92E7> \xFB\xCF |0 # CJK UNIFIED IDEOGRAPH +<U92E7> \xEE\xB3 |3 # CJK UNIFIED IDEOGRAPH <U92E9> \xE7\xF8 |0 # CJK UNIFIED IDEOGRAPH <U92EA> \x95\xDD |0 # CJK UNIFIED IDEOGRAPH <U92ED> \x89\x73 |0 # CJK UNIFIED IDEOGRAPH @@ -6533,11 +6853,15 @@ CHARMAP <U92F3> \x92\x92 |0 # CJK UNIFIED IDEOGRAPH <U92F8> \x8B\x98 |0 # CJK UNIFIED IDEOGRAPH <U92F9> \xFA\x65 |0 # CJK UNIFIED IDEOGRAPH +<U92F9> \xED\x49 |3 # CJK UNIFIED IDEOGRAPH <U92FA> \xE7\xFA |0 # CJK UNIFIED IDEOGRAPH <U92FB> \xFB\xD9 |0 # CJK UNIFIED IDEOGRAPH +<U92FB> \xEE\xBD |3 # CJK UNIFIED IDEOGRAPH <U92FC> \x8D\x7C |0 # CJK UNIFIED IDEOGRAPH <U92FF> \xFB\xDC |0 # CJK UNIFIED IDEOGRAPH +<U92FF> \xEE\xC0 |3 # CJK UNIFIED IDEOGRAPH <U9302> \xFB\xDE |0 # CJK UNIFIED IDEOGRAPH +<U9302> \xEE\xC2 |3 # CJK UNIFIED IDEOGRAPH <U9306> \x8E\x4B |0 # CJK UNIFIED IDEOGRAPH <U930F> \xE7\xF9 |0 # CJK UNIFIED IDEOGRAPH <U9310> \x90\x8D |0 # CJK UNIFIED IDEOGRAPH @@ -6545,12 +6869,16 @@ CHARMAP <U9319> \xE8\x40 |0 # CJK UNIFIED IDEOGRAPH <U931A> \xE8\x42 |0 # CJK UNIFIED IDEOGRAPH <U931D> \xFB\xDD |0 # CJK UNIFIED IDEOGRAPH +<U931D> \xEE\xC1 |3 # CJK UNIFIED IDEOGRAPH <U931E> \xFB\xDB |0 # CJK UNIFIED IDEOGRAPH +<U931E> \xEE\xBF |3 # CJK UNIFIED IDEOGRAPH <U9320> \x8F\xF9 |0 # CJK UNIFIED IDEOGRAPH <U9321> \xFB\xD8 |0 # CJK UNIFIED IDEOGRAPH +<U9321> \xEE\xBC |3 # CJK UNIFIED IDEOGRAPH <U9322> \xE8\x41 |0 # CJK UNIFIED IDEOGRAPH <U9323> \xE8\x43 |0 # CJK UNIFIED IDEOGRAPH <U9325> \xFB\xD7 |0 # CJK UNIFIED IDEOGRAPH +<U9325> \xEE\xBB |3 # CJK UNIFIED IDEOGRAPH <U9326> \x8B\xD1 |0 # CJK UNIFIED IDEOGRAPH <U9328> \x95\x64 |0 # CJK UNIFIED IDEOGRAPH <U932B> \x8E\xE0 |0 # CJK UNIFIED IDEOGRAPH @@ -6563,17 +6891,20 @@ CHARMAP <U933B> \xE8\x46 |0 # CJK UNIFIED IDEOGRAPH <U9344> \xE7\xFB |0 # CJK UNIFIED IDEOGRAPH <U9348> \xFA\x5E |0 # CJK UNIFIED IDEOGRAPH +<U9348> \xED\x42 |3 # CJK UNIFIED IDEOGRAPH <U934B> \x93\xE7 |0 # CJK UNIFIED IDEOGRAPH <U934D> \x93\x74 |0 # CJK UNIFIED IDEOGRAPH <U9354> \x92\xD5 |0 # CJK UNIFIED IDEOGRAPH <U9356> \xE8\x4B |0 # CJK UNIFIED IDEOGRAPH <U9357> \xFB\xE0 |0 # CJK UNIFIED IDEOGRAPH +<U9357> \xEE\xC4 |3 # CJK UNIFIED IDEOGRAPH <U935B> \x92\x62 |0 # CJK UNIFIED IDEOGRAPH <U935C> \xE8\x47 |0 # CJK UNIFIED IDEOGRAPH <U9360> \xE8\x48 |0 # CJK UNIFIED IDEOGRAPH <U936C> \x8C\x4C |0 # CJK UNIFIED IDEOGRAPH <U936E> \xE8\x4A |0 # CJK UNIFIED IDEOGRAPH <U9370> \xFB\xDF |0 # CJK UNIFIED IDEOGRAPH +<U9370> \xEE\xC3 |3 # CJK UNIFIED IDEOGRAPH <U9375> \x8C\xAE |0 # CJK UNIFIED IDEOGRAPH <U937C> \xE8\x49 |0 # CJK UNIFIED IDEOGRAPH <U937E> \x8F\xDF |0 # CJK UNIFIED IDEOGRAPH @@ -6583,6 +6914,7 @@ CHARMAP <U9397> \x91\x99 |0 # CJK UNIFIED IDEOGRAPH <U939A> \x92\xC8 |0 # CJK UNIFIED IDEOGRAPH <U93A4> \xFB\xE1 |0 # CJK UNIFIED IDEOGRAPH +<U93A4> \xEE\xC5 |3 # CJK UNIFIED IDEOGRAPH <U93A7> \x8A\x5A |0 # CJK UNIFIED IDEOGRAPH <U93AC> \xE8\x4D |0 # CJK UNIFIED IDEOGRAPH <U93AD> \xE8\x4E |0 # CJK UNIFIED IDEOGRAPH @@ -6591,6 +6923,7 @@ CHARMAP <U93B9> \xE8\x50 |0 # CJK UNIFIED IDEOGRAPH <U93C3> \xE8\x56 |0 # CJK UNIFIED IDEOGRAPH <U93C6> \xFB\xE2 |0 # CJK UNIFIED IDEOGRAPH +<U93C6> \xEE\xC6 |3 # CJK UNIFIED IDEOGRAPH <U93C8> \xE8\x59 |0 # CJK UNIFIED IDEOGRAPH <U93D0> \xE8\x58 |0 # CJK UNIFIED IDEOGRAPH <U93D1> \x93\x4C |0 # CJK UNIFIED IDEOGRAPH @@ -6599,11 +6932,13 @@ CHARMAP <U93D8> \xE8\x55 |0 # CJK UNIFIED IDEOGRAPH <U93DD> \xE8\x57 |0 # CJK UNIFIED IDEOGRAPH <U93DE> \xFB\xE3 |0 # CJK UNIFIED IDEOGRAPH +<U93DE> \xEE\xC7 |3 # CJK UNIFIED IDEOGRAPH <U93E1> \x8B\xBE |0 # CJK UNIFIED IDEOGRAPH <U93E4> \xE8\x5A |0 # CJK UNIFIED IDEOGRAPH <U93E5> \xE8\x54 |0 # CJK UNIFIED IDEOGRAPH <U93E8> \xE8\x53 |0 # CJK UNIFIED IDEOGRAPH <U93F8> \xFB\xE4 |0 # CJK UNIFIED IDEOGRAPH +<U93F8> \xEE\xC8 |3 # CJK UNIFIED IDEOGRAPH <U9403> \xE8\x5E |0 # CJK UNIFIED IDEOGRAPH <U9407> \xE8\x5F |0 # CJK UNIFIED IDEOGRAPH <U9410> \xE8\x60 |0 # CJK UNIFIED IDEOGRAPH @@ -6615,6 +6950,7 @@ CHARMAP <U9421> \xE8\x64 |0 # CJK UNIFIED IDEOGRAPH <U942B> \xE8\x62 |0 # CJK UNIFIED IDEOGRAPH <U9431> \xFB\xE5 |0 # CJK UNIFIED IDEOGRAPH +<U9431> \xEE\xC9 |3 # CJK UNIFIED IDEOGRAPH <U9435> \xE8\x63 |0 # CJK UNIFIED IDEOGRAPH <U9436> \xE8\x61 |0 # CJK UNIFIED IDEOGRAPH <U9438> \x91\xF6 |0 # CJK UNIFIED IDEOGRAPH @@ -6622,7 +6958,9 @@ CHARMAP <U9441> \xE8\x66 |0 # CJK UNIFIED IDEOGRAPH <U9444> \xE8\x68 |0 # CJK UNIFIED IDEOGRAPH <U9445> \xFB\xE6 |0 # CJK UNIFIED IDEOGRAPH +<U9445> \xEE\xCA |3 # CJK UNIFIED IDEOGRAPH <U9448> \xFB\xE7 |0 # CJK UNIFIED IDEOGRAPH +<U9448> \xEE\xCB |3 # CJK UNIFIED IDEOGRAPH <U9451> \x8A\xD3 |0 # CJK UNIFIED IDEOGRAPH <U9452> \xE8\x67 |0 # CJK UNIFIED IDEOGRAPH <U9453> \x96\xF8 |0 # CJK UNIFIED IDEOGRAPH @@ -6651,6 +6989,7 @@ CHARMAP <U958F> \x89\x5B |0 # CJK UNIFIED IDEOGRAPH <U9591> \x8A\xD5 |0 # CJK UNIFIED IDEOGRAPH <U9592> \xFB\xE8 |0 # CJK UNIFIED IDEOGRAPH +<U9592> \xEE\xCC |3 # CJK UNIFIED IDEOGRAPH <U9593> \x8A\xD4 |0 # CJK UNIFIED IDEOGRAPH <U9594> \xE8\x7B |0 # CJK UNIFIED IDEOGRAPH <U9596> \xE8\x7C |0 # CJK UNIFIED IDEOGRAPH @@ -6736,12 +7075,14 @@ CHARMAP <U969B> \x8D\xDB |0 # CJK UNIFIED IDEOGRAPH <U969C> \x8F\xE1 |0 # CJK UNIFIED IDEOGRAPH <U969D> \xFB\xEB |0 # CJK UNIFIED IDEOGRAPH +<U969D> \xEE\xCF |3 # CJK UNIFIED IDEOGRAPH <U96A0> \x89\x42 |0 # CJK UNIFIED IDEOGRAPH <U96A3> \x97\xD7 |0 # CJK UNIFIED IDEOGRAPH <U96A7> \xE8\xA9 |0 # CJK UNIFIED IDEOGRAPH <U96A8> \xE7\xAC |0 # CJK UNIFIED IDEOGRAPH <U96AA> \xE8\xA8 |0 # CJK UNIFIED IDEOGRAPH <U96AF> \xFB\xEC |0 # CJK UNIFIED IDEOGRAPH +<U96AF> \xEE\xD0 |3 # CJK UNIFIED IDEOGRAPH <U96B0> \xE8\xAC |0 # CJK UNIFIED IDEOGRAPH <U96B1> \xE8\xAA |0 # CJK UNIFIED IDEOGRAPH <U96B2> \xE8\xAB |0 # CJK UNIFIED IDEOGRAPH @@ -6801,22 +7142,29 @@ CHARMAP <U9730> \xE8\xC5 |0 # CJK UNIFIED IDEOGRAPH <U9732> \x98\x49 |0 # CJK UNIFIED IDEOGRAPH <U9733> \xFB\xED |0 # CJK UNIFIED IDEOGRAPH +<U9733> \xEE\xD1 |3 # CJK UNIFIED IDEOGRAPH <U9738> \x9E\x50 |0 # CJK UNIFIED IDEOGRAPH <U9739> \xE8\xC6 |0 # CJK UNIFIED IDEOGRAPH <U973B> \xFB\xEE |0 # CJK UNIFIED IDEOGRAPH +<U973B> \xEE\xD2 |3 # CJK UNIFIED IDEOGRAPH <U973D> \xE8\xC7 |0 # CJK UNIFIED IDEOGRAPH <U973E> \xE8\xC8 |0 # CJK UNIFIED IDEOGRAPH <U9742> \xE8\xCC |0 # CJK UNIFIED IDEOGRAPH <U9743> \xFB\xEF |0 # CJK UNIFIED IDEOGRAPH +<U9743> \xEE\xD3 |3 # CJK UNIFIED IDEOGRAPH <U9744> \xE8\xC9 |0 # CJK UNIFIED IDEOGRAPH <U9746> \xE8\xCA |0 # CJK UNIFIED IDEOGRAPH <U9748> \xE8\xCB |0 # CJK UNIFIED IDEOGRAPH <U9749> \xE8\xCD |0 # CJK UNIFIED IDEOGRAPH <U974D> \xFB\xF0 |0 # CJK UNIFIED IDEOGRAPH +<U974D> \xEE\xD4 |3 # CJK UNIFIED IDEOGRAPH <U974F> \xFB\xF1 |0 # CJK UNIFIED IDEOGRAPH +<U974F> \xEE\xD5 |3 # CJK UNIFIED IDEOGRAPH <U9751> \xFB\xF2 |0 # CJK UNIFIED IDEOGRAPH +<U9751> \xEE\xD6 |3 # CJK UNIFIED IDEOGRAPH <U9752> \x90\xC2 |0 # CJK UNIFIED IDEOGRAPH <U9755> \xFB\xF3 |0 # CJK UNIFIED IDEOGRAPH +<U9755> \xEE\xD7 |3 # CJK UNIFIED IDEOGRAPH <U9756> \x96\xF5 |0 # CJK UNIFIED IDEOGRAPH <U9759> \x90\xC3 |0 # CJK UNIFIED IDEOGRAPH <U975C> \xE8\xCE |0 # CJK UNIFIED IDEOGRAPH @@ -6901,10 +7249,12 @@ CHARMAP <U9854> \x8A\xE7 |0 # CJK UNIFIED IDEOGRAPH <U9855> \x8C\xB0 |0 # CJK UNIFIED IDEOGRAPH <U9857> \xFB\xF4 |0 # CJK UNIFIED IDEOGRAPH +<U9857> \xEE\xD8 |3 # CJK UNIFIED IDEOGRAPH <U9858> \x8A\xE8 |0 # CJK UNIFIED IDEOGRAPH <U985B> \x93\x5E |0 # CJK UNIFIED IDEOGRAPH <U985E> \x97\xDE |0 # CJK UNIFIED IDEOGRAPH <U9865> \xFB\xF5 |0 # CJK UNIFIED IDEOGRAPH +<U9865> \xEE\xD9 |3 # CJK UNIFIED IDEOGRAPH <U9867> \x8C\xDA |0 # CJK UNIFIED IDEOGRAPH <U986B> \xE8\xFA |0 # CJK UNIFIED IDEOGRAPH <U986F> \xE8\xFB |0 # CJK UNIFIED IDEOGRAPH @@ -6950,6 +7300,7 @@ CHARMAP <U9921> \xE9\x51 |0 # CJK UNIFIED IDEOGRAPH <U9924> \xE9\x54 |0 # CJK UNIFIED IDEOGRAPH <U9927> \xFB\xF8 |0 # CJK UNIFIED IDEOGRAPH +<U9927> \xEE\xDC |3 # CJK UNIFIED IDEOGRAPH <U9928> \x8A\xD9 |0 # CJK UNIFIED IDEOGRAPH <U992C> \xE9\x56 |0 # CJK UNIFIED IDEOGRAPH <U992E> \xE9\x57 |0 # CJK UNIFIED IDEOGRAPH @@ -6970,6 +7321,7 @@ CHARMAP <U9998> \xE9\x64 |0 # CJK UNIFIED IDEOGRAPH <U9999> \x8D\x81 |0 # CJK UNIFIED IDEOGRAPH <U999E> \xFB\xFA |0 # CJK UNIFIED IDEOGRAPH +<U999E> \xEE\xDE |3 # CJK UNIFIED IDEOGRAPH <U99A5> \xE9\x65 |0 # CJK UNIFIED IDEOGRAPH <U99A8> \x8A\x5D |0 # CJK UNIFIED IDEOGRAPH <U99AC> \x94\x6E |0 # CJK UNIFIED IDEOGRAPH @@ -7017,6 +7369,7 @@ CHARMAP <U9A45> \xE9\x7B |0 # CJK UNIFIED IDEOGRAPH <U9A4D> \xE9\x82 |0 # CJK UNIFIED IDEOGRAPH <U9A4E> \xFB\xFB |0 # CJK UNIFIED IDEOGRAPH +<U9A4E> \xEE\xDF |3 # CJK UNIFIED IDEOGRAPH <U9A55> \xE9\x81 |0 # CJK UNIFIED IDEOGRAPH <U9A57> \xE9\x84 |0 # CJK UNIFIED IDEOGRAPH <U9A5A> \x8B\xC1 |0 # CJK UNIFIED IDEOGRAPH @@ -7041,7 +7394,9 @@ CHARMAP <U9AD4> \xE9\x93 |0 # CJK UNIFIED IDEOGRAPH <U9AD8> \x8D\x82 |0 # CJK UNIFIED IDEOGRAPH <U9AD9> \xFB\xFC |0 # CJK UNIFIED IDEOGRAPH +<U9AD9> \xEE\xE0 |3 # CJK UNIFIED IDEOGRAPH <U9ADC> \xFC\x40 |0 # CJK UNIFIED IDEOGRAPH +<U9ADC> \xEE\xE1 |3 # CJK UNIFIED IDEOGRAPH <U9ADE> \xE9\x94 |0 # CJK UNIFIED IDEOGRAPH <U9ADF> \xE9\x95 |0 # CJK UNIFIED IDEOGRAPH <U9AE2> \xE9\x96 |0 # CJK UNIFIED IDEOGRAPH @@ -7087,11 +7442,14 @@ CHARMAP <U9B5A> \x8B\x9B |0 # CJK UNIFIED IDEOGRAPH <U9B6F> \x98\x44 |0 # CJK UNIFIED IDEOGRAPH <U9B72> \xFC\x42 |0 # CJK UNIFIED IDEOGRAPH +<U9B72> \xEE\xE3 |3 # CJK UNIFIED IDEOGRAPH <U9B74> \xE9\xB5 |0 # CJK UNIFIED IDEOGRAPH <U9B75> \xFC\x41 |0 # CJK UNIFIED IDEOGRAPH +<U9B75> \xEE\xE2 |3 # CJK UNIFIED IDEOGRAPH <U9B83> \xE9\xB7 |0 # CJK UNIFIED IDEOGRAPH <U9B8E> \x88\xBC |0 # CJK UNIFIED IDEOGRAPH <U9B8F> \xFC\x43 |0 # CJK UNIFIED IDEOGRAPH +<U9B8F> \xEE\xE4 |3 # CJK UNIFIED IDEOGRAPH <U9B91> \xE9\xB8 |0 # CJK UNIFIED IDEOGRAPH <U9B92> \x95\xA9 |0 # CJK UNIFIED IDEOGRAPH <U9B93> \xE9\xB6 |0 # CJK UNIFIED IDEOGRAPH @@ -7105,9 +7463,11 @@ CHARMAP <U9BAD> \x8D\xF8 |0 # CJK UNIFIED IDEOGRAPH <U9BAE> \x91\x4E |0 # CJK UNIFIED IDEOGRAPH <U9BB1> \xFC\x44 |0 # CJK UNIFIED IDEOGRAPH +<U9BB1> \xEE\xE5 |3 # CJK UNIFIED IDEOGRAPH <U9BB4> \xE9\xBE |0 # CJK UNIFIED IDEOGRAPH <U9BB9> \xE9\xC1 |0 # CJK UNIFIED IDEOGRAPH <U9BBB> \xFC\x45 |0 # CJK UNIFIED IDEOGRAPH +<U9BBB> \xEE\xE6 |3 # CJK UNIFIED IDEOGRAPH <U9BC0> \xE9\xBF |0 # CJK UNIFIED IDEOGRAPH <U9BC6> \xE9\xC2 |0 # CJK UNIFIED IDEOGRAPH <U9BC9> \x8C\xEF |0 # CJK UNIFIED IDEOGRAPH @@ -7128,6 +7488,7 @@ CHARMAP <U9BF2> \xE9\xCC |0 # CJK UNIFIED IDEOGRAPH <U9BF5> \x88\xB1 |0 # CJK UNIFIED IDEOGRAPH <U9C00> \xFC\x46 |0 # CJK UNIFIED IDEOGRAPH +<U9C00> \xEE\xE7 |3 # CJK UNIFIED IDEOGRAPH <U9C04> \xE9\xD8 |0 # CJK UNIFIED IDEOGRAPH <U9C06> \xE9\xD4 |0 # CJK UNIFIED IDEOGRAPH <U9C08> \xE9\xD5 |0 # CJK UNIFIED IDEOGRAPH @@ -7205,9 +7566,11 @@ CHARMAP <U9D61> \x96\xB7 |0 # CJK UNIFIED IDEOGRAPH <U9D64> \xEA\x42 |0 # CJK UNIFIED IDEOGRAPH <U9D6B> \xFC\x48 |0 # CJK UNIFIED IDEOGRAPH +<U9D6B> \xEE\xE9 |3 # CJK UNIFIED IDEOGRAPH <U9D6C> \x96\x51 |0 # CJK UNIFIED IDEOGRAPH <U9D6F> \xEA\x4A |0 # CJK UNIFIED IDEOGRAPH <U9D70> \xFC\x47 |0 # CJK UNIFIED IDEOGRAPH +<U9D70> \xEE\xE8 |3 # CJK UNIFIED IDEOGRAPH <U9D72> \xEA\x46 |0 # CJK UNIFIED IDEOGRAPH <U9D7A> \xEA\x4B |0 # CJK UNIFIED IDEOGRAPH <U9D87> \xEA\x48 |0 # CJK UNIFIED IDEOGRAPH @@ -7239,6 +7602,7 @@ CHARMAP <U9DFA> \x8D\xEB |0 # CJK UNIFIED IDEOGRAPH <U9DFD> \xEA\x5E |0 # CJK UNIFIED IDEOGRAPH <U9E19> \xFC\x4A |0 # CJK UNIFIED IDEOGRAPH +<U9E19> \xEE\xEB |3 # CJK UNIFIED IDEOGRAPH <U9E1A> \xEA\x5F |0 # CJK UNIFIED IDEOGRAPH <U9E1B> \xEA\x60 |0 # CJK UNIFIED IDEOGRAPH <U9E1E> \xEA\x61 |0 # CJK UNIFIED IDEOGRAPH @@ -7277,6 +7641,7 @@ CHARMAP <U9ECF> \xEA\x75 |0 # CJK UNIFIED IDEOGRAPH <U9ED0> \xEA\x76 |0 # CJK UNIFIED IDEOGRAPH <U9ED1> \xFC\x4B |0 # CJK UNIFIED IDEOGRAPH +<U9ED1> \xEE\xEC |3 # CJK UNIFIED IDEOGRAPH <U9ED2> \x8D\x95 |0 # CJK UNIFIED IDEOGRAPH <U9ED4> \xEA\x77 |0 # CJK UNIFIED IDEOGRAPH <U9ED8> \xE0\xD2 |0 # CJK UNIFIED IDEOGRAPH @@ -7329,47 +7694,1967 @@ CHARMAP <U9F9C> \xEA\x9D |0 # CJK UNIFIED IDEOGRAPH <U9F9D> \xE2\x73 |0 # CJK UNIFIED IDEOGRAPH <U9FA0> \xEA\x9E |0 # CJK UNIFIED IDEOGRAPH +<UE000> \xF0\x40 |0 # PRIVATE USE AREA +<UE001> \xF0\x41 |0 # PRIVATE USE AREA +<UE002> \xF0\x42 |0 # PRIVATE USE AREA +<UE003> \xF0\x43 |0 # PRIVATE USE AREA +<UE004> \xF0\x44 |0 # PRIVATE USE AREA +<UE005> \xF0\x45 |0 # PRIVATE USE AREA +<UE006> \xF0\x46 |0 # PRIVATE USE AREA +<UE007> \xF0\x47 |0 # PRIVATE USE AREA +<UE008> \xF0\x48 |0 # PRIVATE USE AREA +<UE009> \xF0\x49 |0 # PRIVATE USE AREA +<UE00A> \xF0\x4A |0 # PRIVATE USE AREA +<UE00B> \xF0\x4B |0 # PRIVATE USE AREA +<UE00C> \xF0\x4C |0 # PRIVATE USE AREA +<UE00D> \xF0\x4D |0 # PRIVATE USE AREA +<UE00E> \xF0\x4E |0 # PRIVATE USE AREA +<UE00F> \xF0\x4F |0 # PRIVATE USE AREA +<UE010> \xF0\x50 |0 # PRIVATE USE AREA +<UE011> \xF0\x51 |0 # PRIVATE USE AREA +<UE012> \xF0\x52 |0 # PRIVATE USE AREA +<UE013> \xF0\x53 |0 # PRIVATE USE AREA +<UE014> \xF0\x54 |0 # PRIVATE USE AREA +<UE015> \xF0\x55 |0 # PRIVATE USE AREA +<UE016> \xF0\x56 |0 # PRIVATE USE AREA +<UE017> \xF0\x57 |0 # PRIVATE USE AREA +<UE018> \xF0\x58 |0 # PRIVATE USE AREA +<UE019> \xF0\x59 |0 # PRIVATE USE AREA +<UE01A> \xF0\x5A |0 # PRIVATE USE AREA +<UE01B> \xF0\x5B |0 # PRIVATE USE AREA +<UE01C> \xF0\x5C |0 # PRIVATE USE AREA +<UE01D> \xF0\x5D |0 # PRIVATE USE AREA +<UE01E> \xF0\x5E |0 # PRIVATE USE AREA +<UE01F> \xF0\x5F |0 # PRIVATE USE AREA +<UE020> \xF0\x60 |0 # PRIVATE USE AREA +<UE021> \xF0\x61 |0 # PRIVATE USE AREA +<UE022> \xF0\x62 |0 # PRIVATE USE AREA +<UE023> \xF0\x63 |0 # PRIVATE USE AREA +<UE024> \xF0\x64 |0 # PRIVATE USE AREA +<UE025> \xF0\x65 |0 # PRIVATE USE AREA +<UE026> \xF0\x66 |0 # PRIVATE USE AREA +<UE027> \xF0\x67 |0 # PRIVATE USE AREA +<UE028> \xF0\x68 |0 # PRIVATE USE AREA +<UE029> \xF0\x69 |0 # PRIVATE USE AREA +<UE02A> \xF0\x6A |0 # PRIVATE USE AREA +<UE02B> \xF0\x6B |0 # PRIVATE USE AREA +<UE02C> \xF0\x6C |0 # PRIVATE USE AREA +<UE02D> \xF0\x6D |0 # PRIVATE USE AREA +<UE02E> \xF0\x6E |0 # PRIVATE USE AREA +<UE02F> \xF0\x6F |0 # PRIVATE USE AREA +<UE030> \xF0\x70 |0 # PRIVATE USE AREA +<UE031> \xF0\x71 |0 # PRIVATE USE AREA +<UE032> \xF0\x72 |0 # PRIVATE USE AREA +<UE033> \xF0\x73 |0 # PRIVATE USE AREA +<UE034> \xF0\x74 |0 # PRIVATE USE AREA +<UE035> \xF0\x75 |0 # PRIVATE USE AREA +<UE036> \xF0\x76 |0 # PRIVATE USE AREA +<UE037> \xF0\x77 |0 # PRIVATE USE AREA +<UE038> \xF0\x78 |0 # PRIVATE USE AREA +<UE039> \xF0\x79 |0 # PRIVATE USE AREA +<UE03A> \xF0\x7A |0 # PRIVATE USE AREA +<UE03B> \xF0\x7B |0 # PRIVATE USE AREA +<UE03C> \xF0\x7C |0 # PRIVATE USE AREA +<UE03D> \xF0\x7D |0 # PRIVATE USE AREA +<UE03E> \xF0\x7E |0 # PRIVATE USE AREA +<UE03F> \xF0\x80 |0 # PRIVATE USE AREA +<UE040> \xF0\x81 |0 # PRIVATE USE AREA +<UE041> \xF0\x82 |0 # PRIVATE USE AREA +<UE042> \xF0\x83 |0 # PRIVATE USE AREA +<UE043> \xF0\x84 |0 # PRIVATE USE AREA +<UE044> \xF0\x85 |0 # PRIVATE USE AREA +<UE045> \xF0\x86 |0 # PRIVATE USE AREA +<UE046> \xF0\x87 |0 # PRIVATE USE AREA +<UE047> \xF0\x88 |0 # PRIVATE USE AREA +<UE048> \xF0\x89 |0 # PRIVATE USE AREA +<UE049> \xF0\x8A |0 # PRIVATE USE AREA +<UE04A> \xF0\x8B |0 # PRIVATE USE AREA +<UE04B> \xF0\x8C |0 # PRIVATE USE AREA +<UE04C> \xF0\x8D |0 # PRIVATE USE AREA +<UE04D> \xF0\x8E |0 # PRIVATE USE AREA +<UE04E> \xF0\x8F |0 # PRIVATE USE AREA +<UE04F> \xF0\x90 |0 # PRIVATE USE AREA +<UE050> \xF0\x91 |0 # PRIVATE USE AREA +<UE051> \xF0\x92 |0 # PRIVATE USE AREA +<UE052> \xF0\x93 |0 # PRIVATE USE AREA +<UE053> \xF0\x94 |0 # PRIVATE USE AREA +<UE054> \xF0\x95 |0 # PRIVATE USE AREA +<UE055> \xF0\x96 |0 # PRIVATE USE AREA +<UE056> \xF0\x97 |0 # PRIVATE USE AREA +<UE057> \xF0\x98 |0 # PRIVATE USE AREA +<UE058> \xF0\x99 |0 # PRIVATE USE AREA +<UE059> \xF0\x9A |0 # PRIVATE USE AREA +<UE05A> \xF0\x9B |0 # PRIVATE USE AREA +<UE05B> \xF0\x9C |0 # PRIVATE USE AREA +<UE05C> \xF0\x9D |0 # PRIVATE USE AREA +<UE05D> \xF0\x9E |0 # PRIVATE USE AREA +<UE05E> \xF0\x9F |0 # PRIVATE USE AREA +<UE05F> \xF0\xA0 |0 # PRIVATE USE AREA +<UE060> \xF0\xA1 |0 # PRIVATE USE AREA +<UE061> \xF0\xA2 |0 # PRIVATE USE AREA +<UE062> \xF0\xA3 |0 # PRIVATE USE AREA +<UE063> \xF0\xA4 |0 # PRIVATE USE AREA +<UE064> \xF0\xA5 |0 # PRIVATE USE AREA +<UE065> \xF0\xA6 |0 # PRIVATE USE AREA +<UE066> \xF0\xA7 |0 # PRIVATE USE AREA +<UE067> \xF0\xA8 |0 # PRIVATE USE AREA +<UE068> \xF0\xA9 |0 # PRIVATE USE AREA +<UE069> \xF0\xAA |0 # PRIVATE USE AREA +<UE06A> \xF0\xAB |0 # PRIVATE USE AREA +<UE06B> \xF0\xAC |0 # PRIVATE USE AREA +<UE06C> \xF0\xAD |0 # PRIVATE USE AREA +<UE06D> \xF0\xAE |0 # PRIVATE USE AREA +<UE06E> \xF0\xAF |0 # PRIVATE USE AREA +<UE06F> \xF0\xB0 |0 # PRIVATE USE AREA +<UE070> \xF0\xB1 |0 # PRIVATE USE AREA +<UE071> \xF0\xB2 |0 # PRIVATE USE AREA +<UE072> \xF0\xB3 |0 # PRIVATE USE AREA +<UE073> \xF0\xB4 |0 # PRIVATE USE AREA +<UE074> \xF0\xB5 |0 # PRIVATE USE AREA +<UE075> \xF0\xB6 |0 # PRIVATE USE AREA +<UE076> \xF0\xB7 |0 # PRIVATE USE AREA +<UE077> \xF0\xB8 |0 # PRIVATE USE AREA +<UE078> \xF0\xB9 |0 # PRIVATE USE AREA +<UE079> \xF0\xBA |0 # PRIVATE USE AREA +<UE07A> \xF0\xBB |0 # PRIVATE USE AREA +<UE07B> \xF0\xBC |0 # PRIVATE USE AREA +<UE07C> \xF0\xBD |0 # PRIVATE USE AREA +<UE07D> \xF0\xBE |0 # PRIVATE USE AREA +<UE07E> \xF0\xBF |0 # PRIVATE USE AREA +<UE07F> \xF0\xC0 |0 # PRIVATE USE AREA +<UE080> \xF0\xC1 |0 # PRIVATE USE AREA +<UE081> \xF0\xC2 |0 # PRIVATE USE AREA +<UE082> \xF0\xC3 |0 # PRIVATE USE AREA +<UE083> \xF0\xC4 |0 # PRIVATE USE AREA +<UE084> \xF0\xC5 |0 # PRIVATE USE AREA +<UE085> \xF0\xC6 |0 # PRIVATE USE AREA +<UE086> \xF0\xC7 |0 # PRIVATE USE AREA +<UE087> \xF0\xC8 |0 # PRIVATE USE AREA +<UE088> \xF0\xC9 |0 # PRIVATE USE AREA +<UE089> \xF0\xCA |0 # PRIVATE USE AREA +<UE08A> \xF0\xCB |0 # PRIVATE USE AREA +<UE08B> \xF0\xCC |0 # PRIVATE USE AREA +<UE08C> \xF0\xCD |0 # PRIVATE USE AREA +<UE08D> \xF0\xCE |0 # PRIVATE USE AREA +<UE08E> \xF0\xCF |0 # PRIVATE USE AREA +<UE08F> \xF0\xD0 |0 # PRIVATE USE AREA +<UE090> \xF0\xD1 |0 # PRIVATE USE AREA +<UE091> \xF0\xD2 |0 # PRIVATE USE AREA +<UE092> \xF0\xD3 |0 # PRIVATE USE AREA +<UE093> \xF0\xD4 |0 # PRIVATE USE AREA +<UE094> \xF0\xD5 |0 # PRIVATE USE AREA +<UE095> \xF0\xD6 |0 # PRIVATE USE AREA +<UE096> \xF0\xD7 |0 # PRIVATE USE AREA +<UE097> \xF0\xD8 |0 # PRIVATE USE AREA +<UE098> \xF0\xD9 |0 # PRIVATE USE AREA +<UE099> \xF0\xDA |0 # PRIVATE USE AREA +<UE09A> \xF0\xDB |0 # PRIVATE USE AREA +<UE09B> \xF0\xDC |0 # PRIVATE USE AREA +<UE09C> \xF0\xDD |0 # PRIVATE USE AREA +<UE09D> \xF0\xDE |0 # PRIVATE USE AREA +<UE09E> \xF0\xDF |0 # PRIVATE USE AREA +<UE09F> \xF0\xE0 |0 # PRIVATE USE AREA +<UE0A0> \xF0\xE1 |0 # PRIVATE USE AREA +<UE0A1> \xF0\xE2 |0 # PRIVATE USE AREA +<UE0A2> \xF0\xE3 |0 # PRIVATE USE AREA +<UE0A3> \xF0\xE4 |0 # PRIVATE USE AREA +<UE0A4> \xF0\xE5 |0 # PRIVATE USE AREA +<UE0A5> \xF0\xE6 |0 # PRIVATE USE AREA +<UE0A6> \xF0\xE7 |0 # PRIVATE USE AREA +<UE0A7> \xF0\xE8 |0 # PRIVATE USE AREA +<UE0A8> \xF0\xE9 |0 # PRIVATE USE AREA +<UE0A9> \xF0\xEA |0 # PRIVATE USE AREA +<UE0AA> \xF0\xEB |0 # PRIVATE USE AREA +<UE0AB> \xF0\xEC |0 # PRIVATE USE AREA +<UE0AC> \xF0\xED |0 # PRIVATE USE AREA +<UE0AD> \xF0\xEE |0 # PRIVATE USE AREA +<UE0AE> \xF0\xEF |0 # PRIVATE USE AREA +<UE0AF> \xF0\xF0 |0 # PRIVATE USE AREA +<UE0B0> \xF0\xF1 |0 # PRIVATE USE AREA +<UE0B1> \xF0\xF2 |0 # PRIVATE USE AREA +<UE0B2> \xF0\xF3 |0 # PRIVATE USE AREA +<UE0B3> \xF0\xF4 |0 # PRIVATE USE AREA +<UE0B4> \xF0\xF5 |0 # PRIVATE USE AREA +<UE0B5> \xF0\xF6 |0 # PRIVATE USE AREA +<UE0B6> \xF0\xF7 |0 # PRIVATE USE AREA +<UE0B7> \xF0\xF8 |0 # PRIVATE USE AREA +<UE0B8> \xF0\xF9 |0 # PRIVATE USE AREA +<UE0B9> \xF0\xFA |0 # PRIVATE USE AREA +<UE0BA> \xF0\xFB |0 # PRIVATE USE AREA +<UE0BB> \xF0\xFC |0 # PRIVATE USE AREA +<UE0BC> \xF1\x40 |0 # PRIVATE USE AREA +<UE0BD> \xF1\x41 |0 # PRIVATE USE AREA +<UE0BE> \xF1\x42 |0 # PRIVATE USE AREA +<UE0BF> \xF1\x43 |0 # PRIVATE USE AREA +<UE0C0> \xF1\x44 |0 # PRIVATE USE AREA +<UE0C1> \xF1\x45 |0 # PRIVATE USE AREA +<UE0C2> \xF1\x46 |0 # PRIVATE USE AREA +<UE0C3> \xF1\x47 |0 # PRIVATE USE AREA +<UE0C4> \xF1\x48 |0 # PRIVATE USE AREA +<UE0C5> \xF1\x49 |0 # PRIVATE USE AREA +<UE0C6> \xF1\x4A |0 # PRIVATE USE AREA +<UE0C7> \xF1\x4B |0 # PRIVATE USE AREA +<UE0C8> \xF1\x4C |0 # PRIVATE USE AREA +<UE0C9> \xF1\x4D |0 # PRIVATE USE AREA +<UE0CA> \xF1\x4E |0 # PRIVATE USE AREA +<UE0CB> \xF1\x4F |0 # PRIVATE USE AREA +<UE0CC> \xF1\x50 |0 # PRIVATE USE AREA +<UE0CD> \xF1\x51 |0 # PRIVATE USE AREA +<UE0CE> \xF1\x52 |0 # PRIVATE USE AREA +<UE0CF> \xF1\x53 |0 # PRIVATE USE AREA +<UE0D0> \xF1\x54 |0 # PRIVATE USE AREA +<UE0D1> \xF1\x55 |0 # PRIVATE USE AREA +<UE0D2> \xF1\x56 |0 # PRIVATE USE AREA +<UE0D3> \xF1\x57 |0 # PRIVATE USE AREA +<UE0D4> \xF1\x58 |0 # PRIVATE USE AREA +<UE0D5> \xF1\x59 |0 # PRIVATE USE AREA +<UE0D6> \xF1\x5A |0 # PRIVATE USE AREA +<UE0D7> \xF1\x5B |0 # PRIVATE USE AREA +<UE0D8> \xF1\x5C |0 # PRIVATE USE AREA +<UE0D9> \xF1\x5D |0 # PRIVATE USE AREA +<UE0DA> \xF1\x5E |0 # PRIVATE USE AREA +<UE0DB> \xF1\x5F |0 # PRIVATE USE AREA +<UE0DC> \xF1\x60 |0 # PRIVATE USE AREA +<UE0DD> \xF1\x61 |0 # PRIVATE USE AREA +<UE0DE> \xF1\x62 |0 # PRIVATE USE AREA +<UE0DF> \xF1\x63 |0 # PRIVATE USE AREA +<UE0E0> \xF1\x64 |0 # PRIVATE USE AREA +<UE0E1> \xF1\x65 |0 # PRIVATE USE AREA +<UE0E2> \xF1\x66 |0 # PRIVATE USE AREA +<UE0E3> \xF1\x67 |0 # PRIVATE USE AREA +<UE0E4> \xF1\x68 |0 # PRIVATE USE AREA +<UE0E5> \xF1\x69 |0 # PRIVATE USE AREA +<UE0E6> \xF1\x6A |0 # PRIVATE USE AREA +<UE0E7> \xF1\x6B |0 # PRIVATE USE AREA +<UE0E8> \xF1\x6C |0 # PRIVATE USE AREA +<UE0E9> \xF1\x6D |0 # PRIVATE USE AREA +<UE0EA> \xF1\x6E |0 # PRIVATE USE AREA +<UE0EB> \xF1\x6F |0 # PRIVATE USE AREA +<UE0EC> \xF1\x70 |0 # PRIVATE USE AREA +<UE0ED> \xF1\x71 |0 # PRIVATE USE AREA +<UE0EE> \xF1\x72 |0 # PRIVATE USE AREA +<UE0EF> \xF1\x73 |0 # PRIVATE USE AREA +<UE0F0> \xF1\x74 |0 # PRIVATE USE AREA +<UE0F1> \xF1\x75 |0 # PRIVATE USE AREA +<UE0F2> \xF1\x76 |0 # PRIVATE USE AREA +<UE0F3> \xF1\x77 |0 # PRIVATE USE AREA +<UE0F4> \xF1\x78 |0 # PRIVATE USE AREA +<UE0F5> \xF1\x79 |0 # PRIVATE USE AREA +<UE0F6> \xF1\x7A |0 # PRIVATE USE AREA +<UE0F7> \xF1\x7B |0 # PRIVATE USE AREA +<UE0F8> \xF1\x7C |0 # PRIVATE USE AREA +<UE0F9> \xF1\x7D |0 # PRIVATE USE AREA +<UE0FA> \xF1\x7E |0 # PRIVATE USE AREA +<UE0FB> \xF1\x80 |0 # PRIVATE USE AREA +<UE0FC> \xF1\x81 |0 # PRIVATE USE AREA +<UE0FD> \xF1\x82 |0 # PRIVATE USE AREA +<UE0FE> \xF1\x83 |0 # PRIVATE USE AREA +<UE0FF> \xF1\x84 |0 # PRIVATE USE AREA +<UE100> \xF1\x85 |0 # PRIVATE USE AREA +<UE101> \xF1\x86 |0 # PRIVATE USE AREA +<UE102> \xF1\x87 |0 # PRIVATE USE AREA +<UE103> \xF1\x88 |0 # PRIVATE USE AREA +<UE104> \xF1\x89 |0 # PRIVATE USE AREA +<UE105> \xF1\x8A |0 # PRIVATE USE AREA +<UE106> \xF1\x8B |0 # PRIVATE USE AREA +<UE107> \xF1\x8C |0 # PRIVATE USE AREA +<UE108> \xF1\x8D |0 # PRIVATE USE AREA +<UE109> \xF1\x8E |0 # PRIVATE USE AREA +<UE10A> \xF1\x8F |0 # PRIVATE USE AREA +<UE10B> \xF1\x90 |0 # PRIVATE USE AREA +<UE10C> \xF1\x91 |0 # PRIVATE USE AREA +<UE10D> \xF1\x92 |0 # PRIVATE USE AREA +<UE10E> \xF1\x93 |0 # PRIVATE USE AREA +<UE10F> \xF1\x94 |0 # PRIVATE USE AREA +<UE110> \xF1\x95 |0 # PRIVATE USE AREA +<UE111> \xF1\x96 |0 # PRIVATE USE AREA +<UE112> \xF1\x97 |0 # PRIVATE USE AREA +<UE113> \xF1\x98 |0 # PRIVATE USE AREA +<UE114> \xF1\x99 |0 # PRIVATE USE AREA +<UE115> \xF1\x9A |0 # PRIVATE USE AREA +<UE116> \xF1\x9B |0 # PRIVATE USE AREA +<UE117> \xF1\x9C |0 # PRIVATE USE AREA +<UE118> \xF1\x9D |0 # PRIVATE USE AREA +<UE119> \xF1\x9E |0 # PRIVATE USE AREA +<UE11A> \xF1\x9F |0 # PRIVATE USE AREA +<UE11B> \xF1\xA0 |0 # PRIVATE USE AREA +<UE11C> \xF1\xA1 |0 # PRIVATE USE AREA +<UE11D> \xF1\xA2 |0 # PRIVATE USE AREA +<UE11E> \xF1\xA3 |0 # PRIVATE USE AREA +<UE11F> \xF1\xA4 |0 # PRIVATE USE AREA +<UE120> \xF1\xA5 |0 # PRIVATE USE AREA +<UE121> \xF1\xA6 |0 # PRIVATE USE AREA +<UE122> \xF1\xA7 |0 # PRIVATE USE AREA +<UE123> \xF1\xA8 |0 # PRIVATE USE AREA +<UE124> \xF1\xA9 |0 # PRIVATE USE AREA +<UE125> \xF1\xAA |0 # PRIVATE USE AREA +<UE126> \xF1\xAB |0 # PRIVATE USE AREA +<UE127> \xF1\xAC |0 # PRIVATE USE AREA +<UE128> \xF1\xAD |0 # PRIVATE USE AREA +<UE129> \xF1\xAE |0 # PRIVATE USE AREA +<UE12A> \xF1\xAF |0 # PRIVATE USE AREA +<UE12B> \xF1\xB0 |0 # PRIVATE USE AREA +<UE12C> \xF1\xB1 |0 # PRIVATE USE AREA +<UE12D> \xF1\xB2 |0 # PRIVATE USE AREA +<UE12E> \xF1\xB3 |0 # PRIVATE USE AREA +<UE12F> \xF1\xB4 |0 # PRIVATE USE AREA +<UE130> \xF1\xB5 |0 # PRIVATE USE AREA +<UE131> \xF1\xB6 |0 # PRIVATE USE AREA +<UE132> \xF1\xB7 |0 # PRIVATE USE AREA +<UE133> \xF1\xB8 |0 # PRIVATE USE AREA +<UE134> \xF1\xB9 |0 # PRIVATE USE AREA +<UE135> \xF1\xBA |0 # PRIVATE USE AREA +<UE136> \xF1\xBB |0 # PRIVATE USE AREA +<UE137> \xF1\xBC |0 # PRIVATE USE AREA +<UE138> \xF1\xBD |0 # PRIVATE USE AREA +<UE139> \xF1\xBE |0 # PRIVATE USE AREA +<UE13A> \xF1\xBF |0 # PRIVATE USE AREA +<UE13B> \xF1\xC0 |0 # PRIVATE USE AREA +<UE13C> \xF1\xC1 |0 # PRIVATE USE AREA +<UE13D> \xF1\xC2 |0 # PRIVATE USE AREA +<UE13E> \xF1\xC3 |0 # PRIVATE USE AREA +<UE13F> \xF1\xC4 |0 # PRIVATE USE AREA +<UE140> \xF1\xC5 |0 # PRIVATE USE AREA +<UE141> \xF1\xC6 |0 # PRIVATE USE AREA +<UE142> \xF1\xC7 |0 # PRIVATE USE AREA +<UE143> \xF1\xC8 |0 # PRIVATE USE AREA +<UE144> \xF1\xC9 |0 # PRIVATE USE AREA +<UE145> \xF1\xCA |0 # PRIVATE USE AREA +<UE146> \xF1\xCB |0 # PRIVATE USE AREA +<UE147> \xF1\xCC |0 # PRIVATE USE AREA +<UE148> \xF1\xCD |0 # PRIVATE USE AREA +<UE149> \xF1\xCE |0 # PRIVATE USE AREA +<UE14A> \xF1\xCF |0 # PRIVATE USE AREA +<UE14B> \xF1\xD0 |0 # PRIVATE USE AREA +<UE14C> \xF1\xD1 |0 # PRIVATE USE AREA +<UE14D> \xF1\xD2 |0 # PRIVATE USE AREA +<UE14E> \xF1\xD3 |0 # PRIVATE USE AREA +<UE14F> \xF1\xD4 |0 # PRIVATE USE AREA +<UE150> \xF1\xD5 |0 # PRIVATE USE AREA +<UE151> \xF1\xD6 |0 # PRIVATE USE AREA +<UE152> \xF1\xD7 |0 # PRIVATE USE AREA +<UE153> \xF1\xD8 |0 # PRIVATE USE AREA +<UE154> \xF1\xD9 |0 # PRIVATE USE AREA +<UE155> \xF1\xDA |0 # PRIVATE USE AREA +<UE156> \xF1\xDB |0 # PRIVATE USE AREA +<UE157> \xF1\xDC |0 # PRIVATE USE AREA +<UE158> \xF1\xDD |0 # PRIVATE USE AREA +<UE159> \xF1\xDE |0 # PRIVATE USE AREA +<UE15A> \xF1\xDF |0 # PRIVATE USE AREA +<UE15B> \xF1\xE0 |0 # PRIVATE USE AREA +<UE15C> \xF1\xE1 |0 # PRIVATE USE AREA +<UE15D> \xF1\xE2 |0 # PRIVATE USE AREA +<UE15E> \xF1\xE3 |0 # PRIVATE USE AREA +<UE15F> \xF1\xE4 |0 # PRIVATE USE AREA +<UE160> \xF1\xE5 |0 # PRIVATE USE AREA +<UE161> \xF1\xE6 |0 # PRIVATE USE AREA +<UE162> \xF1\xE7 |0 # PRIVATE USE AREA +<UE163> \xF1\xE8 |0 # PRIVATE USE AREA +<UE164> \xF1\xE9 |0 # PRIVATE USE AREA +<UE165> \xF1\xEA |0 # PRIVATE USE AREA +<UE166> \xF1\xEB |0 # PRIVATE USE AREA +<UE167> \xF1\xEC |0 # PRIVATE USE AREA +<UE168> \xF1\xED |0 # PRIVATE USE AREA +<UE169> \xF1\xEE |0 # PRIVATE USE AREA +<UE16A> \xF1\xEF |0 # PRIVATE USE AREA +<UE16B> \xF1\xF0 |0 # PRIVATE USE AREA +<UE16C> \xF1\xF1 |0 # PRIVATE USE AREA +<UE16D> \xF1\xF2 |0 # PRIVATE USE AREA +<UE16E> \xF1\xF3 |0 # PRIVATE USE AREA +<UE16F> \xF1\xF4 |0 # PRIVATE USE AREA +<UE170> \xF1\xF5 |0 # PRIVATE USE AREA +<UE171> \xF1\xF6 |0 # PRIVATE USE AREA +<UE172> \xF1\xF7 |0 # PRIVATE USE AREA +<UE173> \xF1\xF8 |0 # PRIVATE USE AREA +<UE174> \xF1\xF9 |0 # PRIVATE USE AREA +<UE175> \xF1\xFA |0 # PRIVATE USE AREA +<UE176> \xF1\xFB |0 # PRIVATE USE AREA +<UE177> \xF1\xFC |0 # PRIVATE USE AREA +<UE178> \xF2\x40 |0 # PRIVATE USE AREA +<UE179> \xF2\x41 |0 # PRIVATE USE AREA +<UE17A> \xF2\x42 |0 # PRIVATE USE AREA +<UE17B> \xF2\x43 |0 # PRIVATE USE AREA +<UE17C> \xF2\x44 |0 # PRIVATE USE AREA +<UE17D> \xF2\x45 |0 # PRIVATE USE AREA +<UE17E> \xF2\x46 |0 # PRIVATE USE AREA +<UE17F> \xF2\x47 |0 # PRIVATE USE AREA +<UE180> \xF2\x48 |0 # PRIVATE USE AREA +<UE181> \xF2\x49 |0 # PRIVATE USE AREA +<UE182> \xF2\x4A |0 # PRIVATE USE AREA +<UE183> \xF2\x4B |0 # PRIVATE USE AREA +<UE184> \xF2\x4C |0 # PRIVATE USE AREA +<UE185> \xF2\x4D |0 # PRIVATE USE AREA +<UE186> \xF2\x4E |0 # PRIVATE USE AREA +<UE187> \xF2\x4F |0 # PRIVATE USE AREA +<UE188> \xF2\x50 |0 # PRIVATE USE AREA +<UE189> \xF2\x51 |0 # PRIVATE USE AREA +<UE18A> \xF2\x52 |0 # PRIVATE USE AREA +<UE18B> \xF2\x53 |0 # PRIVATE USE AREA +<UE18C> \xF2\x54 |0 # PRIVATE USE AREA +<UE18D> \xF2\x55 |0 # PRIVATE USE AREA +<UE18E> \xF2\x56 |0 # PRIVATE USE AREA +<UE18F> \xF2\x57 |0 # PRIVATE USE AREA +<UE190> \xF2\x58 |0 # PRIVATE USE AREA +<UE191> \xF2\x59 |0 # PRIVATE USE AREA +<UE192> \xF2\x5A |0 # PRIVATE USE AREA +<UE193> \xF2\x5B |0 # PRIVATE USE AREA +<UE194> \xF2\x5C |0 # PRIVATE USE AREA +<UE195> \xF2\x5D |0 # PRIVATE USE AREA +<UE196> \xF2\x5E |0 # PRIVATE USE AREA +<UE197> \xF2\x5F |0 # PRIVATE USE AREA +<UE198> \xF2\x60 |0 # PRIVATE USE AREA +<UE199> \xF2\x61 |0 # PRIVATE USE AREA +<UE19A> \xF2\x62 |0 # PRIVATE USE AREA +<UE19B> \xF2\x63 |0 # PRIVATE USE AREA +<UE19C> \xF2\x64 |0 # PRIVATE USE AREA +<UE19D> \xF2\x65 |0 # PRIVATE USE AREA +<UE19E> \xF2\x66 |0 # PRIVATE USE AREA +<UE19F> \xF2\x67 |0 # PRIVATE USE AREA +<UE1A0> \xF2\x68 |0 # PRIVATE USE AREA +<UE1A1> \xF2\x69 |0 # PRIVATE USE AREA +<UE1A2> \xF2\x6A |0 # PRIVATE USE AREA +<UE1A3> \xF2\x6B |0 # PRIVATE USE AREA +<UE1A4> \xF2\x6C |0 # PRIVATE USE AREA +<UE1A5> \xF2\x6D |0 # PRIVATE USE AREA +<UE1A6> \xF2\x6E |0 # PRIVATE USE AREA +<UE1A7> \xF2\x6F |0 # PRIVATE USE AREA +<UE1A8> \xF2\x70 |0 # PRIVATE USE AREA +<UE1A9> \xF2\x71 |0 # PRIVATE USE AREA +<UE1AA> \xF2\x72 |0 # PRIVATE USE AREA +<UE1AB> \xF2\x73 |0 # PRIVATE USE AREA +<UE1AC> \xF2\x74 |0 # PRIVATE USE AREA +<UE1AD> \xF2\x75 |0 # PRIVATE USE AREA +<UE1AE> \xF2\x76 |0 # PRIVATE USE AREA +<UE1AF> \xF2\x77 |0 # PRIVATE USE AREA +<UE1B0> \xF2\x78 |0 # PRIVATE USE AREA +<UE1B1> \xF2\x79 |0 # PRIVATE USE AREA +<UE1B2> \xF2\x7A |0 # PRIVATE USE AREA +<UE1B3> \xF2\x7B |0 # PRIVATE USE AREA +<UE1B4> \xF2\x7C |0 # PRIVATE USE AREA +<UE1B5> \xF2\x7D |0 # PRIVATE USE AREA +<UE1B6> \xF2\x7E |0 # PRIVATE USE AREA +<UE1B7> \xF2\x80 |0 # PRIVATE USE AREA +<UE1B8> \xF2\x81 |0 # PRIVATE USE AREA +<UE1B9> \xF2\x82 |0 # PRIVATE USE AREA +<UE1BA> \xF2\x83 |0 # PRIVATE USE AREA +<UE1BB> \xF2\x84 |0 # PRIVATE USE AREA +<UE1BC> \xF2\x85 |0 # PRIVATE USE AREA +<UE1BD> \xF2\x86 |0 # PRIVATE USE AREA +<UE1BE> \xF2\x87 |0 # PRIVATE USE AREA +<UE1BF> \xF2\x88 |0 # PRIVATE USE AREA +<UE1C0> \xF2\x89 |0 # PRIVATE USE AREA +<UE1C1> \xF2\x8A |0 # PRIVATE USE AREA +<UE1C2> \xF2\x8B |0 # PRIVATE USE AREA +<UE1C3> \xF2\x8C |0 # PRIVATE USE AREA +<UE1C4> \xF2\x8D |0 # PRIVATE USE AREA +<UE1C5> \xF2\x8E |0 # PRIVATE USE AREA +<UE1C6> \xF2\x8F |0 # PRIVATE USE AREA +<UE1C7> \xF2\x90 |0 # PRIVATE USE AREA +<UE1C8> \xF2\x91 |0 # PRIVATE USE AREA +<UE1C9> \xF2\x92 |0 # PRIVATE USE AREA +<UE1CA> \xF2\x93 |0 # PRIVATE USE AREA +<UE1CB> \xF2\x94 |0 # PRIVATE USE AREA +<UE1CC> \xF2\x95 |0 # PRIVATE USE AREA +<UE1CD> \xF2\x96 |0 # PRIVATE USE AREA +<UE1CE> \xF2\x97 |0 # PRIVATE USE AREA +<UE1CF> \xF2\x98 |0 # PRIVATE USE AREA +<UE1D0> \xF2\x99 |0 # PRIVATE USE AREA +<UE1D1> \xF2\x9A |0 # PRIVATE USE AREA +<UE1D2> \xF2\x9B |0 # PRIVATE USE AREA +<UE1D3> \xF2\x9C |0 # PRIVATE USE AREA +<UE1D4> \xF2\x9D |0 # PRIVATE USE AREA +<UE1D5> \xF2\x9E |0 # PRIVATE USE AREA +<UE1D6> \xF2\x9F |0 # PRIVATE USE AREA +<UE1D7> \xF2\xA0 |0 # PRIVATE USE AREA +<UE1D8> \xF2\xA1 |0 # PRIVATE USE AREA +<UE1D9> \xF2\xA2 |0 # PRIVATE USE AREA +<UE1DA> \xF2\xA3 |0 # PRIVATE USE AREA +<UE1DB> \xF2\xA4 |0 # PRIVATE USE AREA +<UE1DC> \xF2\xA5 |0 # PRIVATE USE AREA +<UE1DD> \xF2\xA6 |0 # PRIVATE USE AREA +<UE1DE> \xF2\xA7 |0 # PRIVATE USE AREA +<UE1DF> \xF2\xA8 |0 # PRIVATE USE AREA +<UE1E0> \xF2\xA9 |0 # PRIVATE USE AREA +<UE1E1> \xF2\xAA |0 # PRIVATE USE AREA +<UE1E2> \xF2\xAB |0 # PRIVATE USE AREA +<UE1E3> \xF2\xAC |0 # PRIVATE USE AREA +<UE1E4> \xF2\xAD |0 # PRIVATE USE AREA +<UE1E5> \xF2\xAE |0 # PRIVATE USE AREA +<UE1E6> \xF2\xAF |0 # PRIVATE USE AREA +<UE1E7> \xF2\xB0 |0 # PRIVATE USE AREA +<UE1E8> \xF2\xB1 |0 # PRIVATE USE AREA +<UE1E9> \xF2\xB2 |0 # PRIVATE USE AREA +<UE1EA> \xF2\xB3 |0 # PRIVATE USE AREA +<UE1EB> \xF2\xB4 |0 # PRIVATE USE AREA +<UE1EC> \xF2\xB5 |0 # PRIVATE USE AREA +<UE1ED> \xF2\xB6 |0 # PRIVATE USE AREA +<UE1EE> \xF2\xB7 |0 # PRIVATE USE AREA +<UE1EF> \xF2\xB8 |0 # PRIVATE USE AREA +<UE1F0> \xF2\xB9 |0 # PRIVATE USE AREA +<UE1F1> \xF2\xBA |0 # PRIVATE USE AREA +<UE1F2> \xF2\xBB |0 # PRIVATE USE AREA +<UE1F3> \xF2\xBC |0 # PRIVATE USE AREA +<UE1F4> \xF2\xBD |0 # PRIVATE USE AREA +<UE1F5> \xF2\xBE |0 # PRIVATE USE AREA +<UE1F6> \xF2\xBF |0 # PRIVATE USE AREA +<UE1F7> \xF2\xC0 |0 # PRIVATE USE AREA +<UE1F8> \xF2\xC1 |0 # PRIVATE USE AREA +<UE1F9> \xF2\xC2 |0 # PRIVATE USE AREA +<UE1FA> \xF2\xC3 |0 # PRIVATE USE AREA +<UE1FB> \xF2\xC4 |0 # PRIVATE USE AREA +<UE1FC> \xF2\xC5 |0 # PRIVATE USE AREA +<UE1FD> \xF2\xC6 |0 # PRIVATE USE AREA +<UE1FE> \xF2\xC7 |0 # PRIVATE USE AREA +<UE1FF> \xF2\xC8 |0 # PRIVATE USE AREA +<UE200> \xF2\xC9 |0 # PRIVATE USE AREA +<UE201> \xF2\xCA |0 # PRIVATE USE AREA +<UE202> \xF2\xCB |0 # PRIVATE USE AREA +<UE203> \xF2\xCC |0 # PRIVATE USE AREA +<UE204> \xF2\xCD |0 # PRIVATE USE AREA +<UE205> \xF2\xCE |0 # PRIVATE USE AREA +<UE206> \xF2\xCF |0 # PRIVATE USE AREA +<UE207> \xF2\xD0 |0 # PRIVATE USE AREA +<UE208> \xF2\xD1 |0 # PRIVATE USE AREA +<UE209> \xF2\xD2 |0 # PRIVATE USE AREA +<UE20A> \xF2\xD3 |0 # PRIVATE USE AREA +<UE20B> \xF2\xD4 |0 # PRIVATE USE AREA +<UE20C> \xF2\xD5 |0 # PRIVATE USE AREA +<UE20D> \xF2\xD6 |0 # PRIVATE USE AREA +<UE20E> \xF2\xD7 |0 # PRIVATE USE AREA +<UE20F> \xF2\xD8 |0 # PRIVATE USE AREA +<UE210> \xF2\xD9 |0 # PRIVATE USE AREA +<UE211> \xF2\xDA |0 # PRIVATE USE AREA +<UE212> \xF2\xDB |0 # PRIVATE USE AREA +<UE213> \xF2\xDC |0 # PRIVATE USE AREA +<UE214> \xF2\xDD |0 # PRIVATE USE AREA +<UE215> \xF2\xDE |0 # PRIVATE USE AREA +<UE216> \xF2\xDF |0 # PRIVATE USE AREA +<UE217> \xF2\xE0 |0 # PRIVATE USE AREA +<UE218> \xF2\xE1 |0 # PRIVATE USE AREA +<UE219> \xF2\xE2 |0 # PRIVATE USE AREA +<UE21A> \xF2\xE3 |0 # PRIVATE USE AREA +<UE21B> \xF2\xE4 |0 # PRIVATE USE AREA +<UE21C> \xF2\xE5 |0 # PRIVATE USE AREA +<UE21D> \xF2\xE6 |0 # PRIVATE USE AREA +<UE21E> \xF2\xE7 |0 # PRIVATE USE AREA +<UE21F> \xF2\xE8 |0 # PRIVATE USE AREA +<UE220> \xF2\xE9 |0 # PRIVATE USE AREA +<UE221> \xF2\xEA |0 # PRIVATE USE AREA +<UE222> \xF2\xEB |0 # PRIVATE USE AREA +<UE223> \xF2\xEC |0 # PRIVATE USE AREA +<UE224> \xF2\xED |0 # PRIVATE USE AREA +<UE225> \xF2\xEE |0 # PRIVATE USE AREA +<UE226> \xF2\xEF |0 # PRIVATE USE AREA +<UE227> \xF2\xF0 |0 # PRIVATE USE AREA +<UE228> \xF2\xF1 |0 # PRIVATE USE AREA +<UE229> \xF2\xF2 |0 # PRIVATE USE AREA +<UE22A> \xF2\xF3 |0 # PRIVATE USE AREA +<UE22B> \xF2\xF4 |0 # PRIVATE USE AREA +<UE22C> \xF2\xF5 |0 # PRIVATE USE AREA +<UE22D> \xF2\xF6 |0 # PRIVATE USE AREA +<UE22E> \xF2\xF7 |0 # PRIVATE USE AREA +<UE22F> \xF2\xF8 |0 # PRIVATE USE AREA +<UE230> \xF2\xF9 |0 # PRIVATE USE AREA +<UE231> \xF2\xFA |0 # PRIVATE USE AREA +<UE232> \xF2\xFB |0 # PRIVATE USE AREA +<UE233> \xF2\xFC |0 # PRIVATE USE AREA +<UE234> \xF3\x40 |0 # PRIVATE USE AREA +<UE235> \xF3\x41 |0 # PRIVATE USE AREA +<UE236> \xF3\x42 |0 # PRIVATE USE AREA +<UE237> \xF3\x43 |0 # PRIVATE USE AREA +<UE238> \xF3\x44 |0 # PRIVATE USE AREA +<UE239> \xF3\x45 |0 # PRIVATE USE AREA +<UE23A> \xF3\x46 |0 # PRIVATE USE AREA +<UE23B> \xF3\x47 |0 # PRIVATE USE AREA +<UE23C> \xF3\x48 |0 # PRIVATE USE AREA +<UE23D> \xF3\x49 |0 # PRIVATE USE AREA +<UE23E> \xF3\x4A |0 # PRIVATE USE AREA +<UE23F> \xF3\x4B |0 # PRIVATE USE AREA +<UE240> \xF3\x4C |0 # PRIVATE USE AREA +<UE241> \xF3\x4D |0 # PRIVATE USE AREA +<UE242> \xF3\x4E |0 # PRIVATE USE AREA +<UE243> \xF3\x4F |0 # PRIVATE USE AREA +<UE244> \xF3\x50 |0 # PRIVATE USE AREA +<UE245> \xF3\x51 |0 # PRIVATE USE AREA +<UE246> \xF3\x52 |0 # PRIVATE USE AREA +<UE247> \xF3\x53 |0 # PRIVATE USE AREA +<UE248> \xF3\x54 |0 # PRIVATE USE AREA +<UE249> \xF3\x55 |0 # PRIVATE USE AREA +<UE24A> \xF3\x56 |0 # PRIVATE USE AREA +<UE24B> \xF3\x57 |0 # PRIVATE USE AREA +<UE24C> \xF3\x58 |0 # PRIVATE USE AREA +<UE24D> \xF3\x59 |0 # PRIVATE USE AREA +<UE24E> \xF3\x5A |0 # PRIVATE USE AREA +<UE24F> \xF3\x5B |0 # PRIVATE USE AREA +<UE250> \xF3\x5C |0 # PRIVATE USE AREA +<UE251> \xF3\x5D |0 # PRIVATE USE AREA +<UE252> \xF3\x5E |0 # PRIVATE USE AREA +<UE253> \xF3\x5F |0 # PRIVATE USE AREA +<UE254> \xF3\x60 |0 # PRIVATE USE AREA +<UE255> \xF3\x61 |0 # PRIVATE USE AREA +<UE256> \xF3\x62 |0 # PRIVATE USE AREA +<UE257> \xF3\x63 |0 # PRIVATE USE AREA +<UE258> \xF3\x64 |0 # PRIVATE USE AREA +<UE259> \xF3\x65 |0 # PRIVATE USE AREA +<UE25A> \xF3\x66 |0 # PRIVATE USE AREA +<UE25B> \xF3\x67 |0 # PRIVATE USE AREA +<UE25C> \xF3\x68 |0 # PRIVATE USE AREA +<UE25D> \xF3\x69 |0 # PRIVATE USE AREA +<UE25E> \xF3\x6A |0 # PRIVATE USE AREA +<UE25F> \xF3\x6B |0 # PRIVATE USE AREA +<UE260> \xF3\x6C |0 # PRIVATE USE AREA +<UE261> \xF3\x6D |0 # PRIVATE USE AREA +<UE262> \xF3\x6E |0 # PRIVATE USE AREA +<UE263> \xF3\x6F |0 # PRIVATE USE AREA +<UE264> \xF3\x70 |0 # PRIVATE USE AREA +<UE265> \xF3\x71 |0 # PRIVATE USE AREA +<UE266> \xF3\x72 |0 # PRIVATE USE AREA +<UE267> \xF3\x73 |0 # PRIVATE USE AREA +<UE268> \xF3\x74 |0 # PRIVATE USE AREA +<UE269> \xF3\x75 |0 # PRIVATE USE AREA +<UE26A> \xF3\x76 |0 # PRIVATE USE AREA +<UE26B> \xF3\x77 |0 # PRIVATE USE AREA +<UE26C> \xF3\x78 |0 # PRIVATE USE AREA +<UE26D> \xF3\x79 |0 # PRIVATE USE AREA +<UE26E> \xF3\x7A |0 # PRIVATE USE AREA +<UE26F> \xF3\x7B |0 # PRIVATE USE AREA +<UE270> \xF3\x7C |0 # PRIVATE USE AREA +<UE271> \xF3\x7D |0 # PRIVATE USE AREA +<UE272> \xF3\x7E |0 # PRIVATE USE AREA +<UE273> \xF3\x80 |0 # PRIVATE USE AREA +<UE274> \xF3\x81 |0 # PRIVATE USE AREA +<UE275> \xF3\x82 |0 # PRIVATE USE AREA +<UE276> \xF3\x83 |0 # PRIVATE USE AREA +<UE277> \xF3\x84 |0 # PRIVATE USE AREA +<UE278> \xF3\x85 |0 # PRIVATE USE AREA +<UE279> \xF3\x86 |0 # PRIVATE USE AREA +<UE27A> \xF3\x87 |0 # PRIVATE USE AREA +<UE27B> \xF3\x88 |0 # PRIVATE USE AREA +<UE27C> \xF3\x89 |0 # PRIVATE USE AREA +<UE27D> \xF3\x8A |0 # PRIVATE USE AREA +<UE27E> \xF3\x8B |0 # PRIVATE USE AREA +<UE27F> \xF3\x8C |0 # PRIVATE USE AREA +<UE280> \xF3\x8D |0 # PRIVATE USE AREA +<UE281> \xF3\x8E |0 # PRIVATE USE AREA +<UE282> \xF3\x8F |0 # PRIVATE USE AREA +<UE283> \xF3\x90 |0 # PRIVATE USE AREA +<UE284> \xF3\x91 |0 # PRIVATE USE AREA +<UE285> \xF3\x92 |0 # PRIVATE USE AREA +<UE286> \xF3\x93 |0 # PRIVATE USE AREA +<UE287> \xF3\x94 |0 # PRIVATE USE AREA +<UE288> \xF3\x95 |0 # PRIVATE USE AREA +<UE289> \xF3\x96 |0 # PRIVATE USE AREA +<UE28A> \xF3\x97 |0 # PRIVATE USE AREA +<UE28B> \xF3\x98 |0 # PRIVATE USE AREA +<UE28C> \xF3\x99 |0 # PRIVATE USE AREA +<UE28D> \xF3\x9A |0 # PRIVATE USE AREA +<UE28E> \xF3\x9B |0 # PRIVATE USE AREA +<UE28F> \xF3\x9C |0 # PRIVATE USE AREA +<UE290> \xF3\x9D |0 # PRIVATE USE AREA +<UE291> \xF3\x9E |0 # PRIVATE USE AREA +<UE292> \xF3\x9F |0 # PRIVATE USE AREA +<UE293> \xF3\xA0 |0 # PRIVATE USE AREA +<UE294> \xF3\xA1 |0 # PRIVATE USE AREA +<UE295> \xF3\xA2 |0 # PRIVATE USE AREA +<UE296> \xF3\xA3 |0 # PRIVATE USE AREA +<UE297> \xF3\xA4 |0 # PRIVATE USE AREA +<UE298> \xF3\xA5 |0 # PRIVATE USE AREA +<UE299> \xF3\xA6 |0 # PRIVATE USE AREA +<UE29A> \xF3\xA7 |0 # PRIVATE USE AREA +<UE29B> \xF3\xA8 |0 # PRIVATE USE AREA +<UE29C> \xF3\xA9 |0 # PRIVATE USE AREA +<UE29D> \xF3\xAA |0 # PRIVATE USE AREA +<UE29E> \xF3\xAB |0 # PRIVATE USE AREA +<UE29F> \xF3\xAC |0 # PRIVATE USE AREA +<UE2A0> \xF3\xAD |0 # PRIVATE USE AREA +<UE2A1> \xF3\xAE |0 # PRIVATE USE AREA +<UE2A2> \xF3\xAF |0 # PRIVATE USE AREA +<UE2A3> \xF3\xB0 |0 # PRIVATE USE AREA +<UE2A4> \xF3\xB1 |0 # PRIVATE USE AREA +<UE2A5> \xF3\xB2 |0 # PRIVATE USE AREA +<UE2A6> \xF3\xB3 |0 # PRIVATE USE AREA +<UE2A7> \xF3\xB4 |0 # PRIVATE USE AREA +<UE2A8> \xF3\xB5 |0 # PRIVATE USE AREA +<UE2A9> \xF3\xB6 |0 # PRIVATE USE AREA +<UE2AA> \xF3\xB7 |0 # PRIVATE USE AREA +<UE2AB> \xF3\xB8 |0 # PRIVATE USE AREA +<UE2AC> \xF3\xB9 |0 # PRIVATE USE AREA +<UE2AD> \xF3\xBA |0 # PRIVATE USE AREA +<UE2AE> \xF3\xBB |0 # PRIVATE USE AREA +<UE2AF> \xF3\xBC |0 # PRIVATE USE AREA +<UE2B0> \xF3\xBD |0 # PRIVATE USE AREA +<UE2B1> \xF3\xBE |0 # PRIVATE USE AREA +<UE2B2> \xF3\xBF |0 # PRIVATE USE AREA +<UE2B3> \xF3\xC0 |0 # PRIVATE USE AREA +<UE2B4> \xF3\xC1 |0 # PRIVATE USE AREA +<UE2B5> \xF3\xC2 |0 # PRIVATE USE AREA +<UE2B6> \xF3\xC3 |0 # PRIVATE USE AREA +<UE2B7> \xF3\xC4 |0 # PRIVATE USE AREA +<UE2B8> \xF3\xC5 |0 # PRIVATE USE AREA +<UE2B9> \xF3\xC6 |0 # PRIVATE USE AREA +<UE2BA> \xF3\xC7 |0 # PRIVATE USE AREA +<UE2BB> \xF3\xC8 |0 # PRIVATE USE AREA +<UE2BC> \xF3\xC9 |0 # PRIVATE USE AREA +<UE2BD> \xF3\xCA |0 # PRIVATE USE AREA +<UE2BE> \xF3\xCB |0 # PRIVATE USE AREA +<UE2BF> \xF3\xCC |0 # PRIVATE USE AREA +<UE2C0> \xF3\xCD |0 # PRIVATE USE AREA +<UE2C1> \xF3\xCE |0 # PRIVATE USE AREA +<UE2C2> \xF3\xCF |0 # PRIVATE USE AREA +<UE2C3> \xF3\xD0 |0 # PRIVATE USE AREA +<UE2C4> \xF3\xD1 |0 # PRIVATE USE AREA +<UE2C5> \xF3\xD2 |0 # PRIVATE USE AREA +<UE2C6> \xF3\xD3 |0 # PRIVATE USE AREA +<UE2C7> \xF3\xD4 |0 # PRIVATE USE AREA +<UE2C8> \xF3\xD5 |0 # PRIVATE USE AREA +<UE2C9> \xF3\xD6 |0 # PRIVATE USE AREA +<UE2CA> \xF3\xD7 |0 # PRIVATE USE AREA +<UE2CB> \xF3\xD8 |0 # PRIVATE USE AREA +<UE2CC> \xF3\xD9 |0 # PRIVATE USE AREA +<UE2CD> \xF3\xDA |0 # PRIVATE USE AREA +<UE2CE> \xF3\xDB |0 # PRIVATE USE AREA +<UE2CF> \xF3\xDC |0 # PRIVATE USE AREA +<UE2D0> \xF3\xDD |0 # PRIVATE USE AREA +<UE2D1> \xF3\xDE |0 # PRIVATE USE AREA +<UE2D2> \xF3\xDF |0 # PRIVATE USE AREA +<UE2D3> \xF3\xE0 |0 # PRIVATE USE AREA +<UE2D4> \xF3\xE1 |0 # PRIVATE USE AREA +<UE2D5> \xF3\xE2 |0 # PRIVATE USE AREA +<UE2D6> \xF3\xE3 |0 # PRIVATE USE AREA +<UE2D7> \xF3\xE4 |0 # PRIVATE USE AREA +<UE2D8> \xF3\xE5 |0 # PRIVATE USE AREA +<UE2D9> \xF3\xE6 |0 # PRIVATE USE AREA +<UE2DA> \xF3\xE7 |0 # PRIVATE USE AREA +<UE2DB> \xF3\xE8 |0 # PRIVATE USE AREA +<UE2DC> \xF3\xE9 |0 # PRIVATE USE AREA +<UE2DD> \xF3\xEA |0 # PRIVATE USE AREA +<UE2DE> \xF3\xEB |0 # PRIVATE USE AREA +<UE2DF> \xF3\xEC |0 # PRIVATE USE AREA +<UE2E0> \xF3\xED |0 # PRIVATE USE AREA +<UE2E1> \xF3\xEE |0 # PRIVATE USE AREA +<UE2E2> \xF3\xEF |0 # PRIVATE USE AREA +<UE2E3> \xF3\xF0 |0 # PRIVATE USE AREA +<UE2E4> \xF3\xF1 |0 # PRIVATE USE AREA +<UE2E5> \xF3\xF2 |0 # PRIVATE USE AREA +<UE2E6> \xF3\xF3 |0 # PRIVATE USE AREA +<UE2E7> \xF3\xF4 |0 # PRIVATE USE AREA +<UE2E8> \xF3\xF5 |0 # PRIVATE USE AREA +<UE2E9> \xF3\xF6 |0 # PRIVATE USE AREA +<UE2EA> \xF3\xF7 |0 # PRIVATE USE AREA +<UE2EB> \xF3\xF8 |0 # PRIVATE USE AREA +<UE2EC> \xF3\xF9 |0 # PRIVATE USE AREA +<UE2ED> \xF3\xFA |0 # PRIVATE USE AREA +<UE2EE> \xF3\xFB |0 # PRIVATE USE AREA +<UE2EF> \xF3\xFC |0 # PRIVATE USE AREA +<UE2F0> \xF4\x40 |0 # PRIVATE USE AREA +<UE2F1> \xF4\x41 |0 # PRIVATE USE AREA +<UE2F2> \xF4\x42 |0 # PRIVATE USE AREA +<UE2F3> \xF4\x43 |0 # PRIVATE USE AREA +<UE2F4> \xF4\x44 |0 # PRIVATE USE AREA +<UE2F5> \xF4\x45 |0 # PRIVATE USE AREA +<UE2F6> \xF4\x46 |0 # PRIVATE USE AREA +<UE2F7> \xF4\x47 |0 # PRIVATE USE AREA +<UE2F8> \xF4\x48 |0 # PRIVATE USE AREA +<UE2F9> \xF4\x49 |0 # PRIVATE USE AREA +<UE2FA> \xF4\x4A |0 # PRIVATE USE AREA +<UE2FB> \xF4\x4B |0 # PRIVATE USE AREA +<UE2FC> \xF4\x4C |0 # PRIVATE USE AREA +<UE2FD> \xF4\x4D |0 # PRIVATE USE AREA +<UE2FE> \xF4\x4E |0 # PRIVATE USE AREA +<UE2FF> \xF4\x4F |0 # PRIVATE USE AREA +<UE300> \xF4\x50 |0 # PRIVATE USE AREA +<UE301> \xF4\x51 |0 # PRIVATE USE AREA +<UE302> \xF4\x52 |0 # PRIVATE USE AREA +<UE303> \xF4\x53 |0 # PRIVATE USE AREA +<UE304> \xF4\x54 |0 # PRIVATE USE AREA +<UE305> \xF4\x55 |0 # PRIVATE USE AREA +<UE306> \xF4\x56 |0 # PRIVATE USE AREA +<UE307> \xF4\x57 |0 # PRIVATE USE AREA +<UE308> \xF4\x58 |0 # PRIVATE USE AREA +<UE309> \xF4\x59 |0 # PRIVATE USE AREA +<UE30A> \xF4\x5A |0 # PRIVATE USE AREA +<UE30B> \xF4\x5B |0 # PRIVATE USE AREA +<UE30C> \xF4\x5C |0 # PRIVATE USE AREA +<UE30D> \xF4\x5D |0 # PRIVATE USE AREA +<UE30E> \xF4\x5E |0 # PRIVATE USE AREA +<UE30F> \xF4\x5F |0 # PRIVATE USE AREA +<UE310> \xF4\x60 |0 # PRIVATE USE AREA +<UE311> \xF4\x61 |0 # PRIVATE USE AREA +<UE312> \xF4\x62 |0 # PRIVATE USE AREA +<UE313> \xF4\x63 |0 # PRIVATE USE AREA +<UE314> \xF4\x64 |0 # PRIVATE USE AREA +<UE315> \xF4\x65 |0 # PRIVATE USE AREA +<UE316> \xF4\x66 |0 # PRIVATE USE AREA +<UE317> \xF4\x67 |0 # PRIVATE USE AREA +<UE318> \xF4\x68 |0 # PRIVATE USE AREA +<UE319> \xF4\x69 |0 # PRIVATE USE AREA +<UE31A> \xF4\x6A |0 # PRIVATE USE AREA +<UE31B> \xF4\x6B |0 # PRIVATE USE AREA +<UE31C> \xF4\x6C |0 # PRIVATE USE AREA +<UE31D> \xF4\x6D |0 # PRIVATE USE AREA +<UE31E> \xF4\x6E |0 # PRIVATE USE AREA +<UE31F> \xF4\x6F |0 # PRIVATE USE AREA +<UE320> \xF4\x70 |0 # PRIVATE USE AREA +<UE321> \xF4\x71 |0 # PRIVATE USE AREA +<UE322> \xF4\x72 |0 # PRIVATE USE AREA +<UE323> \xF4\x73 |0 # PRIVATE USE AREA +<UE324> \xF4\x74 |0 # PRIVATE USE AREA +<UE325> \xF4\x75 |0 # PRIVATE USE AREA +<UE326> \xF4\x76 |0 # PRIVATE USE AREA +<UE327> \xF4\x77 |0 # PRIVATE USE AREA +<UE328> \xF4\x78 |0 # PRIVATE USE AREA +<UE329> \xF4\x79 |0 # PRIVATE USE AREA +<UE32A> \xF4\x7A |0 # PRIVATE USE AREA +<UE32B> \xF4\x7B |0 # PRIVATE USE AREA +<UE32C> \xF4\x7C |0 # PRIVATE USE AREA +<UE32D> \xF4\x7D |0 # PRIVATE USE AREA +<UE32E> \xF4\x7E |0 # PRIVATE USE AREA +<UE32F> \xF4\x80 |0 # PRIVATE USE AREA +<UE330> \xF4\x81 |0 # PRIVATE USE AREA +<UE331> \xF4\x82 |0 # PRIVATE USE AREA +<UE332> \xF4\x83 |0 # PRIVATE USE AREA +<UE333> \xF4\x84 |0 # PRIVATE USE AREA +<UE334> \xF4\x85 |0 # PRIVATE USE AREA +<UE335> \xF4\x86 |0 # PRIVATE USE AREA +<UE336> \xF4\x87 |0 # PRIVATE USE AREA +<UE337> \xF4\x88 |0 # PRIVATE USE AREA +<UE338> \xF4\x89 |0 # PRIVATE USE AREA +<UE339> \xF4\x8A |0 # PRIVATE USE AREA +<UE33A> \xF4\x8B |0 # PRIVATE USE AREA +<UE33B> \xF4\x8C |0 # PRIVATE USE AREA +<UE33C> \xF4\x8D |0 # PRIVATE USE AREA +<UE33D> \xF4\x8E |0 # PRIVATE USE AREA +<UE33E> \xF4\x8F |0 # PRIVATE USE AREA +<UE33F> \xF4\x90 |0 # PRIVATE USE AREA +<UE340> \xF4\x91 |0 # PRIVATE USE AREA +<UE341> \xF4\x92 |0 # PRIVATE USE AREA +<UE342> \xF4\x93 |0 # PRIVATE USE AREA +<UE343> \xF4\x94 |0 # PRIVATE USE AREA +<UE344> \xF4\x95 |0 # PRIVATE USE AREA +<UE345> \xF4\x96 |0 # PRIVATE USE AREA +<UE346> \xF4\x97 |0 # PRIVATE USE AREA +<UE347> \xF4\x98 |0 # PRIVATE USE AREA +<UE348> \xF4\x99 |0 # PRIVATE USE AREA +<UE349> \xF4\x9A |0 # PRIVATE USE AREA +<UE34A> \xF4\x9B |0 # PRIVATE USE AREA +<UE34B> \xF4\x9C |0 # PRIVATE USE AREA +<UE34C> \xF4\x9D |0 # PRIVATE USE AREA +<UE34D> \xF4\x9E |0 # PRIVATE USE AREA +<UE34E> \xF4\x9F |0 # PRIVATE USE AREA +<UE34F> \xF4\xA0 |0 # PRIVATE USE AREA +<UE350> \xF4\xA1 |0 # PRIVATE USE AREA +<UE351> \xF4\xA2 |0 # PRIVATE USE AREA +<UE352> \xF4\xA3 |0 # PRIVATE USE AREA +<UE353> \xF4\xA4 |0 # PRIVATE USE AREA +<UE354> \xF4\xA5 |0 # PRIVATE USE AREA +<UE355> \xF4\xA6 |0 # PRIVATE USE AREA +<UE356> \xF4\xA7 |0 # PRIVATE USE AREA +<UE357> \xF4\xA8 |0 # PRIVATE USE AREA +<UE358> \xF4\xA9 |0 # PRIVATE USE AREA +<UE359> \xF4\xAA |0 # PRIVATE USE AREA +<UE35A> \xF4\xAB |0 # PRIVATE USE AREA +<UE35B> \xF4\xAC |0 # PRIVATE USE AREA +<UE35C> \xF4\xAD |0 # PRIVATE USE AREA +<UE35D> \xF4\xAE |0 # PRIVATE USE AREA +<UE35E> \xF4\xAF |0 # PRIVATE USE AREA +<UE35F> \xF4\xB0 |0 # PRIVATE USE AREA +<UE360> \xF4\xB1 |0 # PRIVATE USE AREA +<UE361> \xF4\xB2 |0 # PRIVATE USE AREA +<UE362> \xF4\xB3 |0 # PRIVATE USE AREA +<UE363> \xF4\xB4 |0 # PRIVATE USE AREA +<UE364> \xF4\xB5 |0 # PRIVATE USE AREA +<UE365> \xF4\xB6 |0 # PRIVATE USE AREA +<UE366> \xF4\xB7 |0 # PRIVATE USE AREA +<UE367> \xF4\xB8 |0 # PRIVATE USE AREA +<UE368> \xF4\xB9 |0 # PRIVATE USE AREA +<UE369> \xF4\xBA |0 # PRIVATE USE AREA +<UE36A> \xF4\xBB |0 # PRIVATE USE AREA +<UE36B> \xF4\xBC |0 # PRIVATE USE AREA +<UE36C> \xF4\xBD |0 # PRIVATE USE AREA +<UE36D> \xF4\xBE |0 # PRIVATE USE AREA +<UE36E> \xF4\xBF |0 # PRIVATE USE AREA +<UE36F> \xF4\xC0 |0 # PRIVATE USE AREA +<UE370> \xF4\xC1 |0 # PRIVATE USE AREA +<UE371> \xF4\xC2 |0 # PRIVATE USE AREA +<UE372> \xF4\xC3 |0 # PRIVATE USE AREA +<UE373> \xF4\xC4 |0 # PRIVATE USE AREA +<UE374> \xF4\xC5 |0 # PRIVATE USE AREA +<UE375> \xF4\xC6 |0 # PRIVATE USE AREA +<UE376> \xF4\xC7 |0 # PRIVATE USE AREA +<UE377> \xF4\xC8 |0 # PRIVATE USE AREA +<UE378> \xF4\xC9 |0 # PRIVATE USE AREA +<UE379> \xF4\xCA |0 # PRIVATE USE AREA +<UE37A> \xF4\xCB |0 # PRIVATE USE AREA +<UE37B> \xF4\xCC |0 # PRIVATE USE AREA +<UE37C> \xF4\xCD |0 # PRIVATE USE AREA +<UE37D> \xF4\xCE |0 # PRIVATE USE AREA +<UE37E> \xF4\xCF |0 # PRIVATE USE AREA +<UE37F> \xF4\xD0 |0 # PRIVATE USE AREA +<UE380> \xF4\xD1 |0 # PRIVATE USE AREA +<UE381> \xF4\xD2 |0 # PRIVATE USE AREA +<UE382> \xF4\xD3 |0 # PRIVATE USE AREA +<UE383> \xF4\xD4 |0 # PRIVATE USE AREA +<UE384> \xF4\xD5 |0 # PRIVATE USE AREA +<UE385> \xF4\xD6 |0 # PRIVATE USE AREA +<UE386> \xF4\xD7 |0 # PRIVATE USE AREA +<UE387> \xF4\xD8 |0 # PRIVATE USE AREA +<UE388> \xF4\xD9 |0 # PRIVATE USE AREA +<UE389> \xF4\xDA |0 # PRIVATE USE AREA +<UE38A> \xF4\xDB |0 # PRIVATE USE AREA +<UE38B> \xF4\xDC |0 # PRIVATE USE AREA +<UE38C> \xF4\xDD |0 # PRIVATE USE AREA +<UE38D> \xF4\xDE |0 # PRIVATE USE AREA +<UE38E> \xF4\xDF |0 # PRIVATE USE AREA +<UE38F> \xF4\xE0 |0 # PRIVATE USE AREA +<UE390> \xF4\xE1 |0 # PRIVATE USE AREA +<UE391> \xF4\xE2 |0 # PRIVATE USE AREA +<UE392> \xF4\xE3 |0 # PRIVATE USE AREA +<UE393> \xF4\xE4 |0 # PRIVATE USE AREA +<UE394> \xF4\xE5 |0 # PRIVATE USE AREA +<UE395> \xF4\xE6 |0 # PRIVATE USE AREA +<UE396> \xF4\xE7 |0 # PRIVATE USE AREA +<UE397> \xF4\xE8 |0 # PRIVATE USE AREA +<UE398> \xF4\xE9 |0 # PRIVATE USE AREA +<UE399> \xF4\xEA |0 # PRIVATE USE AREA +<UE39A> \xF4\xEB |0 # PRIVATE USE AREA +<UE39B> \xF4\xEC |0 # PRIVATE USE AREA +<UE39C> \xF4\xED |0 # PRIVATE USE AREA +<UE39D> \xF4\xEE |0 # PRIVATE USE AREA +<UE39E> \xF4\xEF |0 # PRIVATE USE AREA +<UE39F> \xF4\xF0 |0 # PRIVATE USE AREA +<UE3A0> \xF4\xF1 |0 # PRIVATE USE AREA +<UE3A1> \xF4\xF2 |0 # PRIVATE USE AREA +<UE3A2> \xF4\xF3 |0 # PRIVATE USE AREA +<UE3A3> \xF4\xF4 |0 # PRIVATE USE AREA +<UE3A4> \xF4\xF5 |0 # PRIVATE USE AREA +<UE3A5> \xF4\xF6 |0 # PRIVATE USE AREA +<UE3A6> \xF4\xF7 |0 # PRIVATE USE AREA +<UE3A7> \xF4\xF8 |0 # PRIVATE USE AREA +<UE3A8> \xF4\xF9 |0 # PRIVATE USE AREA +<UE3A9> \xF4\xFA |0 # PRIVATE USE AREA +<UE3AA> \xF4\xFB |0 # PRIVATE USE AREA +<UE3AB> \xF4\xFC |0 # PRIVATE USE AREA +<UE3AC> \xF5\x40 |0 # PRIVATE USE AREA +<UE3AD> \xF5\x41 |0 # PRIVATE USE AREA +<UE3AE> \xF5\x42 |0 # PRIVATE USE AREA +<UE3AF> \xF5\x43 |0 # PRIVATE USE AREA +<UE3B0> \xF5\x44 |0 # PRIVATE USE AREA +<UE3B1> \xF5\x45 |0 # PRIVATE USE AREA +<UE3B2> \xF5\x46 |0 # PRIVATE USE AREA +<UE3B3> \xF5\x47 |0 # PRIVATE USE AREA +<UE3B4> \xF5\x48 |0 # PRIVATE USE AREA +<UE3B5> \xF5\x49 |0 # PRIVATE USE AREA +<UE3B6> \xF5\x4A |0 # PRIVATE USE AREA +<UE3B7> \xF5\x4B |0 # PRIVATE USE AREA +<UE3B8> \xF5\x4C |0 # PRIVATE USE AREA +<UE3B9> \xF5\x4D |0 # PRIVATE USE AREA +<UE3BA> \xF5\x4E |0 # PRIVATE USE AREA +<UE3BB> \xF5\x4F |0 # PRIVATE USE AREA +<UE3BC> \xF5\x50 |0 # PRIVATE USE AREA +<UE3BD> \xF5\x51 |0 # PRIVATE USE AREA +<UE3BE> \xF5\x52 |0 # PRIVATE USE AREA +<UE3BF> \xF5\x53 |0 # PRIVATE USE AREA +<UE3C0> \xF5\x54 |0 # PRIVATE USE AREA +<UE3C1> \xF5\x55 |0 # PRIVATE USE AREA +<UE3C2> \xF5\x56 |0 # PRIVATE USE AREA +<UE3C3> \xF5\x57 |0 # PRIVATE USE AREA +<UE3C4> \xF5\x58 |0 # PRIVATE USE AREA +<UE3C5> \xF5\x59 |0 # PRIVATE USE AREA +<UE3C6> \xF5\x5A |0 # PRIVATE USE AREA +<UE3C7> \xF5\x5B |0 # PRIVATE USE AREA +<UE3C8> \xF5\x5C |0 # PRIVATE USE AREA +<UE3C9> \xF5\x5D |0 # PRIVATE USE AREA +<UE3CA> \xF5\x5E |0 # PRIVATE USE AREA +<UE3CB> \xF5\x5F |0 # PRIVATE USE AREA +<UE3CC> \xF5\x60 |0 # PRIVATE USE AREA +<UE3CD> \xF5\x61 |0 # PRIVATE USE AREA +<UE3CE> \xF5\x62 |0 # PRIVATE USE AREA +<UE3CF> \xF5\x63 |0 # PRIVATE USE AREA +<UE3D0> \xF5\x64 |0 # PRIVATE USE AREA +<UE3D1> \xF5\x65 |0 # PRIVATE USE AREA +<UE3D2> \xF5\x66 |0 # PRIVATE USE AREA +<UE3D3> \xF5\x67 |0 # PRIVATE USE AREA +<UE3D4> \xF5\x68 |0 # PRIVATE USE AREA +<UE3D5> \xF5\x69 |0 # PRIVATE USE AREA +<UE3D6> \xF5\x6A |0 # PRIVATE USE AREA +<UE3D7> \xF5\x6B |0 # PRIVATE USE AREA +<UE3D8> \xF5\x6C |0 # PRIVATE USE AREA +<UE3D9> \xF5\x6D |0 # PRIVATE USE AREA +<UE3DA> \xF5\x6E |0 # PRIVATE USE AREA +<UE3DB> \xF5\x6F |0 # PRIVATE USE AREA +<UE3DC> \xF5\x70 |0 # PRIVATE USE AREA +<UE3DD> \xF5\x71 |0 # PRIVATE USE AREA +<UE3DE> \xF5\x72 |0 # PRIVATE USE AREA +<UE3DF> \xF5\x73 |0 # PRIVATE USE AREA +<UE3E0> \xF5\x74 |0 # PRIVATE USE AREA +<UE3E1> \xF5\x75 |0 # PRIVATE USE AREA +<UE3E2> \xF5\x76 |0 # PRIVATE USE AREA +<UE3E3> \xF5\x77 |0 # PRIVATE USE AREA +<UE3E4> \xF5\x78 |0 # PRIVATE USE AREA +<UE3E5> \xF5\x79 |0 # PRIVATE USE AREA +<UE3E6> \xF5\x7A |0 # PRIVATE USE AREA +<UE3E7> \xF5\x7B |0 # PRIVATE USE AREA +<UE3E8> \xF5\x7C |0 # PRIVATE USE AREA +<UE3E9> \xF5\x7D |0 # PRIVATE USE AREA +<UE3EA> \xF5\x7E |0 # PRIVATE USE AREA +<UE3EB> \xF5\x80 |0 # PRIVATE USE AREA +<UE3EC> \xF5\x81 |0 # PRIVATE USE AREA +<UE3ED> \xF5\x82 |0 # PRIVATE USE AREA +<UE3EE> \xF5\x83 |0 # PRIVATE USE AREA +<UE3EF> \xF5\x84 |0 # PRIVATE USE AREA +<UE3F0> \xF5\x85 |0 # PRIVATE USE AREA +<UE3F1> \xF5\x86 |0 # PRIVATE USE AREA +<UE3F2> \xF5\x87 |0 # PRIVATE USE AREA +<UE3F3> \xF5\x88 |0 # PRIVATE USE AREA +<UE3F4> \xF5\x89 |0 # PRIVATE USE AREA +<UE3F5> \xF5\x8A |0 # PRIVATE USE AREA +<UE3F6> \xF5\x8B |0 # PRIVATE USE AREA +<UE3F7> \xF5\x8C |0 # PRIVATE USE AREA +<UE3F8> \xF5\x8D |0 # PRIVATE USE AREA +<UE3F9> \xF5\x8E |0 # PRIVATE USE AREA +<UE3FA> \xF5\x8F |0 # PRIVATE USE AREA +<UE3FB> \xF5\x90 |0 # PRIVATE USE AREA +<UE3FC> \xF5\x91 |0 # PRIVATE USE AREA +<UE3FD> \xF5\x92 |0 # PRIVATE USE AREA +<UE3FE> \xF5\x93 |0 # PRIVATE USE AREA +<UE3FF> \xF5\x94 |0 # PRIVATE USE AREA +<UE400> \xF5\x95 |0 # PRIVATE USE AREA +<UE401> \xF5\x96 |0 # PRIVATE USE AREA +<UE402> \xF5\x97 |0 # PRIVATE USE AREA +<UE403> \xF5\x98 |0 # PRIVATE USE AREA +<UE404> \xF5\x99 |0 # PRIVATE USE AREA +<UE405> \xF5\x9A |0 # PRIVATE USE AREA +<UE406> \xF5\x9B |0 # PRIVATE USE AREA +<UE407> \xF5\x9C |0 # PRIVATE USE AREA +<UE408> \xF5\x9D |0 # PRIVATE USE AREA +<UE409> \xF5\x9E |0 # PRIVATE USE AREA +<UE40A> \xF5\x9F |0 # PRIVATE USE AREA +<UE40B> \xF5\xA0 |0 # PRIVATE USE AREA +<UE40C> \xF5\xA1 |0 # PRIVATE USE AREA +<UE40D> \xF5\xA2 |0 # PRIVATE USE AREA +<UE40E> \xF5\xA3 |0 # PRIVATE USE AREA +<UE40F> \xF5\xA4 |0 # PRIVATE USE AREA +<UE410> \xF5\xA5 |0 # PRIVATE USE AREA +<UE411> \xF5\xA6 |0 # PRIVATE USE AREA +<UE412> \xF5\xA7 |0 # PRIVATE USE AREA +<UE413> \xF5\xA8 |0 # PRIVATE USE AREA +<UE414> \xF5\xA9 |0 # PRIVATE USE AREA +<UE415> \xF5\xAA |0 # PRIVATE USE AREA +<UE416> \xF5\xAB |0 # PRIVATE USE AREA +<UE417> \xF5\xAC |0 # PRIVATE USE AREA +<UE418> \xF5\xAD |0 # PRIVATE USE AREA +<UE419> \xF5\xAE |0 # PRIVATE USE AREA +<UE41A> \xF5\xAF |0 # PRIVATE USE AREA +<UE41B> \xF5\xB0 |0 # PRIVATE USE AREA +<UE41C> \xF5\xB1 |0 # PRIVATE USE AREA +<UE41D> \xF5\xB2 |0 # PRIVATE USE AREA +<UE41E> \xF5\xB3 |0 # PRIVATE USE AREA +<UE41F> \xF5\xB4 |0 # PRIVATE USE AREA +<UE420> \xF5\xB5 |0 # PRIVATE USE AREA +<UE421> \xF5\xB6 |0 # PRIVATE USE AREA +<UE422> \xF5\xB7 |0 # PRIVATE USE AREA +<UE423> \xF5\xB8 |0 # PRIVATE USE AREA +<UE424> \xF5\xB9 |0 # PRIVATE USE AREA +<UE425> \xF5\xBA |0 # PRIVATE USE AREA +<UE426> \xF5\xBB |0 # PRIVATE USE AREA +<UE427> \xF5\xBC |0 # PRIVATE USE AREA +<UE428> \xF5\xBD |0 # PRIVATE USE AREA +<UE429> \xF5\xBE |0 # PRIVATE USE AREA +<UE42A> \xF5\xBF |0 # PRIVATE USE AREA +<UE42B> \xF5\xC0 |0 # PRIVATE USE AREA +<UE42C> \xF5\xC1 |0 # PRIVATE USE AREA +<UE42D> \xF5\xC2 |0 # PRIVATE USE AREA +<UE42E> \xF5\xC3 |0 # PRIVATE USE AREA +<UE42F> \xF5\xC4 |0 # PRIVATE USE AREA +<UE430> \xF5\xC5 |0 # PRIVATE USE AREA +<UE431> \xF5\xC6 |0 # PRIVATE USE AREA +<UE432> \xF5\xC7 |0 # PRIVATE USE AREA +<UE433> \xF5\xC8 |0 # PRIVATE USE AREA +<UE434> \xF5\xC9 |0 # PRIVATE USE AREA +<UE435> \xF5\xCA |0 # PRIVATE USE AREA +<UE436> \xF5\xCB |0 # PRIVATE USE AREA +<UE437> \xF5\xCC |0 # PRIVATE USE AREA +<UE438> \xF5\xCD |0 # PRIVATE USE AREA +<UE439> \xF5\xCE |0 # PRIVATE USE AREA +<UE43A> \xF5\xCF |0 # PRIVATE USE AREA +<UE43B> \xF5\xD0 |0 # PRIVATE USE AREA +<UE43C> \xF5\xD1 |0 # PRIVATE USE AREA +<UE43D> \xF5\xD2 |0 # PRIVATE USE AREA +<UE43E> \xF5\xD3 |0 # PRIVATE USE AREA +<UE43F> \xF5\xD4 |0 # PRIVATE USE AREA +<UE440> \xF5\xD5 |0 # PRIVATE USE AREA +<UE441> \xF5\xD6 |0 # PRIVATE USE AREA +<UE442> \xF5\xD7 |0 # PRIVATE USE AREA +<UE443> \xF5\xD8 |0 # PRIVATE USE AREA +<UE444> \xF5\xD9 |0 # PRIVATE USE AREA +<UE445> \xF5\xDA |0 # PRIVATE USE AREA +<UE446> \xF5\xDB |0 # PRIVATE USE AREA +<UE447> \xF5\xDC |0 # PRIVATE USE AREA +<UE448> \xF5\xDD |0 # PRIVATE USE AREA +<UE449> \xF5\xDE |0 # PRIVATE USE AREA +<UE44A> \xF5\xDF |0 # PRIVATE USE AREA +<UE44B> \xF5\xE0 |0 # PRIVATE USE AREA +<UE44C> \xF5\xE1 |0 # PRIVATE USE AREA +<UE44D> \xF5\xE2 |0 # PRIVATE USE AREA +<UE44E> \xF5\xE3 |0 # PRIVATE USE AREA +<UE44F> \xF5\xE4 |0 # PRIVATE USE AREA +<UE450> \xF5\xE5 |0 # PRIVATE USE AREA +<UE451> \xF5\xE6 |0 # PRIVATE USE AREA +<UE452> \xF5\xE7 |0 # PRIVATE USE AREA +<UE453> \xF5\xE8 |0 # PRIVATE USE AREA +<UE454> \xF5\xE9 |0 # PRIVATE USE AREA +<UE455> \xF5\xEA |0 # PRIVATE USE AREA +<UE456> \xF5\xEB |0 # PRIVATE USE AREA +<UE457> \xF5\xEC |0 # PRIVATE USE AREA +<UE458> \xF5\xED |0 # PRIVATE USE AREA +<UE459> \xF5\xEE |0 # PRIVATE USE AREA +<UE45A> \xF5\xEF |0 # PRIVATE USE AREA +<UE45B> \xF5\xF0 |0 # PRIVATE USE AREA +<UE45C> \xF5\xF1 |0 # PRIVATE USE AREA +<UE45D> \xF5\xF2 |0 # PRIVATE USE AREA +<UE45E> \xF5\xF3 |0 # PRIVATE USE AREA +<UE45F> \xF5\xF4 |0 # PRIVATE USE AREA +<UE460> \xF5\xF5 |0 # PRIVATE USE AREA +<UE461> \xF5\xF6 |0 # PRIVATE USE AREA +<UE462> \xF5\xF7 |0 # PRIVATE USE AREA +<UE463> \xF5\xF8 |0 # PRIVATE USE AREA +<UE464> \xF5\xF9 |0 # PRIVATE USE AREA +<UE465> \xF5\xFA |0 # PRIVATE USE AREA +<UE466> \xF5\xFB |0 # PRIVATE USE AREA +<UE467> \xF5\xFC |0 # PRIVATE USE AREA +<UE468> \xF6\x40 |0 # PRIVATE USE AREA +<UE469> \xF6\x41 |0 # PRIVATE USE AREA +<UE46A> \xF6\x42 |0 # PRIVATE USE AREA +<UE46B> \xF6\x43 |0 # PRIVATE USE AREA +<UE46C> \xF6\x44 |0 # PRIVATE USE AREA +<UE46D> \xF6\x45 |0 # PRIVATE USE AREA +<UE46E> \xF6\x46 |0 # PRIVATE USE AREA +<UE46F> \xF6\x47 |0 # PRIVATE USE AREA +<UE470> \xF6\x48 |0 # PRIVATE USE AREA +<UE471> \xF6\x49 |0 # PRIVATE USE AREA +<UE472> \xF6\x4A |0 # PRIVATE USE AREA +<UE473> \xF6\x4B |0 # PRIVATE USE AREA +<UE474> \xF6\x4C |0 # PRIVATE USE AREA +<UE475> \xF6\x4D |0 # PRIVATE USE AREA +<UE476> \xF6\x4E |0 # PRIVATE USE AREA +<UE477> \xF6\x4F |0 # PRIVATE USE AREA +<UE478> \xF6\x50 |0 # PRIVATE USE AREA +<UE479> \xF6\x51 |0 # PRIVATE USE AREA +<UE47A> \xF6\x52 |0 # PRIVATE USE AREA +<UE47B> \xF6\x53 |0 # PRIVATE USE AREA +<UE47C> \xF6\x54 |0 # PRIVATE USE AREA +<UE47D> \xF6\x55 |0 # PRIVATE USE AREA +<UE47E> \xF6\x56 |0 # PRIVATE USE AREA +<UE47F> \xF6\x57 |0 # PRIVATE USE AREA +<UE480> \xF6\x58 |0 # PRIVATE USE AREA +<UE481> \xF6\x59 |0 # PRIVATE USE AREA +<UE482> \xF6\x5A |0 # PRIVATE USE AREA +<UE483> \xF6\x5B |0 # PRIVATE USE AREA +<UE484> \xF6\x5C |0 # PRIVATE USE AREA +<UE485> \xF6\x5D |0 # PRIVATE USE AREA +<UE486> \xF6\x5E |0 # PRIVATE USE AREA +<UE487> \xF6\x5F |0 # PRIVATE USE AREA +<UE488> \xF6\x60 |0 # PRIVATE USE AREA +<UE489> \xF6\x61 |0 # PRIVATE USE AREA +<UE48A> \xF6\x62 |0 # PRIVATE USE AREA +<UE48B> \xF6\x63 |0 # PRIVATE USE AREA +<UE48C> \xF6\x64 |0 # PRIVATE USE AREA +<UE48D> \xF6\x65 |0 # PRIVATE USE AREA +<UE48E> \xF6\x66 |0 # PRIVATE USE AREA +<UE48F> \xF6\x67 |0 # PRIVATE USE AREA +<UE490> \xF6\x68 |0 # PRIVATE USE AREA +<UE491> \xF6\x69 |0 # PRIVATE USE AREA +<UE492> \xF6\x6A |0 # PRIVATE USE AREA +<UE493> \xF6\x6B |0 # PRIVATE USE AREA +<UE494> \xF6\x6C |0 # PRIVATE USE AREA +<UE495> \xF6\x6D |0 # PRIVATE USE AREA +<UE496> \xF6\x6E |0 # PRIVATE USE AREA +<UE497> \xF6\x6F |0 # PRIVATE USE AREA +<UE498> \xF6\x70 |0 # PRIVATE USE AREA +<UE499> \xF6\x71 |0 # PRIVATE USE AREA +<UE49A> \xF6\x72 |0 # PRIVATE USE AREA +<UE49B> \xF6\x73 |0 # PRIVATE USE AREA +<UE49C> \xF6\x74 |0 # PRIVATE USE AREA +<UE49D> \xF6\x75 |0 # PRIVATE USE AREA +<UE49E> \xF6\x76 |0 # PRIVATE USE AREA +<UE49F> \xF6\x77 |0 # PRIVATE USE AREA +<UE4A0> \xF6\x78 |0 # PRIVATE USE AREA +<UE4A1> \xF6\x79 |0 # PRIVATE USE AREA +<UE4A2> \xF6\x7A |0 # PRIVATE USE AREA +<UE4A3> \xF6\x7B |0 # PRIVATE USE AREA +<UE4A4> \xF6\x7C |0 # PRIVATE USE AREA +<UE4A5> \xF6\x7D |0 # PRIVATE USE AREA +<UE4A6> \xF6\x7E |0 # PRIVATE USE AREA +<UE4A7> \xF6\x80 |0 # PRIVATE USE AREA +<UE4A8> \xF6\x81 |0 # PRIVATE USE AREA +<UE4A9> \xF6\x82 |0 # PRIVATE USE AREA +<UE4AA> \xF6\x83 |0 # PRIVATE USE AREA +<UE4AB> \xF6\x84 |0 # PRIVATE USE AREA +<UE4AC> \xF6\x85 |0 # PRIVATE USE AREA +<UE4AD> \xF6\x86 |0 # PRIVATE USE AREA +<UE4AE> \xF6\x87 |0 # PRIVATE USE AREA +<UE4AF> \xF6\x88 |0 # PRIVATE USE AREA +<UE4B0> \xF6\x89 |0 # PRIVATE USE AREA +<UE4B1> \xF6\x8A |0 # PRIVATE USE AREA +<UE4B2> \xF6\x8B |0 # PRIVATE USE AREA +<UE4B3> \xF6\x8C |0 # PRIVATE USE AREA +<UE4B4> \xF6\x8D |0 # PRIVATE USE AREA +<UE4B5> \xF6\x8E |0 # PRIVATE USE AREA +<UE4B6> \xF6\x8F |0 # PRIVATE USE AREA +<UE4B7> \xF6\x90 |0 # PRIVATE USE AREA +<UE4B8> \xF6\x91 |0 # PRIVATE USE AREA +<UE4B9> \xF6\x92 |0 # PRIVATE USE AREA +<UE4BA> \xF6\x93 |0 # PRIVATE USE AREA +<UE4BB> \xF6\x94 |0 # PRIVATE USE AREA +<UE4BC> \xF6\x95 |0 # PRIVATE USE AREA +<UE4BD> \xF6\x96 |0 # PRIVATE USE AREA +<UE4BE> \xF6\x97 |0 # PRIVATE USE AREA +<UE4BF> \xF6\x98 |0 # PRIVATE USE AREA +<UE4C0> \xF6\x99 |0 # PRIVATE USE AREA +<UE4C1> \xF6\x9A |0 # PRIVATE USE AREA +<UE4C2> \xF6\x9B |0 # PRIVATE USE AREA +<UE4C3> \xF6\x9C |0 # PRIVATE USE AREA +<UE4C4> \xF6\x9D |0 # PRIVATE USE AREA +<UE4C5> \xF6\x9E |0 # PRIVATE USE AREA +<UE4C6> \xF6\x9F |0 # PRIVATE USE AREA +<UE4C7> \xF6\xA0 |0 # PRIVATE USE AREA +<UE4C8> \xF6\xA1 |0 # PRIVATE USE AREA +<UE4C9> \xF6\xA2 |0 # PRIVATE USE AREA +<UE4CA> \xF6\xA3 |0 # PRIVATE USE AREA +<UE4CB> \xF6\xA4 |0 # PRIVATE USE AREA +<UE4CC> \xF6\xA5 |0 # PRIVATE USE AREA +<UE4CD> \xF6\xA6 |0 # PRIVATE USE AREA +<UE4CE> \xF6\xA7 |0 # PRIVATE USE AREA +<UE4CF> \xF6\xA8 |0 # PRIVATE USE AREA +<UE4D0> \xF6\xA9 |0 # PRIVATE USE AREA +<UE4D1> \xF6\xAA |0 # PRIVATE USE AREA +<UE4D2> \xF6\xAB |0 # PRIVATE USE AREA +<UE4D3> \xF6\xAC |0 # PRIVATE USE AREA +<UE4D4> \xF6\xAD |0 # PRIVATE USE AREA +<UE4D5> \xF6\xAE |0 # PRIVATE USE AREA +<UE4D6> \xF6\xAF |0 # PRIVATE USE AREA +<UE4D7> \xF6\xB0 |0 # PRIVATE USE AREA +<UE4D8> \xF6\xB1 |0 # PRIVATE USE AREA +<UE4D9> \xF6\xB2 |0 # PRIVATE USE AREA +<UE4DA> \xF6\xB3 |0 # PRIVATE USE AREA +<UE4DB> \xF6\xB4 |0 # PRIVATE USE AREA +<UE4DC> \xF6\xB5 |0 # PRIVATE USE AREA +<UE4DD> \xF6\xB6 |0 # PRIVATE USE AREA +<UE4DE> \xF6\xB7 |0 # PRIVATE USE AREA +<UE4DF> \xF6\xB8 |0 # PRIVATE USE AREA +<UE4E0> \xF6\xB9 |0 # PRIVATE USE AREA +<UE4E1> \xF6\xBA |0 # PRIVATE USE AREA +<UE4E2> \xF6\xBB |0 # PRIVATE USE AREA +<UE4E3> \xF6\xBC |0 # PRIVATE USE AREA +<UE4E4> \xF6\xBD |0 # PRIVATE USE AREA +<UE4E5> \xF6\xBE |0 # PRIVATE USE AREA +<UE4E6> \xF6\xBF |0 # PRIVATE USE AREA +<UE4E7> \xF6\xC0 |0 # PRIVATE USE AREA +<UE4E8> \xF6\xC1 |0 # PRIVATE USE AREA +<UE4E9> \xF6\xC2 |0 # PRIVATE USE AREA +<UE4EA> \xF6\xC3 |0 # PRIVATE USE AREA +<UE4EB> \xF6\xC4 |0 # PRIVATE USE AREA +<UE4EC> \xF6\xC5 |0 # PRIVATE USE AREA +<UE4ED> \xF6\xC6 |0 # PRIVATE USE AREA +<UE4EE> \xF6\xC7 |0 # PRIVATE USE AREA +<UE4EF> \xF6\xC8 |0 # PRIVATE USE AREA +<UE4F0> \xF6\xC9 |0 # PRIVATE USE AREA +<UE4F1> \xF6\xCA |0 # PRIVATE USE AREA +<UE4F2> \xF6\xCB |0 # PRIVATE USE AREA +<UE4F3> \xF6\xCC |0 # PRIVATE USE AREA +<UE4F4> \xF6\xCD |0 # PRIVATE USE AREA +<UE4F5> \xF6\xCE |0 # PRIVATE USE AREA +<UE4F6> \xF6\xCF |0 # PRIVATE USE AREA +<UE4F7> \xF6\xD0 |0 # PRIVATE USE AREA +<UE4F8> \xF6\xD1 |0 # PRIVATE USE AREA +<UE4F9> \xF6\xD2 |0 # PRIVATE USE AREA +<UE4FA> \xF6\xD3 |0 # PRIVATE USE AREA +<UE4FB> \xF6\xD4 |0 # PRIVATE USE AREA +<UE4FC> \xF6\xD5 |0 # PRIVATE USE AREA +<UE4FD> \xF6\xD6 |0 # PRIVATE USE AREA +<UE4FE> \xF6\xD7 |0 # PRIVATE USE AREA +<UE4FF> \xF6\xD8 |0 # PRIVATE USE AREA +<UE500> \xF6\xD9 |0 # PRIVATE USE AREA +<UE501> \xF6\xDA |0 # PRIVATE USE AREA +<UE502> \xF6\xDB |0 # PRIVATE USE AREA +<UE503> \xF6\xDC |0 # PRIVATE USE AREA +<UE504> \xF6\xDD |0 # PRIVATE USE AREA +<UE505> \xF6\xDE |0 # PRIVATE USE AREA +<UE506> \xF6\xDF |0 # PRIVATE USE AREA +<UE507> \xF6\xE0 |0 # PRIVATE USE AREA +<UE508> \xF6\xE1 |0 # PRIVATE USE AREA +<UE509> \xF6\xE2 |0 # PRIVATE USE AREA +<UE50A> \xF6\xE3 |0 # PRIVATE USE AREA +<UE50B> \xF6\xE4 |0 # PRIVATE USE AREA +<UE50C> \xF6\xE5 |0 # PRIVATE USE AREA +<UE50D> \xF6\xE6 |0 # PRIVATE USE AREA +<UE50E> \xF6\xE7 |0 # PRIVATE USE AREA +<UE50F> \xF6\xE8 |0 # PRIVATE USE AREA +<UE510> \xF6\xE9 |0 # PRIVATE USE AREA +<UE511> \xF6\xEA |0 # PRIVATE USE AREA +<UE512> \xF6\xEB |0 # PRIVATE USE AREA +<UE513> \xF6\xEC |0 # PRIVATE USE AREA +<UE514> \xF6\xED |0 # PRIVATE USE AREA +<UE515> \xF6\xEE |0 # PRIVATE USE AREA +<UE516> \xF6\xEF |0 # PRIVATE USE AREA +<UE517> \xF6\xF0 |0 # PRIVATE USE AREA +<UE518> \xF6\xF1 |0 # PRIVATE USE AREA +<UE519> \xF6\xF2 |0 # PRIVATE USE AREA +<UE51A> \xF6\xF3 |0 # PRIVATE USE AREA +<UE51B> \xF6\xF4 |0 # PRIVATE USE AREA +<UE51C> \xF6\xF5 |0 # PRIVATE USE AREA +<UE51D> \xF6\xF6 |0 # PRIVATE USE AREA +<UE51E> \xF6\xF7 |0 # PRIVATE USE AREA +<UE51F> \xF6\xF8 |0 # PRIVATE USE AREA +<UE520> \xF6\xF9 |0 # PRIVATE USE AREA +<UE521> \xF6\xFA |0 # PRIVATE USE AREA +<UE522> \xF6\xFB |0 # PRIVATE USE AREA +<UE523> \xF6\xFC |0 # PRIVATE USE AREA +<UE524> \xF7\x40 |0 # PRIVATE USE AREA +<UE525> \xF7\x41 |0 # PRIVATE USE AREA +<UE526> \xF7\x42 |0 # PRIVATE USE AREA +<UE527> \xF7\x43 |0 # PRIVATE USE AREA +<UE528> \xF7\x44 |0 # PRIVATE USE AREA +<UE529> \xF7\x45 |0 # PRIVATE USE AREA +<UE52A> \xF7\x46 |0 # PRIVATE USE AREA +<UE52B> \xF7\x47 |0 # PRIVATE USE AREA +<UE52C> \xF7\x48 |0 # PRIVATE USE AREA +<UE52D> \xF7\x49 |0 # PRIVATE USE AREA +<UE52E> \xF7\x4A |0 # PRIVATE USE AREA +<UE52F> \xF7\x4B |0 # PRIVATE USE AREA +<UE530> \xF7\x4C |0 # PRIVATE USE AREA +<UE531> \xF7\x4D |0 # PRIVATE USE AREA +<UE532> \xF7\x4E |0 # PRIVATE USE AREA +<UE533> \xF7\x4F |0 # PRIVATE USE AREA +<UE534> \xF7\x50 |0 # PRIVATE USE AREA +<UE535> \xF7\x51 |0 # PRIVATE USE AREA +<UE536> \xF7\x52 |0 # PRIVATE USE AREA +<UE537> \xF7\x53 |0 # PRIVATE USE AREA +<UE538> \xF7\x54 |0 # PRIVATE USE AREA +<UE539> \xF7\x55 |0 # PRIVATE USE AREA +<UE53A> \xF7\x56 |0 # PRIVATE USE AREA +<UE53B> \xF7\x57 |0 # PRIVATE USE AREA +<UE53C> \xF7\x58 |0 # PRIVATE USE AREA +<UE53D> \xF7\x59 |0 # PRIVATE USE AREA +<UE53E> \xF7\x5A |0 # PRIVATE USE AREA +<UE53F> \xF7\x5B |0 # PRIVATE USE AREA +<UE540> \xF7\x5C |0 # PRIVATE USE AREA +<UE541> \xF7\x5D |0 # PRIVATE USE AREA +<UE542> \xF7\x5E |0 # PRIVATE USE AREA +<UE543> \xF7\x5F |0 # PRIVATE USE AREA +<UE544> \xF7\x60 |0 # PRIVATE USE AREA +<UE545> \xF7\x61 |0 # PRIVATE USE AREA +<UE546> \xF7\x62 |0 # PRIVATE USE AREA +<UE547> \xF7\x63 |0 # PRIVATE USE AREA +<UE548> \xF7\x64 |0 # PRIVATE USE AREA +<UE549> \xF7\x65 |0 # PRIVATE USE AREA +<UE54A> \xF7\x66 |0 # PRIVATE USE AREA +<UE54B> \xF7\x67 |0 # PRIVATE USE AREA +<UE54C> \xF7\x68 |0 # PRIVATE USE AREA +<UE54D> \xF7\x69 |0 # PRIVATE USE AREA +<UE54E> \xF7\x6A |0 # PRIVATE USE AREA +<UE54F> \xF7\x6B |0 # PRIVATE USE AREA +<UE550> \xF7\x6C |0 # PRIVATE USE AREA +<UE551> \xF7\x6D |0 # PRIVATE USE AREA +<UE552> \xF7\x6E |0 # PRIVATE USE AREA +<UE553> \xF7\x6F |0 # PRIVATE USE AREA +<UE554> \xF7\x70 |0 # PRIVATE USE AREA +<UE555> \xF7\x71 |0 # PRIVATE USE AREA +<UE556> \xF7\x72 |0 # PRIVATE USE AREA +<UE557> \xF7\x73 |0 # PRIVATE USE AREA +<UE558> \xF7\x74 |0 # PRIVATE USE AREA +<UE559> \xF7\x75 |0 # PRIVATE USE AREA +<UE55A> \xF7\x76 |0 # PRIVATE USE AREA +<UE55B> \xF7\x77 |0 # PRIVATE USE AREA +<UE55C> \xF7\x78 |0 # PRIVATE USE AREA +<UE55D> \xF7\x79 |0 # PRIVATE USE AREA +<UE55E> \xF7\x7A |0 # PRIVATE USE AREA +<UE55F> \xF7\x7B |0 # PRIVATE USE AREA +<UE560> \xF7\x7C |0 # PRIVATE USE AREA +<UE561> \xF7\x7D |0 # PRIVATE USE AREA +<UE562> \xF7\x7E |0 # PRIVATE USE AREA +<UE563> \xF7\x80 |0 # PRIVATE USE AREA +<UE564> \xF7\x81 |0 # PRIVATE USE AREA +<UE565> \xF7\x82 |0 # PRIVATE USE AREA +<UE566> \xF7\x83 |0 # PRIVATE USE AREA +<UE567> \xF7\x84 |0 # PRIVATE USE AREA +<UE568> \xF7\x85 |0 # PRIVATE USE AREA +<UE569> \xF7\x86 |0 # PRIVATE USE AREA +<UE56A> \xF7\x87 |0 # PRIVATE USE AREA +<UE56B> \xF7\x88 |0 # PRIVATE USE AREA +<UE56C> \xF7\x89 |0 # PRIVATE USE AREA +<UE56D> \xF7\x8A |0 # PRIVATE USE AREA +<UE56E> \xF7\x8B |0 # PRIVATE USE AREA +<UE56F> \xF7\x8C |0 # PRIVATE USE AREA +<UE570> \xF7\x8D |0 # PRIVATE USE AREA +<UE571> \xF7\x8E |0 # PRIVATE USE AREA +<UE572> \xF7\x8F |0 # PRIVATE USE AREA +<UE573> \xF7\x90 |0 # PRIVATE USE AREA +<UE574> \xF7\x91 |0 # PRIVATE USE AREA +<UE575> \xF7\x92 |0 # PRIVATE USE AREA +<UE576> \xF7\x93 |0 # PRIVATE USE AREA +<UE577> \xF7\x94 |0 # PRIVATE USE AREA +<UE578> \xF7\x95 |0 # PRIVATE USE AREA +<UE579> \xF7\x96 |0 # PRIVATE USE AREA +<UE57A> \xF7\x97 |0 # PRIVATE USE AREA +<UE57B> \xF7\x98 |0 # PRIVATE USE AREA +<UE57C> \xF7\x99 |0 # PRIVATE USE AREA +<UE57D> \xF7\x9A |0 # PRIVATE USE AREA +<UE57E> \xF7\x9B |0 # PRIVATE USE AREA +<UE57F> \xF7\x9C |0 # PRIVATE USE AREA +<UE580> \xF7\x9D |0 # PRIVATE USE AREA +<UE581> \xF7\x9E |0 # PRIVATE USE AREA +<UE582> \xF7\x9F |0 # PRIVATE USE AREA +<UE583> \xF7\xA0 |0 # PRIVATE USE AREA +<UE584> \xF7\xA1 |0 # PRIVATE USE AREA +<UE585> \xF7\xA2 |0 # PRIVATE USE AREA +<UE586> \xF7\xA3 |0 # PRIVATE USE AREA +<UE587> \xF7\xA4 |0 # PRIVATE USE AREA +<UE588> \xF7\xA5 |0 # PRIVATE USE AREA +<UE589> \xF7\xA6 |0 # PRIVATE USE AREA +<UE58A> \xF7\xA7 |0 # PRIVATE USE AREA +<UE58B> \xF7\xA8 |0 # PRIVATE USE AREA +<UE58C> \xF7\xA9 |0 # PRIVATE USE AREA +<UE58D> \xF7\xAA |0 # PRIVATE USE AREA +<UE58E> \xF7\xAB |0 # PRIVATE USE AREA +<UE58F> \xF7\xAC |0 # PRIVATE USE AREA +<UE590> \xF7\xAD |0 # PRIVATE USE AREA +<UE591> \xF7\xAE |0 # PRIVATE USE AREA +<UE592> \xF7\xAF |0 # PRIVATE USE AREA +<UE593> \xF7\xB0 |0 # PRIVATE USE AREA +<UE594> \xF7\xB1 |0 # PRIVATE USE AREA +<UE595> \xF7\xB2 |0 # PRIVATE USE AREA +<UE596> \xF7\xB3 |0 # PRIVATE USE AREA +<UE597> \xF7\xB4 |0 # PRIVATE USE AREA +<UE598> \xF7\xB5 |0 # PRIVATE USE AREA +<UE599> \xF7\xB6 |0 # PRIVATE USE AREA +<UE59A> \xF7\xB7 |0 # PRIVATE USE AREA +<UE59B> \xF7\xB8 |0 # PRIVATE USE AREA +<UE59C> \xF7\xB9 |0 # PRIVATE USE AREA +<UE59D> \xF7\xBA |0 # PRIVATE USE AREA +<UE59E> \xF7\xBB |0 # PRIVATE USE AREA +<UE59F> \xF7\xBC |0 # PRIVATE USE AREA +<UE5A0> \xF7\xBD |0 # PRIVATE USE AREA +<UE5A1> \xF7\xBE |0 # PRIVATE USE AREA +<UE5A2> \xF7\xBF |0 # PRIVATE USE AREA +<UE5A3> \xF7\xC0 |0 # PRIVATE USE AREA +<UE5A4> \xF7\xC1 |0 # PRIVATE USE AREA +<UE5A5> \xF7\xC2 |0 # PRIVATE USE AREA +<UE5A6> \xF7\xC3 |0 # PRIVATE USE AREA +<UE5A7> \xF7\xC4 |0 # PRIVATE USE AREA +<UE5A8> \xF7\xC5 |0 # PRIVATE USE AREA +<UE5A9> \xF7\xC6 |0 # PRIVATE USE AREA +<UE5AA> \xF7\xC7 |0 # PRIVATE USE AREA +<UE5AB> \xF7\xC8 |0 # PRIVATE USE AREA +<UE5AC> \xF7\xC9 |0 # PRIVATE USE AREA +<UE5AD> \xF7\xCA |0 # PRIVATE USE AREA +<UE5AE> \xF7\xCB |0 # PRIVATE USE AREA +<UE5AF> \xF7\xCC |0 # PRIVATE USE AREA +<UE5B0> \xF7\xCD |0 # PRIVATE USE AREA +<UE5B1> \xF7\xCE |0 # PRIVATE USE AREA +<UE5B2> \xF7\xCF |0 # PRIVATE USE AREA +<UE5B3> \xF7\xD0 |0 # PRIVATE USE AREA +<UE5B4> \xF7\xD1 |0 # PRIVATE USE AREA +<UE5B5> \xF7\xD2 |0 # PRIVATE USE AREA +<UE5B6> \xF7\xD3 |0 # PRIVATE USE AREA +<UE5B7> \xF7\xD4 |0 # PRIVATE USE AREA +<UE5B8> \xF7\xD5 |0 # PRIVATE USE AREA +<UE5B9> \xF7\xD6 |0 # PRIVATE USE AREA +<UE5BA> \xF7\xD7 |0 # PRIVATE USE AREA +<UE5BB> \xF7\xD8 |0 # PRIVATE USE AREA +<UE5BC> \xF7\xD9 |0 # PRIVATE USE AREA +<UE5BD> \xF7\xDA |0 # PRIVATE USE AREA +<UE5BE> \xF7\xDB |0 # PRIVATE USE AREA +<UE5BF> \xF7\xDC |0 # PRIVATE USE AREA +<UE5C0> \xF7\xDD |0 # PRIVATE USE AREA +<UE5C1> \xF7\xDE |0 # PRIVATE USE AREA +<UE5C2> \xF7\xDF |0 # PRIVATE USE AREA +<UE5C3> \xF7\xE0 |0 # PRIVATE USE AREA +<UE5C4> \xF7\xE1 |0 # PRIVATE USE AREA +<UE5C5> \xF7\xE2 |0 # PRIVATE USE AREA +<UE5C6> \xF7\xE3 |0 # PRIVATE USE AREA +<UE5C7> \xF7\xE4 |0 # PRIVATE USE AREA +<UE5C8> \xF7\xE5 |0 # PRIVATE USE AREA +<UE5C9> \xF7\xE6 |0 # PRIVATE USE AREA +<UE5CA> \xF7\xE7 |0 # PRIVATE USE AREA +<UE5CB> \xF7\xE8 |0 # PRIVATE USE AREA +<UE5CC> \xF7\xE9 |0 # PRIVATE USE AREA +<UE5CD> \xF7\xEA |0 # PRIVATE USE AREA +<UE5CE> \xF7\xEB |0 # PRIVATE USE AREA +<UE5CF> \xF7\xEC |0 # PRIVATE USE AREA +<UE5D0> \xF7\xED |0 # PRIVATE USE AREA +<UE5D1> \xF7\xEE |0 # PRIVATE USE AREA +<UE5D2> \xF7\xEF |0 # PRIVATE USE AREA +<UE5D3> \xF7\xF0 |0 # PRIVATE USE AREA +<UE5D4> \xF7\xF1 |0 # PRIVATE USE AREA +<UE5D5> \xF7\xF2 |0 # PRIVATE USE AREA +<UE5D6> \xF7\xF3 |0 # PRIVATE USE AREA +<UE5D7> \xF7\xF4 |0 # PRIVATE USE AREA +<UE5D8> \xF7\xF5 |0 # PRIVATE USE AREA +<UE5D9> \xF7\xF6 |0 # PRIVATE USE AREA +<UE5DA> \xF7\xF7 |0 # PRIVATE USE AREA +<UE5DB> \xF7\xF8 |0 # PRIVATE USE AREA +<UE5DC> \xF7\xF9 |0 # PRIVATE USE AREA +<UE5DD> \xF7\xFA |0 # PRIVATE USE AREA +<UE5DE> \xF7\xFB |0 # PRIVATE USE AREA +<UE5DF> \xF7\xFC |0 # PRIVATE USE AREA +<UE5E0> \xF8\x40 |0 # PRIVATE USE AREA +<UE5E1> \xF8\x41 |0 # PRIVATE USE AREA +<UE5E2> \xF8\x42 |0 # PRIVATE USE AREA +<UE5E3> \xF8\x43 |0 # PRIVATE USE AREA +<UE5E4> \xF8\x44 |0 # PRIVATE USE AREA +<UE5E5> \xF8\x45 |0 # PRIVATE USE AREA +<UE5E6> \xF8\x46 |0 # PRIVATE USE AREA +<UE5E7> \xF8\x47 |0 # PRIVATE USE AREA +<UE5E8> \xF8\x48 |0 # PRIVATE USE AREA +<UE5E9> \xF8\x49 |0 # PRIVATE USE AREA +<UE5EA> \xF8\x4A |0 # PRIVATE USE AREA +<UE5EB> \xF8\x4B |0 # PRIVATE USE AREA +<UE5EC> \xF8\x4C |0 # PRIVATE USE AREA +<UE5ED> \xF8\x4D |0 # PRIVATE USE AREA +<UE5EE> \xF8\x4E |0 # PRIVATE USE AREA +<UE5EF> \xF8\x4F |0 # PRIVATE USE AREA +<UE5F0> \xF8\x50 |0 # PRIVATE USE AREA +<UE5F1> \xF8\x51 |0 # PRIVATE USE AREA +<UE5F2> \xF8\x52 |0 # PRIVATE USE AREA +<UE5F3> \xF8\x53 |0 # PRIVATE USE AREA +<UE5F4> \xF8\x54 |0 # PRIVATE USE AREA +<UE5F5> \xF8\x55 |0 # PRIVATE USE AREA +<UE5F6> \xF8\x56 |0 # PRIVATE USE AREA +<UE5F7> \xF8\x57 |0 # PRIVATE USE AREA +<UE5F8> \xF8\x58 |0 # PRIVATE USE AREA +<UE5F9> \xF8\x59 |0 # PRIVATE USE AREA +<UE5FA> \xF8\x5A |0 # PRIVATE USE AREA +<UE5FB> \xF8\x5B |0 # PRIVATE USE AREA +<UE5FC> \xF8\x5C |0 # PRIVATE USE AREA +<UE5FD> \xF8\x5D |0 # PRIVATE USE AREA +<UE5FE> \xF8\x5E |0 # PRIVATE USE AREA +<UE5FF> \xF8\x5F |0 # PRIVATE USE AREA +<UE600> \xF8\x60 |0 # PRIVATE USE AREA +<UE601> \xF8\x61 |0 # PRIVATE USE AREA +<UE602> \xF8\x62 |0 # PRIVATE USE AREA +<UE603> \xF8\x63 |0 # PRIVATE USE AREA +<UE604> \xF8\x64 |0 # PRIVATE USE AREA +<UE605> \xF8\x65 |0 # PRIVATE USE AREA +<UE606> \xF8\x66 |0 # PRIVATE USE AREA +<UE607> \xF8\x67 |0 # PRIVATE USE AREA +<UE608> \xF8\x68 |0 # PRIVATE USE AREA +<UE609> \xF8\x69 |0 # PRIVATE USE AREA +<UE60A> \xF8\x6A |0 # PRIVATE USE AREA +<UE60B> \xF8\x6B |0 # PRIVATE USE AREA +<UE60C> \xF8\x6C |0 # PRIVATE USE AREA +<UE60D> \xF8\x6D |0 # PRIVATE USE AREA +<UE60E> \xF8\x6E |0 # PRIVATE USE AREA +<UE60F> \xF8\x6F |0 # PRIVATE USE AREA +<UE610> \xF8\x70 |0 # PRIVATE USE AREA +<UE611> \xF8\x71 |0 # PRIVATE USE AREA +<UE612> \xF8\x72 |0 # PRIVATE USE AREA +<UE613> \xF8\x73 |0 # PRIVATE USE AREA +<UE614> \xF8\x74 |0 # PRIVATE USE AREA +<UE615> \xF8\x75 |0 # PRIVATE USE AREA +<UE616> \xF8\x76 |0 # PRIVATE USE AREA +<UE617> \xF8\x77 |0 # PRIVATE USE AREA +<UE618> \xF8\x78 |0 # PRIVATE USE AREA +<UE619> \xF8\x79 |0 # PRIVATE USE AREA +<UE61A> \xF8\x7A |0 # PRIVATE USE AREA +<UE61B> \xF8\x7B |0 # PRIVATE USE AREA +<UE61C> \xF8\x7C |0 # PRIVATE USE AREA +<UE61D> \xF8\x7D |0 # PRIVATE USE AREA +<UE61E> \xF8\x7E |0 # PRIVATE USE AREA +<UE61F> \xF8\x80 |0 # PRIVATE USE AREA +<UE620> \xF8\x81 |0 # PRIVATE USE AREA +<UE621> \xF8\x82 |0 # PRIVATE USE AREA +<UE622> \xF8\x83 |0 # PRIVATE USE AREA +<UE623> \xF8\x84 |0 # PRIVATE USE AREA +<UE624> \xF8\x85 |0 # PRIVATE USE AREA +<UE625> \xF8\x86 |0 # PRIVATE USE AREA +<UE626> \xF8\x87 |0 # PRIVATE USE AREA +<UE627> \xF8\x88 |0 # PRIVATE USE AREA +<UE628> \xF8\x89 |0 # PRIVATE USE AREA +<UE629> \xF8\x8A |0 # PRIVATE USE AREA +<UE62A> \xF8\x8B |0 # PRIVATE USE AREA +<UE62B> \xF8\x8C |0 # PRIVATE USE AREA +<UE62C> \xF8\x8D |0 # PRIVATE USE AREA +<UE62D> \xF8\x8E |0 # PRIVATE USE AREA +<UE62E> \xF8\x8F |0 # PRIVATE USE AREA +<UE62F> \xF8\x90 |0 # PRIVATE USE AREA +<UE630> \xF8\x91 |0 # PRIVATE USE AREA +<UE631> \xF8\x92 |0 # PRIVATE USE AREA +<UE632> \xF8\x93 |0 # PRIVATE USE AREA +<UE633> \xF8\x94 |0 # PRIVATE USE AREA +<UE634> \xF8\x95 |0 # PRIVATE USE AREA +<UE635> \xF8\x96 |0 # PRIVATE USE AREA +<UE636> \xF8\x97 |0 # PRIVATE USE AREA +<UE637> \xF8\x98 |0 # PRIVATE USE AREA +<UE638> \xF8\x99 |0 # PRIVATE USE AREA +<UE639> \xF8\x9A |0 # PRIVATE USE AREA +<UE63A> \xF8\x9B |0 # PRIVATE USE AREA +<UE63B> \xF8\x9C |0 # PRIVATE USE AREA +<UE63C> \xF8\x9D |0 # PRIVATE USE AREA +<UE63D> \xF8\x9E |0 # PRIVATE USE AREA +<UE63E> \xF8\x9F |0 # PRIVATE USE AREA +<UE63F> \xF8\xA0 |0 # PRIVATE USE AREA +<UE640> \xF8\xA1 |0 # PRIVATE USE AREA +<UE641> \xF8\xA2 |0 # PRIVATE USE AREA +<UE642> \xF8\xA3 |0 # PRIVATE USE AREA +<UE643> \xF8\xA4 |0 # PRIVATE USE AREA +<UE644> \xF8\xA5 |0 # PRIVATE USE AREA +<UE645> \xF8\xA6 |0 # PRIVATE USE AREA +<UE646> \xF8\xA7 |0 # PRIVATE USE AREA +<UE647> \xF8\xA8 |0 # PRIVATE USE AREA +<UE648> \xF8\xA9 |0 # PRIVATE USE AREA +<UE649> \xF8\xAA |0 # PRIVATE USE AREA +<UE64A> \xF8\xAB |0 # PRIVATE USE AREA +<UE64B> \xF8\xAC |0 # PRIVATE USE AREA +<UE64C> \xF8\xAD |0 # PRIVATE USE AREA +<UE64D> \xF8\xAE |0 # PRIVATE USE AREA +<UE64E> \xF8\xAF |0 # PRIVATE USE AREA +<UE64F> \xF8\xB0 |0 # PRIVATE USE AREA +<UE650> \xF8\xB1 |0 # PRIVATE USE AREA +<UE651> \xF8\xB2 |0 # PRIVATE USE AREA +<UE652> \xF8\xB3 |0 # PRIVATE USE AREA +<UE653> \xF8\xB4 |0 # PRIVATE USE AREA +<UE654> \xF8\xB5 |0 # PRIVATE USE AREA +<UE655> \xF8\xB6 |0 # PRIVATE USE AREA +<UE656> \xF8\xB7 |0 # PRIVATE USE AREA +<UE657> \xF8\xB8 |0 # PRIVATE USE AREA +<UE658> \xF8\xB9 |0 # PRIVATE USE AREA +<UE659> \xF8\xBA |0 # PRIVATE USE AREA +<UE65A> \xF8\xBB |0 # PRIVATE USE AREA +<UE65B> \xF8\xBC |0 # PRIVATE USE AREA +<UE65C> \xF8\xBD |0 # PRIVATE USE AREA +<UE65D> \xF8\xBE |0 # PRIVATE USE AREA +<UE65E> \xF8\xBF |0 # PRIVATE USE AREA +<UE65F> \xF8\xC0 |0 # PRIVATE USE AREA +<UE660> \xF8\xC1 |0 # PRIVATE USE AREA +<UE661> \xF8\xC2 |0 # PRIVATE USE AREA +<UE662> \xF8\xC3 |0 # PRIVATE USE AREA +<UE663> \xF8\xC4 |0 # PRIVATE USE AREA +<UE664> \xF8\xC5 |0 # PRIVATE USE AREA +<UE665> \xF8\xC6 |0 # PRIVATE USE AREA +<UE666> \xF8\xC7 |0 # PRIVATE USE AREA +<UE667> \xF8\xC8 |0 # PRIVATE USE AREA +<UE668> \xF8\xC9 |0 # PRIVATE USE AREA +<UE669> \xF8\xCA |0 # PRIVATE USE AREA +<UE66A> \xF8\xCB |0 # PRIVATE USE AREA +<UE66B> \xF8\xCC |0 # PRIVATE USE AREA +<UE66C> \xF8\xCD |0 # PRIVATE USE AREA +<UE66D> \xF8\xCE |0 # PRIVATE USE AREA +<UE66E> \xF8\xCF |0 # PRIVATE USE AREA +<UE66F> \xF8\xD0 |0 # PRIVATE USE AREA +<UE670> \xF8\xD1 |0 # PRIVATE USE AREA +<UE671> \xF8\xD2 |0 # PRIVATE USE AREA +<UE672> \xF8\xD3 |0 # PRIVATE USE AREA +<UE673> \xF8\xD4 |0 # PRIVATE USE AREA +<UE674> \xF8\xD5 |0 # PRIVATE USE AREA +<UE675> \xF8\xD6 |0 # PRIVATE USE AREA +<UE676> \xF8\xD7 |0 # PRIVATE USE AREA +<UE677> \xF8\xD8 |0 # PRIVATE USE AREA +<UE678> \xF8\xD9 |0 # PRIVATE USE AREA +<UE679> \xF8\xDA |0 # PRIVATE USE AREA +<UE67A> \xF8\xDB |0 # PRIVATE USE AREA +<UE67B> \xF8\xDC |0 # PRIVATE USE AREA +<UE67C> \xF8\xDD |0 # PRIVATE USE AREA +<UE67D> \xF8\xDE |0 # PRIVATE USE AREA +<UE67E> \xF8\xDF |0 # PRIVATE USE AREA +<UE67F> \xF8\xE0 |0 # PRIVATE USE AREA +<UE680> \xF8\xE1 |0 # PRIVATE USE AREA +<UE681> \xF8\xE2 |0 # PRIVATE USE AREA +<UE682> \xF8\xE3 |0 # PRIVATE USE AREA +<UE683> \xF8\xE4 |0 # PRIVATE USE AREA +<UE684> \xF8\xE5 |0 # PRIVATE USE AREA +<UE685> \xF8\xE6 |0 # PRIVATE USE AREA +<UE686> \xF8\xE7 |0 # PRIVATE USE AREA +<UE687> \xF8\xE8 |0 # PRIVATE USE AREA +<UE688> \xF8\xE9 |0 # PRIVATE USE AREA +<UE689> \xF8\xEA |0 # PRIVATE USE AREA +<UE68A> \xF8\xEB |0 # PRIVATE USE AREA +<UE68B> \xF8\xEC |0 # PRIVATE USE AREA +<UE68C> \xF8\xED |0 # PRIVATE USE AREA +<UE68D> \xF8\xEE |0 # PRIVATE USE AREA +<UE68E> \xF8\xEF |0 # PRIVATE USE AREA +<UE68F> \xF8\xF0 |0 # PRIVATE USE AREA +<UE690> \xF8\xF1 |0 # PRIVATE USE AREA +<UE691> \xF8\xF2 |0 # PRIVATE USE AREA +<UE692> \xF8\xF3 |0 # PRIVATE USE AREA +<UE693> \xF8\xF4 |0 # PRIVATE USE AREA +<UE694> \xF8\xF5 |0 # PRIVATE USE AREA +<UE695> \xF8\xF6 |0 # PRIVATE USE AREA +<UE696> \xF8\xF7 |0 # PRIVATE USE AREA +<UE697> \xF8\xF8 |0 # PRIVATE USE AREA +<UE698> \xF8\xF9 |0 # PRIVATE USE AREA +<UE699> \xF8\xFA |0 # PRIVATE USE AREA +<UE69A> \xF8\xFB |0 # PRIVATE USE AREA +<UE69B> \xF8\xFC |0 # PRIVATE USE AREA +<UE69C> \xF9\x40 |0 # PRIVATE USE AREA +<UE69D> \xF9\x41 |0 # PRIVATE USE AREA +<UE69E> \xF9\x42 |0 # PRIVATE USE AREA +<UE69F> \xF9\x43 |0 # PRIVATE USE AREA +<UE6A0> \xF9\x44 |0 # PRIVATE USE AREA +<UE6A1> \xF9\x45 |0 # PRIVATE USE AREA +<UE6A2> \xF9\x46 |0 # PRIVATE USE AREA +<UE6A3> \xF9\x47 |0 # PRIVATE USE AREA +<UE6A4> \xF9\x48 |0 # PRIVATE USE AREA +<UE6A5> \xF9\x49 |0 # PRIVATE USE AREA +<UE6A6> \xF9\x4A |0 # PRIVATE USE AREA +<UE6A7> \xF9\x4B |0 # PRIVATE USE AREA +<UE6A8> \xF9\x4C |0 # PRIVATE USE AREA +<UE6A9> \xF9\x4D |0 # PRIVATE USE AREA +<UE6AA> \xF9\x4E |0 # PRIVATE USE AREA +<UE6AB> \xF9\x4F |0 # PRIVATE USE AREA +<UE6AC> \xF9\x50 |0 # PRIVATE USE AREA +<UE6AD> \xF9\x51 |0 # PRIVATE USE AREA +<UE6AE> \xF9\x52 |0 # PRIVATE USE AREA +<UE6AF> \xF9\x53 |0 # PRIVATE USE AREA +<UE6B0> \xF9\x54 |0 # PRIVATE USE AREA +<UE6B1> \xF9\x55 |0 # PRIVATE USE AREA +<UE6B2> \xF9\x56 |0 # PRIVATE USE AREA +<UE6B3> \xF9\x57 |0 # PRIVATE USE AREA +<UE6B4> \xF9\x58 |0 # PRIVATE USE AREA +<UE6B5> \xF9\x59 |0 # PRIVATE USE AREA +<UE6B6> \xF9\x5A |0 # PRIVATE USE AREA +<UE6B7> \xF9\x5B |0 # PRIVATE USE AREA +<UE6B8> \xF9\x5C |0 # PRIVATE USE AREA +<UE6B9> \xF9\x5D |0 # PRIVATE USE AREA +<UE6BA> \xF9\x5E |0 # PRIVATE USE AREA +<UE6BB> \xF9\x5F |0 # PRIVATE USE AREA +<UE6BC> \xF9\x60 |0 # PRIVATE USE AREA +<UE6BD> \xF9\x61 |0 # PRIVATE USE AREA +<UE6BE> \xF9\x62 |0 # PRIVATE USE AREA +<UE6BF> \xF9\x63 |0 # PRIVATE USE AREA +<UE6C0> \xF9\x64 |0 # PRIVATE USE AREA +<UE6C1> \xF9\x65 |0 # PRIVATE USE AREA +<UE6C2> \xF9\x66 |0 # PRIVATE USE AREA +<UE6C3> \xF9\x67 |0 # PRIVATE USE AREA +<UE6C4> \xF9\x68 |0 # PRIVATE USE AREA +<UE6C5> \xF9\x69 |0 # PRIVATE USE AREA +<UE6C6> \xF9\x6A |0 # PRIVATE USE AREA +<UE6C7> \xF9\x6B |0 # PRIVATE USE AREA +<UE6C8> \xF9\x6C |0 # PRIVATE USE AREA +<UE6C9> \xF9\x6D |0 # PRIVATE USE AREA +<UE6CA> \xF9\x6E |0 # PRIVATE USE AREA +<UE6CB> \xF9\x6F |0 # PRIVATE USE AREA +<UE6CC> \xF9\x70 |0 # PRIVATE USE AREA +<UE6CD> \xF9\x71 |0 # PRIVATE USE AREA +<UE6CE> \xF9\x72 |0 # PRIVATE USE AREA +<UE6CF> \xF9\x73 |0 # PRIVATE USE AREA +<UE6D0> \xF9\x74 |0 # PRIVATE USE AREA +<UE6D1> \xF9\x75 |0 # PRIVATE USE AREA +<UE6D2> \xF9\x76 |0 # PRIVATE USE AREA +<UE6D3> \xF9\x77 |0 # PRIVATE USE AREA +<UE6D4> \xF9\x78 |0 # PRIVATE USE AREA +<UE6D5> \xF9\x79 |0 # PRIVATE USE AREA +<UE6D6> \xF9\x7A |0 # PRIVATE USE AREA +<UE6D7> \xF9\x7B |0 # PRIVATE USE AREA +<UE6D8> \xF9\x7C |0 # PRIVATE USE AREA +<UE6D9> \xF9\x7D |0 # PRIVATE USE AREA +<UE6DA> \xF9\x7E |0 # PRIVATE USE AREA +<UE6DB> \xF9\x80 |0 # PRIVATE USE AREA +<UE6DC> \xF9\x81 |0 # PRIVATE USE AREA +<UE6DD> \xF9\x82 |0 # PRIVATE USE AREA +<UE6DE> \xF9\x83 |0 # PRIVATE USE AREA +<UE6DF> \xF9\x84 |0 # PRIVATE USE AREA +<UE6E0> \xF9\x85 |0 # PRIVATE USE AREA +<UE6E1> \xF9\x86 |0 # PRIVATE USE AREA +<UE6E2> \xF9\x87 |0 # PRIVATE USE AREA +<UE6E3> \xF9\x88 |0 # PRIVATE USE AREA +<UE6E4> \xF9\x89 |0 # PRIVATE USE AREA +<UE6E5> \xF9\x8A |0 # PRIVATE USE AREA +<UE6E6> \xF9\x8B |0 # PRIVATE USE AREA +<UE6E7> \xF9\x8C |0 # PRIVATE USE AREA +<UE6E8> \xF9\x8D |0 # PRIVATE USE AREA +<UE6E9> \xF9\x8E |0 # PRIVATE USE AREA +<UE6EA> \xF9\x8F |0 # PRIVATE USE AREA +<UE6EB> \xF9\x90 |0 # PRIVATE USE AREA +<UE6EC> \xF9\x91 |0 # PRIVATE USE AREA +<UE6ED> \xF9\x92 |0 # PRIVATE USE AREA +<UE6EE> \xF9\x93 |0 # PRIVATE USE AREA +<UE6EF> \xF9\x94 |0 # PRIVATE USE AREA +<UE6F0> \xF9\x95 |0 # PRIVATE USE AREA +<UE6F1> \xF9\x96 |0 # PRIVATE USE AREA +<UE6F2> \xF9\x97 |0 # PRIVATE USE AREA +<UE6F3> \xF9\x98 |0 # PRIVATE USE AREA +<UE6F4> \xF9\x99 |0 # PRIVATE USE AREA +<UE6F5> \xF9\x9A |0 # PRIVATE USE AREA +<UE6F6> \xF9\x9B |0 # PRIVATE USE AREA +<UE6F7> \xF9\x9C |0 # PRIVATE USE AREA +<UE6F8> \xF9\x9D |0 # PRIVATE USE AREA +<UE6F9> \xF9\x9E |0 # PRIVATE USE AREA +<UE6FA> \xF9\x9F |0 # PRIVATE USE AREA +<UE6FB> \xF9\xA0 |0 # PRIVATE USE AREA +<UE6FC> \xF9\xA1 |0 # PRIVATE USE AREA +<UE6FD> \xF9\xA2 |0 # PRIVATE USE AREA +<UE6FE> \xF9\xA3 |0 # PRIVATE USE AREA +<UE6FF> \xF9\xA4 |0 # PRIVATE USE AREA +<UE700> \xF9\xA5 |0 # PRIVATE USE AREA +<UE701> \xF9\xA6 |0 # PRIVATE USE AREA +<UE702> \xF9\xA7 |0 # PRIVATE USE AREA +<UE703> \xF9\xA8 |0 # PRIVATE USE AREA +<UE704> \xF9\xA9 |0 # PRIVATE USE AREA +<UE705> \xF9\xAA |0 # PRIVATE USE AREA +<UE706> \xF9\xAB |0 # PRIVATE USE AREA +<UE707> \xF9\xAC |0 # PRIVATE USE AREA +<UE708> \xF9\xAD |0 # PRIVATE USE AREA +<UE709> \xF9\xAE |0 # PRIVATE USE AREA +<UE70A> \xF9\xAF |0 # PRIVATE USE AREA +<UE70B> \xF9\xB0 |0 # PRIVATE USE AREA +<UE70C> \xF9\xB1 |0 # PRIVATE USE AREA +<UE70D> \xF9\xB2 |0 # PRIVATE USE AREA +<UE70E> \xF9\xB3 |0 # PRIVATE USE AREA +<UE70F> \xF9\xB4 |0 # PRIVATE USE AREA +<UE710> \xF9\xB5 |0 # PRIVATE USE AREA +<UE711> \xF9\xB6 |0 # PRIVATE USE AREA +<UE712> \xF9\xB7 |0 # PRIVATE USE AREA +<UE713> \xF9\xB8 |0 # PRIVATE USE AREA +<UE714> \xF9\xB9 |0 # PRIVATE USE AREA +<UE715> \xF9\xBA |0 # PRIVATE USE AREA +<UE716> \xF9\xBB |0 # PRIVATE USE AREA +<UE717> \xF9\xBC |0 # PRIVATE USE AREA +<UE718> \xF9\xBD |0 # PRIVATE USE AREA +<UE719> \xF9\xBE |0 # PRIVATE USE AREA +<UE71A> \xF9\xBF |0 # PRIVATE USE AREA +<UE71B> \xF9\xC0 |0 # PRIVATE USE AREA +<UE71C> \xF9\xC1 |0 # PRIVATE USE AREA +<UE71D> \xF9\xC2 |0 # PRIVATE USE AREA +<UE71E> \xF9\xC3 |0 # PRIVATE USE AREA +<UE71F> \xF9\xC4 |0 # PRIVATE USE AREA +<UE720> \xF9\xC5 |0 # PRIVATE USE AREA +<UE721> \xF9\xC6 |0 # PRIVATE USE AREA +<UE722> \xF9\xC7 |0 # PRIVATE USE AREA +<UE723> \xF9\xC8 |0 # PRIVATE USE AREA +<UE724> \xF9\xC9 |0 # PRIVATE USE AREA +<UE725> \xF9\xCA |0 # PRIVATE USE AREA +<UE726> \xF9\xCB |0 # PRIVATE USE AREA +<UE727> \xF9\xCC |0 # PRIVATE USE AREA +<UE728> \xF9\xCD |0 # PRIVATE USE AREA +<UE729> \xF9\xCE |0 # PRIVATE USE AREA +<UE72A> \xF9\xCF |0 # PRIVATE USE AREA +<UE72B> \xF9\xD0 |0 # PRIVATE USE AREA +<UE72C> \xF9\xD1 |0 # PRIVATE USE AREA +<UE72D> \xF9\xD2 |0 # PRIVATE USE AREA +<UE72E> \xF9\xD3 |0 # PRIVATE USE AREA +<UE72F> \xF9\xD4 |0 # PRIVATE USE AREA +<UE730> \xF9\xD5 |0 # PRIVATE USE AREA +<UE731> \xF9\xD6 |0 # PRIVATE USE AREA +<UE732> \xF9\xD7 |0 # PRIVATE USE AREA +<UE733> \xF9\xD8 |0 # PRIVATE USE AREA +<UE734> \xF9\xD9 |0 # PRIVATE USE AREA +<UE735> \xF9\xDA |0 # PRIVATE USE AREA +<UE736> \xF9\xDB |0 # PRIVATE USE AREA +<UE737> \xF9\xDC |0 # PRIVATE USE AREA +<UE738> \xF9\xDD |0 # PRIVATE USE AREA +<UE739> \xF9\xDE |0 # PRIVATE USE AREA +<UE73A> \xF9\xDF |0 # PRIVATE USE AREA +<UE73B> \xF9\xE0 |0 # PRIVATE USE AREA +<UE73C> \xF9\xE1 |0 # PRIVATE USE AREA +<UE73D> \xF9\xE2 |0 # PRIVATE USE AREA +<UE73E> \xF9\xE3 |0 # PRIVATE USE AREA +<UE73F> \xF9\xE4 |0 # PRIVATE USE AREA +<UE740> \xF9\xE5 |0 # PRIVATE USE AREA +<UE741> \xF9\xE6 |0 # PRIVATE USE AREA +<UE742> \xF9\xE7 |0 # PRIVATE USE AREA +<UE743> \xF9\xE8 |0 # PRIVATE USE AREA +<UE744> \xF9\xE9 |0 # PRIVATE USE AREA +<UE745> \xF9\xEA |0 # PRIVATE USE AREA +<UE746> \xF9\xEB |0 # PRIVATE USE AREA +<UE747> \xF9\xEC |0 # PRIVATE USE AREA +<UE748> \xF9\xED |0 # PRIVATE USE AREA +<UE749> \xF9\xEE |0 # PRIVATE USE AREA +<UE74A> \xF9\xEF |0 # PRIVATE USE AREA +<UE74B> \xF9\xF0 |0 # PRIVATE USE AREA +<UE74C> \xF9\xF1 |0 # PRIVATE USE AREA +<UE74D> \xF9\xF2 |0 # PRIVATE USE AREA +<UE74E> \xF9\xF3 |0 # PRIVATE USE AREA +<UE74F> \xF9\xF4 |0 # PRIVATE USE AREA +<UE750> \xF9\xF5 |0 # PRIVATE USE AREA +<UE751> \xF9\xF6 |0 # PRIVATE USE AREA +<UE752> \xF9\xF7 |0 # PRIVATE USE AREA +<UE753> \xF9\xF8 |0 # PRIVATE USE AREA +<UE754> \xF9\xF9 |0 # PRIVATE USE AREA +<UE755> \xF9\xFA |0 # PRIVATE USE AREA +<UE756> \xF9\xFB |0 # PRIVATE USE AREA +<UE757> \xF9\xFC |0 # PRIVATE USE AREA +<UF8F0> \xA0 |0 # +<UF8F1> \xFD |0 # +<UF8F2> \xFE |0 # +<UF8F3> \xFF |0 # <UF929> \xFA\xE0 |0 # CJK COMPATIBILITY IDEOGRAPH +<UF929> \xED\xC4 |3 # CJK COMPATIBILITY IDEOGRAPH <UF9DC> \xFB\xE9 |0 # CJK COMPATIBILITY IDEOGRAPH +<UF9DC> \xEE\xCD |3 # CJK COMPATIBILITY IDEOGRAPH <UFA0E> \xFA\x90 |0 # CJK COMPATIBILITY IDEOGRAPH +<UFA0E> \xED\x73 |3 # CJK COMPATIBILITY IDEOGRAPH <UFA0F> \xFA\x9B |0 # CJK COMPATIBILITY IDEOGRAPH +<UFA0F> \xED\x7E |3 # CJK COMPATIBILITY IDEOGRAPH <UFA10> \xFA\x9C |0 # CJK COMPATIBILITY IDEOGRAPH +<UFA10> \xED\x80 |3 # CJK COMPATIBILITY IDEOGRAPH <UFA11> \xFA\xB1 |0 # CJK COMPATIBILITY IDEOGRAPH +<UFA11> \xED\x95 |3 # CJK COMPATIBILITY IDEOGRAPH <UFA12> \xFA\xD8 |0 # CJK COMPATIBILITY IDEOGRAPH +<UFA12> \xED\xBC |3 # CJK COMPATIBILITY IDEOGRAPH <UFA13> \xFA\xE8 |0 # CJK COMPATIBILITY IDEOGRAPH +<UFA13> \xED\xCC |3 # CJK COMPATIBILITY IDEOGRAPH <UFA14> \xFA\xEA |0 # CJK COMPATIBILITY IDEOGRAPH +<UFA14> \xED\xCE |3 # CJK COMPATIBILITY IDEOGRAPH <UFA15> \xFB\x58 |0 # CJK COMPATIBILITY IDEOGRAPH +<UFA15> \xED\xF9 |3 # CJK COMPATIBILITY IDEOGRAPH <UFA16> \xFB\x5E |0 # CJK COMPATIBILITY IDEOGRAPH +<UFA16> \xEE\x42 |3 # CJK COMPATIBILITY IDEOGRAPH <UFA17> \xFB\x75 |0 # CJK COMPATIBILITY IDEOGRAPH +<UFA17> \xEE\x59 |3 # CJK COMPATIBILITY IDEOGRAPH <UFA18> \xFB\x7D |0 # CJK COMPATIBILITY IDEOGRAPH +<UFA18> \xEE\x61 |3 # CJK COMPATIBILITY IDEOGRAPH <UFA19> \xFB\x7E |0 # CJK COMPATIBILITY IDEOGRAPH +<UFA19> \xEE\x62 |3 # CJK COMPATIBILITY IDEOGRAPH <UFA1A> \xFB\x80 |0 # CJK COMPATIBILITY IDEOGRAPH +<UFA1A> \xEE\x63 |3 # CJK COMPATIBILITY IDEOGRAPH <UFA1B> \xFB\x82 |0 # CJK COMPATIBILITY IDEOGRAPH +<UFA1B> \xEE\x65 |3 # CJK COMPATIBILITY IDEOGRAPH <UFA1C> \xFB\x86 |0 # CJK COMPATIBILITY IDEOGRAPH +<UFA1C> \xEE\x69 |3 # CJK COMPATIBILITY IDEOGRAPH <UFA1D> \xFB\x89 |0 # CJK COMPATIBILITY IDEOGRAPH +<UFA1D> \xEE\x6C |3 # CJK COMPATIBILITY IDEOGRAPH <UFA1E> \xFB\x92 |0 # CJK COMPATIBILITY IDEOGRAPH +<UFA1E> \xEE\x75 |3 # CJK COMPATIBILITY IDEOGRAPH <UFA1F> \xFB\x9D |0 # CJK COMPATIBILITY IDEOGRAPH +<UFA1F> \xEE\x81 |3 # CJK COMPATIBILITY IDEOGRAPH <UFA20> \xFB\x9F |0 # CJK COMPATIBILITY IDEOGRAPH +<UFA20> \xEE\x83 |3 # CJK COMPATIBILITY IDEOGRAPH <UFA21> \xFB\xA0 |0 # CJK COMPATIBILITY IDEOGRAPH +<UFA21> \xEE\x84 |3 # CJK COMPATIBILITY IDEOGRAPH <UFA22> \xFB\xA9 |0 # CJK COMPATIBILITY IDEOGRAPH +<UFA22> \xEE\x8D |3 # CJK COMPATIBILITY IDEOGRAPH <UFA23> \xFB\xB1 |0 # CJK COMPATIBILITY IDEOGRAPH +<UFA23> \xEE\x95 |3 # CJK COMPATIBILITY IDEOGRAPH <UFA24> \xFB\xB3 |0 # CJK COMPATIBILITY IDEOGRAPH +<UFA24> \xEE\x97 |3 # CJK COMPATIBILITY IDEOGRAPH <UFA25> \xFB\xB4 |0 # CJK COMPATIBILITY IDEOGRAPH +<UFA25> \xEE\x98 |3 # CJK COMPATIBILITY IDEOGRAPH <UFA26> \xFB\xB7 |0 # CJK COMPATIBILITY IDEOGRAPH +<UFA26> \xEE\x9B |3 # CJK COMPATIBILITY IDEOGRAPH <UFA27> \xFB\xD3 |0 # CJK COMPATIBILITY IDEOGRAPH +<UFA27> \xEE\xB7 |3 # CJK COMPATIBILITY IDEOGRAPH <UFA28> \xFB\xDA |0 # CJK COMPATIBILITY IDEOGRAPH +<UFA28> \xEE\xBE |3 # CJK COMPATIBILITY IDEOGRAPH <UFA29> \xFB\xEA |0 # CJK COMPATIBILITY IDEOGRAPH +<UFA29> \xEE\xCE |3 # CJK COMPATIBILITY IDEOGRAPH <UFA2A> \xFB\xF6 |0 # CJK COMPATIBILITY IDEOGRAPH +<UFA2A> \xEE\xDA |3 # CJK COMPATIBILITY IDEOGRAPH <UFA2B> \xFB\xF7 |0 # CJK COMPATIBILITY IDEOGRAPH +<UFA2B> \xEE\xDB |3 # CJK COMPATIBILITY IDEOGRAPH <UFA2C> \xFB\xF9 |0 # CJK COMPATIBILITY IDEOGRAPH +<UFA2C> \xEE\xDD |3 # CJK COMPATIBILITY IDEOGRAPH <UFA2D> \xFC\x49 |0 # CJK COMPATIBILITY IDEOGRAPH +<UFA2D> \xEE\xEA |3 # CJK COMPATIBILITY IDEOGRAPH <UFF01> \x81\x49 |0 # FULLWIDTH EXCLAMATION MARK <UFF02> \xFA\x57 |0 # FULLWIDTH QUOTATION MARK +<UFF02> \xEE\xFC |3 # FULLWIDTH QUOTATION MARK <UFF03> \x81\x94 |0 # FULLWIDTH NUMBER SIGN <UFF04> \x81\x90 |0 # FULLWIDTH DOLLAR SIGN <UFF05> \x81\x93 |0 # FULLWIDTH PERCENT SIGN <UFF06> \x81\x95 |0 # FULLWIDTH AMPERSAND <UFF07> \xFA\x56 |0 # FULLWIDTH APOSTROPHE +<UFF07> \xEE\xFB |3 # FULLWIDTH APOSTROPHE <UFF08> \x81\x69 |0 # FULLWIDTH LEFT PARENTHESIS <UFF09> \x81\x6A |0 # FULLWIDTH RIGHT PARENTHESIS <UFF0A> \x81\x96 |0 # FULLWIDTH ASTERISK @@ -7522,8 +9807,11 @@ CHARMAP <UFF9F> \xDF |0 # HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK <UFFE0> \x81\x91 |0 # FULLWIDTH CENT SIGN <UFFE1> \x81\x92 |0 # FULLWIDTH POUND SIGN -<UFFE2> \xFA\x54 |0 # FULLWIDTH NOT SIGN +<UFFE2> \x81\xCA |0 # FULLWIDTH NOT SIGN +<UFFE2> \xEE\xF9 |3 # FULLWIDTH NOT SIGN +<UFFE2> \xFA\x54 |3 # FULLWIDTH NOT SIGN <UFFE3> \x81\x50 |0 # FULLWIDTH MACRON <UFFE4> \xFA\x55 |0 # FULLWIDTH BROKEN BAR +<UFFE4> \xEE\xFA |3 # FULLWIDTH BROKEN BAR <UFFE5> \x81\x8F |0 # FULLWIDTH YEN SIGN END CHARMAP diff --git a/ext/Encode/ucm/cp936.ucm b/ext/Encode/ucm/cp936.ucm index d8247dcd28..d71329582d 100644 --- a/ext/Encode/ucm/cp936.ucm +++ b/ext/Encode/ucm/cp936.ucm @@ -1,8 +1,8 @@ # -# $Id: cp936.ucm,v 1.20 2002/04/04 19:50:53 dankogai Exp $ +# $Id: cp936.ucm,v 1.21 2002/10/20 15:44:00 dankogai Exp $ # # Original table can be obtained at -# http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP936.TXT +# http://www.microsoft.com/typography/unicode/936.txt # <code_set_name> "cp936" <mb_cur_min> 1 @@ -137,6 +137,7 @@ CHARMAP <U007D> \x7D |0 # RIGHT CURLY BRACKET <U007E> \x7E |0 # TILDE <U007F> \x7F |0 # DELETE +<U0080> \x80 |0 # <U00A4> \xA1\xE8 |0 # CURRENCY SIGN <U00A7> \xA1\xEC |0 # SECTION SIGN <U00A8> \xA1\xA7 |0 # DIAERESIS @@ -310,7 +311,6 @@ CHARMAP <U2033> \xA1\xE5 |0 # DOUBLE PRIME <U2035> \xA8\x46 |0 # REVERSED PRIME <U203B> \xA1\xF9 |0 # REFERENCE MARK -<U20AC> \x80 |0 # EURO SIGN <U2103> \xA1\xE6 |0 # DEGREE CELSIUS <U2105> \xA8\x47 |0 # CARE OF <U2109> \xA8\x48 |0 # DEGREE FAHRENHEIT @@ -21756,6 +21756,2156 @@ CHARMAP <U9FA3> \xFD\x99 |0 # CJK UNIFIED IDEOGRAPH <U9FA4> \xFD\x9A |0 # CJK UNIFIED IDEOGRAPH <U9FA5> \xFD\x9B |0 # CJK UNIFIED IDEOGRAPH +<UE000> \xAA\xA1 |0 # +<UE001> \xAA\xA2 |0 # +<UE002> \xAA\xA3 |0 # +<UE003> \xAA\xA4 |0 # +<UE004> \xAA\xA5 |0 # +<UE005> \xAA\xA6 |0 # +<UE006> \xAA\xA7 |0 # +<UE007> \xAA\xA8 |0 # +<UE008> \xAA\xA9 |0 # +<UE009> \xAA\xAA |0 # +<UE00A> \xAA\xAB |0 # +<UE00B> \xAA\xAC |0 # +<UE00C> \xAA\xAD |0 # +<UE00D> \xAA\xAE |0 # +<UE00E> \xAA\xAF |0 # +<UE00F> \xAA\xB0 |0 # +<UE010> \xAA\xB1 |0 # +<UE011> \xAA\xB2 |0 # +<UE012> \xAA\xB3 |0 # +<UE013> \xAA\xB4 |0 # +<UE014> \xAA\xB5 |0 # +<UE015> \xAA\xB6 |0 # +<UE016> \xAA\xB7 |0 # +<UE017> \xAA\xB8 |0 # +<UE018> \xAA\xB9 |0 # +<UE019> \xAA\xBA |0 # +<UE01A> \xAA\xBB |0 # +<UE01B> \xAA\xBC |0 # +<UE01C> \xAA\xBD |0 # +<UE01D> \xAA\xBE |0 # +<UE01E> \xAA\xBF |0 # +<UE01F> \xAA\xC0 |0 # +<UE020> \xAA\xC1 |0 # +<UE021> \xAA\xC2 |0 # +<UE022> \xAA\xC3 |0 # +<UE023> \xAA\xC4 |0 # +<UE024> \xAA\xC5 |0 # +<UE025> \xAA\xC6 |0 # +<UE026> \xAA\xC7 |0 # +<UE027> \xAA\xC8 |0 # +<UE028> \xAA\xC9 |0 # +<UE029> \xAA\xCA |0 # +<UE02A> \xAA\xCB |0 # +<UE02B> \xAA\xCC |0 # +<UE02C> \xAA\xCD |0 # +<UE02D> \xAA\xCE |0 # +<UE02E> \xAA\xCF |0 # +<UE02F> \xAA\xD0 |0 # +<UE030> \xAA\xD1 |0 # +<UE031> \xAA\xD2 |0 # +<UE032> \xAA\xD3 |0 # +<UE033> \xAA\xD4 |0 # +<UE034> \xAA\xD5 |0 # +<UE035> \xAA\xD6 |0 # +<UE036> \xAA\xD7 |0 # +<UE037> \xAA\xD8 |0 # +<UE038> \xAA\xD9 |0 # +<UE039> \xAA\xDA |0 # +<UE03A> \xAA\xDB |0 # +<UE03B> \xAA\xDC |0 # +<UE03C> \xAA\xDD |0 # +<UE03D> \xAA\xDE |0 # +<UE03E> \xAA\xDF |0 # +<UE03F> \xAA\xE0 |0 # +<UE040> \xAA\xE1 |0 # +<UE041> \xAA\xE2 |0 # +<UE042> \xAA\xE3 |0 # +<UE043> \xAA\xE4 |0 # +<UE044> \xAA\xE5 |0 # +<UE045> \xAA\xE6 |0 # +<UE046> \xAA\xE7 |0 # +<UE047> \xAA\xE8 |0 # +<UE048> \xAA\xE9 |0 # +<UE049> \xAA\xEA |0 # +<UE04A> \xAA\xEB |0 # +<UE04B> \xAA\xEC |0 # +<UE04C> \xAA\xED |0 # +<UE04D> \xAA\xEE |0 # +<UE04E> \xAA\xEF |0 # +<UE04F> \xAA\xF0 |0 # +<UE050> \xAA\xF1 |0 # +<UE051> \xAA\xF2 |0 # +<UE052> \xAA\xF3 |0 # +<UE053> \xAA\xF4 |0 # +<UE054> \xAA\xF5 |0 # +<UE055> \xAA\xF6 |0 # +<UE056> \xAA\xF7 |0 # +<UE057> \xAA\xF8 |0 # +<UE058> \xAA\xF9 |0 # +<UE059> \xAA\xFA |0 # +<UE05A> \xAA\xFB |0 # +<UE05B> \xAA\xFC |0 # +<UE05C> \xAA\xFD |0 # +<UE05D> \xAA\xFE |0 # +<UE05E> \xAB\xA1 |0 # +<UE05F> \xAB\xA2 |0 # +<UE060> \xAB\xA3 |0 # +<UE061> \xAB\xA4 |0 # +<UE062> \xAB\xA5 |0 # +<UE063> \xAB\xA6 |0 # +<UE064> \xAB\xA7 |0 # +<UE065> \xAB\xA8 |0 # +<UE066> \xAB\xA9 |0 # +<UE067> \xAB\xAA |0 # +<UE068> \xAB\xAB |0 # +<UE069> \xAB\xAC |0 # +<UE06A> \xAB\xAD |0 # +<UE06B> \xAB\xAE |0 # +<UE06C> \xAB\xAF |0 # +<UE06D> \xAB\xB0 |0 # +<UE06E> \xAB\xB1 |0 # +<UE06F> \xAB\xB2 |0 # +<UE070> \xAB\xB3 |0 # +<UE071> \xAB\xB4 |0 # +<UE072> \xAB\xB5 |0 # +<UE073> \xAB\xB6 |0 # +<UE074> \xAB\xB7 |0 # +<UE075> \xAB\xB8 |0 # +<UE076> \xAB\xB9 |0 # +<UE077> \xAB\xBA |0 # +<UE078> \xAB\xBB |0 # +<UE079> \xAB\xBC |0 # +<UE07A> \xAB\xBD |0 # +<UE07B> \xAB\xBE |0 # +<UE07C> \xAB\xBF |0 # +<UE07D> \xAB\xC0 |0 # +<UE07E> \xAB\xC1 |0 # +<UE07F> \xAB\xC2 |0 # +<UE080> \xAB\xC3 |0 # +<UE081> \xAB\xC4 |0 # +<UE082> \xAB\xC5 |0 # +<UE083> \xAB\xC6 |0 # +<UE084> \xAB\xC7 |0 # +<UE085> \xAB\xC8 |0 # +<UE086> \xAB\xC9 |0 # +<UE087> \xAB\xCA |0 # +<UE088> \xAB\xCB |0 # +<UE089> \xAB\xCC |0 # +<UE08A> \xAB\xCD |0 # +<UE08B> \xAB\xCE |0 # +<UE08C> \xAB\xCF |0 # +<UE08D> \xAB\xD0 |0 # +<UE08E> \xAB\xD1 |0 # +<UE08F> \xAB\xD2 |0 # +<UE090> \xAB\xD3 |0 # +<UE091> \xAB\xD4 |0 # +<UE092> \xAB\xD5 |0 # +<UE093> \xAB\xD6 |0 # +<UE094> \xAB\xD7 |0 # +<UE095> \xAB\xD8 |0 # +<UE096> \xAB\xD9 |0 # +<UE097> \xAB\xDA |0 # +<UE098> \xAB\xDB |0 # +<UE099> \xAB\xDC |0 # +<UE09A> \xAB\xDD |0 # +<UE09B> \xAB\xDE |0 # +<UE09C> \xAB\xDF |0 # +<UE09D> \xAB\xE0 |0 # +<UE09E> \xAB\xE1 |0 # +<UE09F> \xAB\xE2 |0 # +<UE0A0> \xAB\xE3 |0 # +<UE0A1> \xAB\xE4 |0 # +<UE0A2> \xAB\xE5 |0 # +<UE0A3> \xAB\xE6 |0 # +<UE0A4> \xAB\xE7 |0 # +<UE0A5> \xAB\xE8 |0 # +<UE0A6> \xAB\xE9 |0 # +<UE0A7> \xAB\xEA |0 # +<UE0A8> \xAB\xEB |0 # +<UE0A9> \xAB\xEC |0 # +<UE0AA> \xAB\xED |0 # +<UE0AB> \xAB\xEE |0 # +<UE0AC> \xAB\xEF |0 # +<UE0AD> \xAB\xF0 |0 # +<UE0AE> \xAB\xF1 |0 # +<UE0AF> \xAB\xF2 |0 # +<UE0B0> \xAB\xF3 |0 # +<UE0B1> \xAB\xF4 |0 # +<UE0B2> \xAB\xF5 |0 # +<UE0B3> \xAB\xF6 |0 # +<UE0B4> \xAB\xF7 |0 # +<UE0B5> \xAB\xF8 |0 # +<UE0B6> \xAB\xF9 |0 # +<UE0B7> \xAB\xFA |0 # +<UE0B8> \xAB\xFB |0 # +<UE0B9> \xAB\xFC |0 # +<UE0BA> \xAB\xFD |0 # +<UE0BB> \xAB\xFE |0 # +<UE0BC> \xAC\xA1 |0 # +<UE0BD> \xAC\xA2 |0 # +<UE0BE> \xAC\xA3 |0 # +<UE0BF> \xAC\xA4 |0 # +<UE0C0> \xAC\xA5 |0 # +<UE0C1> \xAC\xA6 |0 # +<UE0C2> \xAC\xA7 |0 # +<UE0C3> \xAC\xA8 |0 # +<UE0C4> \xAC\xA9 |0 # +<UE0C5> \xAC\xAA |0 # +<UE0C6> \xAC\xAB |0 # +<UE0C7> \xAC\xAC |0 # +<UE0C8> \xAC\xAD |0 # +<UE0C9> \xAC\xAE |0 # +<UE0CA> \xAC\xAF |0 # +<UE0CB> \xAC\xB0 |0 # +<UE0CC> \xAC\xB1 |0 # +<UE0CD> \xAC\xB2 |0 # +<UE0CE> \xAC\xB3 |0 # +<UE0CF> \xAC\xB4 |0 # +<UE0D0> \xAC\xB5 |0 # +<UE0D1> \xAC\xB6 |0 # +<UE0D2> \xAC\xB7 |0 # +<UE0D3> \xAC\xB8 |0 # +<UE0D4> \xAC\xB9 |0 # +<UE0D5> \xAC\xBA |0 # +<UE0D6> \xAC\xBB |0 # +<UE0D7> \xAC\xBC |0 # +<UE0D8> \xAC\xBD |0 # +<UE0D9> \xAC\xBE |0 # +<UE0DA> \xAC\xBF |0 # +<UE0DB> \xAC\xC0 |0 # +<UE0DC> \xAC\xC1 |0 # +<UE0DD> \xAC\xC2 |0 # +<UE0DE> \xAC\xC3 |0 # +<UE0DF> \xAC\xC4 |0 # +<UE0E0> \xAC\xC5 |0 # +<UE0E1> \xAC\xC6 |0 # +<UE0E2> \xAC\xC7 |0 # +<UE0E3> \xAC\xC8 |0 # +<UE0E4> \xAC\xC9 |0 # +<UE0E5> \xAC\xCA |0 # +<UE0E6> \xAC\xCB |0 # +<UE0E7> \xAC\xCC |0 # +<UE0E8> \xAC\xCD |0 # +<UE0E9> \xAC\xCE |0 # +<UE0EA> \xAC\xCF |0 # +<UE0EB> \xAC\xD0 |0 # +<UE0EC> \xAC\xD1 |0 # +<UE0ED> \xAC\xD2 |0 # +<UE0EE> \xAC\xD3 |0 # +<UE0EF> \xAC\xD4 |0 # +<UE0F0> \xAC\xD5 |0 # +<UE0F1> \xAC\xD6 |0 # +<UE0F2> \xAC\xD7 |0 # +<UE0F3> \xAC\xD8 |0 # +<UE0F4> \xAC\xD9 |0 # +<UE0F5> \xAC\xDA |0 # +<UE0F6> \xAC\xDB |0 # +<UE0F7> \xAC\xDC |0 # +<UE0F8> \xAC\xDD |0 # +<UE0F9> \xAC\xDE |0 # +<UE0FA> \xAC\xDF |0 # +<UE0FB> \xAC\xE0 |0 # +<UE0FC> \xAC\xE1 |0 # +<UE0FD> \xAC\xE2 |0 # +<UE0FE> \xAC\xE3 |0 # +<UE0FF> \xAC\xE4 |0 # +<UE100> \xAC\xE5 |0 # +<UE101> \xAC\xE6 |0 # +<UE102> \xAC\xE7 |0 # +<UE103> \xAC\xE8 |0 # +<UE104> \xAC\xE9 |0 # +<UE105> \xAC\xEA |0 # +<UE106> \xAC\xEB |0 # +<UE107> \xAC\xEC |0 # +<UE108> \xAC\xED |0 # +<UE109> \xAC\xEE |0 # +<UE10A> \xAC\xEF |0 # +<UE10B> \xAC\xF0 |0 # +<UE10C> \xAC\xF1 |0 # +<UE10D> \xAC\xF2 |0 # +<UE10E> \xAC\xF3 |0 # +<UE10F> \xAC\xF4 |0 # +<UE110> \xAC\xF5 |0 # +<UE111> \xAC\xF6 |0 # +<UE112> \xAC\xF7 |0 # +<UE113> \xAC\xF8 |0 # +<UE114> \xAC\xF9 |0 # +<UE115> \xAC\xFA |0 # +<UE116> \xAC\xFB |0 # +<UE117> \xAC\xFC |0 # +<UE118> \xAC\xFD |0 # +<UE119> \xAC\xFE |0 # +<UE11A> \xAD\xA1 |0 # +<UE11B> \xAD\xA2 |0 # +<UE11C> \xAD\xA3 |0 # +<UE11D> \xAD\xA4 |0 # +<UE11E> \xAD\xA5 |0 # +<UE11F> \xAD\xA6 |0 # +<UE120> \xAD\xA7 |0 # +<UE121> \xAD\xA8 |0 # +<UE122> \xAD\xA9 |0 # +<UE123> \xAD\xAA |0 # +<UE124> \xAD\xAB |0 # +<UE125> \xAD\xAC |0 # +<UE126> \xAD\xAD |0 # +<UE127> \xAD\xAE |0 # +<UE128> \xAD\xAF |0 # +<UE129> \xAD\xB0 |0 # +<UE12A> \xAD\xB1 |0 # +<UE12B> \xAD\xB2 |0 # +<UE12C> \xAD\xB3 |0 # +<UE12D> \xAD\xB4 |0 # +<UE12E> \xAD\xB5 |0 # +<UE12F> \xAD\xB6 |0 # +<UE130> \xAD\xB7 |0 # +<UE131> \xAD\xB8 |0 # +<UE132> \xAD\xB9 |0 # +<UE133> \xAD\xBA |0 # +<UE134> \xAD\xBB |0 # +<UE135> \xAD\xBC |0 # +<UE136> \xAD\xBD |0 # +<UE137> \xAD\xBE |0 # +<UE138> \xAD\xBF |0 # +<UE139> \xAD\xC0 |0 # +<UE13A> \xAD\xC1 |0 # +<UE13B> \xAD\xC2 |0 # +<UE13C> \xAD\xC3 |0 # +<UE13D> \xAD\xC4 |0 # +<UE13E> \xAD\xC5 |0 # +<UE13F> \xAD\xC6 |0 # +<UE140> \xAD\xC7 |0 # +<UE141> \xAD\xC8 |0 # +<UE142> \xAD\xC9 |0 # +<UE143> \xAD\xCA |0 # +<UE144> \xAD\xCB |0 # +<UE145> \xAD\xCC |0 # +<UE146> \xAD\xCD |0 # +<UE147> \xAD\xCE |0 # +<UE148> \xAD\xCF |0 # +<UE149> \xAD\xD0 |0 # +<UE14A> \xAD\xD1 |0 # +<UE14B> \xAD\xD2 |0 # +<UE14C> \xAD\xD3 |0 # +<UE14D> \xAD\xD4 |0 # +<UE14E> \xAD\xD5 |0 # +<UE14F> \xAD\xD6 |0 # +<UE150> \xAD\xD7 |0 # +<UE151> \xAD\xD8 |0 # +<UE152> \xAD\xD9 |0 # +<UE153> \xAD\xDA |0 # +<UE154> \xAD\xDB |0 # +<UE155> \xAD\xDC |0 # +<UE156> \xAD\xDD |0 # +<UE157> \xAD\xDE |0 # +<UE158> \xAD\xDF |0 # +<UE159> \xAD\xE0 |0 # +<UE15A> \xAD\xE1 |0 # +<UE15B> \xAD\xE2 |0 # +<UE15C> \xAD\xE3 |0 # +<UE15D> \xAD\xE4 |0 # +<UE15E> \xAD\xE5 |0 # +<UE15F> \xAD\xE6 |0 # +<UE160> \xAD\xE7 |0 # +<UE161> \xAD\xE8 |0 # +<UE162> \xAD\xE9 |0 # +<UE163> \xAD\xEA |0 # +<UE164> \xAD\xEB |0 # +<UE165> \xAD\xEC |0 # +<UE166> \xAD\xED |0 # +<UE167> \xAD\xEE |0 # +<UE168> \xAD\xEF |0 # +<UE169> \xAD\xF0 |0 # +<UE16A> \xAD\xF1 |0 # +<UE16B> \xAD\xF2 |0 # +<UE16C> \xAD\xF3 |0 # +<UE16D> \xAD\xF4 |0 # +<UE16E> \xAD\xF5 |0 # +<UE16F> \xAD\xF6 |0 # +<UE170> \xAD\xF7 |0 # +<UE171> \xAD\xF8 |0 # +<UE172> \xAD\xF9 |0 # +<UE173> \xAD\xFA |0 # +<UE174> \xAD\xFB |0 # +<UE175> \xAD\xFC |0 # +<UE176> \xAD\xFD |0 # +<UE177> \xAD\xFE |0 # +<UE178> \xAE\xA1 |0 # +<UE179> \xAE\xA2 |0 # +<UE17A> \xAE\xA3 |0 # +<UE17B> \xAE\xA4 |0 # +<UE17C> \xAE\xA5 |0 # +<UE17D> \xAE\xA6 |0 # +<UE17E> \xAE\xA7 |0 # +<UE17F> \xAE\xA8 |0 # +<UE180> \xAE\xA9 |0 # +<UE181> \xAE\xAA |0 # +<UE182> \xAE\xAB |0 # +<UE183> \xAE\xAC |0 # +<UE184> \xAE\xAD |0 # +<UE185> \xAE\xAE |0 # +<UE186> \xAE\xAF |0 # +<UE187> \xAE\xB0 |0 # +<UE188> \xAE\xB1 |0 # +<UE189> \xAE\xB2 |0 # +<UE18A> \xAE\xB3 |0 # +<UE18B> \xAE\xB4 |0 # +<UE18C> \xAE\xB5 |0 # +<UE18D> \xAE\xB6 |0 # +<UE18E> \xAE\xB7 |0 # +<UE18F> \xAE\xB8 |0 # +<UE190> \xAE\xB9 |0 # +<UE191> \xAE\xBA |0 # +<UE192> \xAE\xBB |0 # +<UE193> \xAE\xBC |0 # +<UE194> \xAE\xBD |0 # +<UE195> \xAE\xBE |0 # +<UE196> \xAE\xBF |0 # +<UE197> \xAE\xC0 |0 # +<UE198> \xAE\xC1 |0 # +<UE199> \xAE\xC2 |0 # +<UE19A> \xAE\xC3 |0 # +<UE19B> \xAE\xC4 |0 # +<UE19C> \xAE\xC5 |0 # +<UE19D> \xAE\xC6 |0 # +<UE19E> \xAE\xC7 |0 # +<UE19F> \xAE\xC8 |0 # +<UE1A0> \xAE\xC9 |0 # +<UE1A1> \xAE\xCA |0 # +<UE1A2> \xAE\xCB |0 # +<UE1A3> \xAE\xCC |0 # +<UE1A4> \xAE\xCD |0 # +<UE1A5> \xAE\xCE |0 # +<UE1A6> \xAE\xCF |0 # +<UE1A7> \xAE\xD0 |0 # +<UE1A8> \xAE\xD1 |0 # +<UE1A9> \xAE\xD2 |0 # +<UE1AA> \xAE\xD3 |0 # +<UE1AB> \xAE\xD4 |0 # +<UE1AC> \xAE\xD5 |0 # +<UE1AD> \xAE\xD6 |0 # +<UE1AE> \xAE\xD7 |0 # +<UE1AF> \xAE\xD8 |0 # +<UE1B0> \xAE\xD9 |0 # +<UE1B1> \xAE\xDA |0 # +<UE1B2> \xAE\xDB |0 # +<UE1B3> \xAE\xDC |0 # +<UE1B4> \xAE\xDD |0 # +<UE1B5> \xAE\xDE |0 # +<UE1B6> \xAE\xDF |0 # +<UE1B7> \xAE\xE0 |0 # +<UE1B8> \xAE\xE1 |0 # +<UE1B9> \xAE\xE2 |0 # +<UE1BA> \xAE\xE3 |0 # +<UE1BB> \xAE\xE4 |0 # +<UE1BC> \xAE\xE5 |0 # +<UE1BD> \xAE\xE6 |0 # +<UE1BE> \xAE\xE7 |0 # +<UE1BF> \xAE\xE8 |0 # +<UE1C0> \xAE\xE9 |0 # +<UE1C1> \xAE\xEA |0 # +<UE1C2> \xAE\xEB |0 # +<UE1C3> \xAE\xEC |0 # +<UE1C4> \xAE\xED |0 # +<UE1C5> \xAE\xEE |0 # +<UE1C6> \xAE\xEF |0 # +<UE1C7> \xAE\xF0 |0 # +<UE1C8> \xAE\xF1 |0 # +<UE1C9> \xAE\xF2 |0 # +<UE1CA> \xAE\xF3 |0 # +<UE1CB> \xAE\xF4 |0 # +<UE1CC> \xAE\xF5 |0 # +<UE1CD> \xAE\xF6 |0 # +<UE1CE> \xAE\xF7 |0 # +<UE1CF> \xAE\xF8 |0 # +<UE1D0> \xAE\xF9 |0 # +<UE1D1> \xAE\xFA |0 # +<UE1D2> \xAE\xFB |0 # +<UE1D3> \xAE\xFC |0 # +<UE1D4> \xAE\xFD |0 # +<UE1D5> \xAE\xFE |0 # +<UE1D6> \xAF\xA1 |0 # +<UE1D7> \xAF\xA2 |0 # +<UE1D8> \xAF\xA3 |0 # +<UE1D9> \xAF\xA4 |0 # +<UE1DA> \xAF\xA5 |0 # +<UE1DB> \xAF\xA6 |0 # +<UE1DC> \xAF\xA7 |0 # +<UE1DD> \xAF\xA8 |0 # +<UE1DE> \xAF\xA9 |0 # +<UE1DF> \xAF\xAA |0 # +<UE1E0> \xAF\xAB |0 # +<UE1E1> \xAF\xAC |0 # +<UE1E2> \xAF\xAD |0 # +<UE1E3> \xAF\xAE |0 # +<UE1E4> \xAF\xAF |0 # +<UE1E5> \xAF\xB0 |0 # +<UE1E6> \xAF\xB1 |0 # +<UE1E7> \xAF\xB2 |0 # +<UE1E8> \xAF\xB3 |0 # +<UE1E9> \xAF\xB4 |0 # +<UE1EA> \xAF\xB5 |0 # +<UE1EB> \xAF\xB6 |0 # +<UE1EC> \xAF\xB7 |0 # +<UE1ED> \xAF\xB8 |0 # +<UE1EE> \xAF\xB9 |0 # +<UE1EF> \xAF\xBA |0 # +<UE1F0> \xAF\xBB |0 # +<UE1F1> \xAF\xBC |0 # +<UE1F2> \xAF\xBD |0 # +<UE1F3> \xAF\xBE |0 # +<UE1F4> \xAF\xBF |0 # +<UE1F5> \xAF\xC0 |0 # +<UE1F6> \xAF\xC1 |0 # +<UE1F7> \xAF\xC2 |0 # +<UE1F8> \xAF\xC3 |0 # +<UE1F9> \xAF\xC4 |0 # +<UE1FA> \xAF\xC5 |0 # +<UE1FB> \xAF\xC6 |0 # +<UE1FC> \xAF\xC7 |0 # +<UE1FD> \xAF\xC8 |0 # +<UE1FE> \xAF\xC9 |0 # +<UE1FF> \xAF\xCA |0 # +<UE200> \xAF\xCB |0 # +<UE201> \xAF\xCC |0 # +<UE202> \xAF\xCD |0 # +<UE203> \xAF\xCE |0 # +<UE204> \xAF\xCF |0 # +<UE205> \xAF\xD0 |0 # +<UE206> \xAF\xD1 |0 # +<UE207> \xAF\xD2 |0 # +<UE208> \xAF\xD3 |0 # +<UE209> \xAF\xD4 |0 # +<UE20A> \xAF\xD5 |0 # +<UE20B> \xAF\xD6 |0 # +<UE20C> \xAF\xD7 |0 # +<UE20D> \xAF\xD8 |0 # +<UE20E> \xAF\xD9 |0 # +<UE20F> \xAF\xDA |0 # +<UE210> \xAF\xDB |0 # +<UE211> \xAF\xDC |0 # +<UE212> \xAF\xDD |0 # +<UE213> \xAF\xDE |0 # +<UE214> \xAF\xDF |0 # +<UE215> \xAF\xE0 |0 # +<UE216> \xAF\xE1 |0 # +<UE217> \xAF\xE2 |0 # +<UE218> \xAF\xE3 |0 # +<UE219> \xAF\xE4 |0 # +<UE21A> \xAF\xE5 |0 # +<UE21B> \xAF\xE6 |0 # +<UE21C> \xAF\xE7 |0 # +<UE21D> \xAF\xE8 |0 # +<UE21E> \xAF\xE9 |0 # +<UE21F> \xAF\xEA |0 # +<UE220> \xAF\xEB |0 # +<UE221> \xAF\xEC |0 # +<UE222> \xAF\xED |0 # +<UE223> \xAF\xEE |0 # +<UE224> \xAF\xEF |0 # +<UE225> \xAF\xF0 |0 # +<UE226> \xAF\xF1 |0 # +<UE227> \xAF\xF2 |0 # +<UE228> \xAF\xF3 |0 # +<UE229> \xAF\xF4 |0 # +<UE22A> \xAF\xF5 |0 # +<UE22B> \xAF\xF6 |0 # +<UE22C> \xAF\xF7 |0 # +<UE22D> \xAF\xF8 |0 # +<UE22E> \xAF\xF9 |0 # +<UE22F> \xAF\xFA |0 # +<UE230> \xAF\xFB |0 # +<UE231> \xAF\xFC |0 # +<UE232> \xAF\xFD |0 # +<UE233> \xAF\xFE |0 # +<UE234> \xF8\xA1 |0 # +<UE235> \xF8\xA2 |0 # +<UE236> \xF8\xA3 |0 # +<UE237> \xF8\xA4 |0 # +<UE238> \xF8\xA5 |0 # +<UE239> \xF8\xA6 |0 # +<UE23A> \xF8\xA7 |0 # +<UE23B> \xF8\xA8 |0 # +<UE23C> \xF8\xA9 |0 # +<UE23D> \xF8\xAA |0 # +<UE23E> \xF8\xAB |0 # +<UE23F> \xF8\xAC |0 # +<UE240> \xF8\xAD |0 # +<UE241> \xF8\xAE |0 # +<UE242> \xF8\xAF |0 # +<UE243> \xF8\xB0 |0 # +<UE244> \xF8\xB1 |0 # +<UE245> \xF8\xB2 |0 # +<UE246> \xF8\xB3 |0 # +<UE247> \xF8\xB4 |0 # +<UE248> \xF8\xB5 |0 # +<UE249> \xF8\xB6 |0 # +<UE24A> \xF8\xB7 |0 # +<UE24B> \xF8\xB8 |0 # +<UE24C> \xF8\xB9 |0 # +<UE24D> \xF8\xBA |0 # +<UE24E> \xF8\xBB |0 # +<UE24F> \xF8\xBC |0 # +<UE250> \xF8\xBD |0 # +<UE251> \xF8\xBE |0 # +<UE252> \xF8\xBF |0 # +<UE253> \xF8\xC0 |0 # +<UE254> \xF8\xC1 |0 # +<UE255> \xF8\xC2 |0 # +<UE256> \xF8\xC3 |0 # +<UE257> \xF8\xC4 |0 # +<UE258> \xF8\xC5 |0 # +<UE259> \xF8\xC6 |0 # +<UE25A> \xF8\xC7 |0 # +<UE25B> \xF8\xC8 |0 # +<UE25C> \xF8\xC9 |0 # +<UE25D> \xF8\xCA |0 # +<UE25E> \xF8\xCB |0 # +<UE25F> \xF8\xCC |0 # +<UE260> \xF8\xCD |0 # +<UE261> \xF8\xCE |0 # +<UE262> \xF8\xCF |0 # +<UE263> \xF8\xD0 |0 # +<UE264> \xF8\xD1 |0 # +<UE265> \xF8\xD2 |0 # +<UE266> \xF8\xD3 |0 # +<UE267> \xF8\xD4 |0 # +<UE268> \xF8\xD5 |0 # +<UE269> \xF8\xD6 |0 # +<UE26A> \xF8\xD7 |0 # +<UE26B> \xF8\xD8 |0 # +<UE26C> \xF8\xD9 |0 # +<UE26D> \xF8\xDA |0 # +<UE26E> \xF8\xDB |0 # +<UE26F> \xF8\xDC |0 # +<UE270> \xF8\xDD |0 # +<UE271> \xF8\xDE |0 # +<UE272> \xF8\xDF |0 # +<UE273> \xF8\xE0 |0 # +<UE274> \xF8\xE1 |0 # +<UE275> \xF8\xE2 |0 # +<UE276> \xF8\xE3 |0 # +<UE277> \xF8\xE4 |0 # +<UE278> \xF8\xE5 |0 # +<UE279> \xF8\xE6 |0 # +<UE27A> \xF8\xE7 |0 # +<UE27B> \xF8\xE8 |0 # +<UE27C> \xF8\xE9 |0 # +<UE27D> \xF8\xEA |0 # +<UE27E> \xF8\xEB |0 # +<UE27F> \xF8\xEC |0 # +<UE280> \xF8\xED |0 # +<UE281> \xF8\xEE |0 # +<UE282> \xF8\xEF |0 # +<UE283> \xF8\xF0 |0 # +<UE284> \xF8\xF1 |0 # +<UE285> \xF8\xF2 |0 # +<UE286> \xF8\xF3 |0 # +<UE287> \xF8\xF4 |0 # +<UE288> \xF8\xF5 |0 # +<UE289> \xF8\xF6 |0 # +<UE28A> \xF8\xF7 |0 # +<UE28B> \xF8\xF8 |0 # +<UE28C> \xF8\xF9 |0 # +<UE28D> \xF8\xFA |0 # +<UE28E> \xF8\xFB |0 # +<UE28F> \xF8\xFC |0 # +<UE290> \xF8\xFD |0 # +<UE291> \xF8\xFE |0 # +<UE292> \xF9\xA1 |0 # +<UE293> \xF9\xA2 |0 # +<UE294> \xF9\xA3 |0 # +<UE295> \xF9\xA4 |0 # +<UE296> \xF9\xA5 |0 # +<UE297> \xF9\xA6 |0 # +<UE298> \xF9\xA7 |0 # +<UE299> \xF9\xA8 |0 # +<UE29A> \xF9\xA9 |0 # +<UE29B> \xF9\xAA |0 # +<UE29C> \xF9\xAB |0 # +<UE29D> \xF9\xAC |0 # +<UE29E> \xF9\xAD |0 # +<UE29F> \xF9\xAE |0 # +<UE2A0> \xF9\xAF |0 # +<UE2A1> \xF9\xB0 |0 # +<UE2A2> \xF9\xB1 |0 # +<UE2A3> \xF9\xB2 |0 # +<UE2A4> \xF9\xB3 |0 # +<UE2A5> \xF9\xB4 |0 # +<UE2A6> \xF9\xB5 |0 # +<UE2A7> \xF9\xB6 |0 # +<UE2A8> \xF9\xB7 |0 # +<UE2A9> \xF9\xB8 |0 # +<UE2AA> \xF9\xB9 |0 # +<UE2AB> \xF9\xBA |0 # +<UE2AC> \xF9\xBB |0 # +<UE2AD> \xF9\xBC |0 # +<UE2AE> \xF9\xBD |0 # +<UE2AF> \xF9\xBE |0 # +<UE2B0> \xF9\xBF |0 # +<UE2B1> \xF9\xC0 |0 # +<UE2B2> \xF9\xC1 |0 # +<UE2B3> \xF9\xC2 |0 # +<UE2B4> \xF9\xC3 |0 # +<UE2B5> \xF9\xC4 |0 # +<UE2B6> \xF9\xC5 |0 # +<UE2B7> \xF9\xC6 |0 # +<UE2B8> \xF9\xC7 |0 # +<UE2B9> \xF9\xC8 |0 # +<UE2BA> \xF9\xC9 |0 # +<UE2BB> \xF9\xCA |0 # +<UE2BC> \xF9\xCB |0 # +<UE2BD> \xF9\xCC |0 # +<UE2BE> \xF9\xCD |0 # +<UE2BF> \xF9\xCE |0 # +<UE2C0> \xF9\xCF |0 # +<UE2C1> \xF9\xD0 |0 # +<UE2C2> \xF9\xD1 |0 # +<UE2C3> \xF9\xD2 |0 # +<UE2C4> \xF9\xD3 |0 # +<UE2C5> \xF9\xD4 |0 # +<UE2C6> \xF9\xD5 |0 # +<UE2C7> \xF9\xD6 |0 # +<UE2C8> \xF9\xD7 |0 # +<UE2C9> \xF9\xD8 |0 # +<UE2CA> \xF9\xD9 |0 # +<UE2CB> \xF9\xDA |0 # +<UE2CC> \xF9\xDB |0 # +<UE2CD> \xF9\xDC |0 # +<UE2CE> \xF9\xDD |0 # +<UE2CF> \xF9\xDE |0 # +<UE2D0> \xF9\xDF |0 # +<UE2D1> \xF9\xE0 |0 # +<UE2D2> \xF9\xE1 |0 # +<UE2D3> \xF9\xE2 |0 # +<UE2D4> \xF9\xE3 |0 # +<UE2D5> \xF9\xE4 |0 # +<UE2D6> \xF9\xE5 |0 # +<UE2D7> \xF9\xE6 |0 # +<UE2D8> \xF9\xE7 |0 # +<UE2D9> \xF9\xE8 |0 # +<UE2DA> \xF9\xE9 |0 # +<UE2DB> \xF9\xEA |0 # +<UE2DC> \xF9\xEB |0 # +<UE2DD> \xF9\xEC |0 # +<UE2DE> \xF9\xED |0 # +<UE2DF> \xF9\xEE |0 # +<UE2E0> \xF9\xEF |0 # +<UE2E1> \xF9\xF0 |0 # +<UE2E2> \xF9\xF1 |0 # +<UE2E3> \xF9\xF2 |0 # +<UE2E4> \xF9\xF3 |0 # +<UE2E5> \xF9\xF4 |0 # +<UE2E6> \xF9\xF5 |0 # +<UE2E7> \xF9\xF6 |0 # +<UE2E8> \xF9\xF7 |0 # +<UE2E9> \xF9\xF8 |0 # +<UE2EA> \xF9\xF9 |0 # +<UE2EB> \xF9\xFA |0 # +<UE2EC> \xF9\xFB |0 # +<UE2ED> \xF9\xFC |0 # +<UE2EE> \xF9\xFD |0 # +<UE2EF> \xF9\xFE |0 # +<UE2F0> \xFA\xA1 |0 # +<UE2F1> \xFA\xA2 |0 # +<UE2F2> \xFA\xA3 |0 # +<UE2F3> \xFA\xA4 |0 # +<UE2F4> \xFA\xA5 |0 # +<UE2F5> \xFA\xA6 |0 # +<UE2F6> \xFA\xA7 |0 # +<UE2F7> \xFA\xA8 |0 # +<UE2F8> \xFA\xA9 |0 # +<UE2F9> \xFA\xAA |0 # +<UE2FA> \xFA\xAB |0 # +<UE2FB> \xFA\xAC |0 # +<UE2FC> \xFA\xAD |0 # +<UE2FD> \xFA\xAE |0 # +<UE2FE> \xFA\xAF |0 # +<UE2FF> \xFA\xB0 |0 # +<UE300> \xFA\xB1 |0 # +<UE301> \xFA\xB2 |0 # +<UE302> \xFA\xB3 |0 # +<UE303> \xFA\xB4 |0 # +<UE304> \xFA\xB5 |0 # +<UE305> \xFA\xB6 |0 # +<UE306> \xFA\xB7 |0 # +<UE307> \xFA\xB8 |0 # +<UE308> \xFA\xB9 |0 # +<UE309> \xFA\xBA |0 # +<UE30A> \xFA\xBB |0 # +<UE30B> \xFA\xBC |0 # +<UE30C> \xFA\xBD |0 # +<UE30D> \xFA\xBE |0 # +<UE30E> \xFA\xBF |0 # +<UE30F> \xFA\xC0 |0 # +<UE310> \xFA\xC1 |0 # +<UE311> \xFA\xC2 |0 # +<UE312> \xFA\xC3 |0 # +<UE313> \xFA\xC4 |0 # +<UE314> \xFA\xC5 |0 # +<UE315> \xFA\xC6 |0 # +<UE316> \xFA\xC7 |0 # +<UE317> \xFA\xC8 |0 # +<UE318> \xFA\xC9 |0 # +<UE319> \xFA\xCA |0 # +<UE31A> \xFA\xCB |0 # +<UE31B> \xFA\xCC |0 # +<UE31C> \xFA\xCD |0 # +<UE31D> \xFA\xCE |0 # +<UE31E> \xFA\xCF |0 # +<UE31F> \xFA\xD0 |0 # +<UE320> \xFA\xD1 |0 # +<UE321> \xFA\xD2 |0 # +<UE322> \xFA\xD3 |0 # +<UE323> \xFA\xD4 |0 # +<UE324> \xFA\xD5 |0 # +<UE325> \xFA\xD6 |0 # +<UE326> \xFA\xD7 |0 # +<UE327> \xFA\xD8 |0 # +<UE328> \xFA\xD9 |0 # +<UE329> \xFA\xDA |0 # +<UE32A> \xFA\xDB |0 # +<UE32B> \xFA\xDC |0 # +<UE32C> \xFA\xDD |0 # +<UE32D> \xFA\xDE |0 # +<UE32E> \xFA\xDF |0 # +<UE32F> \xFA\xE0 |0 # +<UE330> \xFA\xE1 |0 # +<UE331> \xFA\xE2 |0 # +<UE332> \xFA\xE3 |0 # +<UE333> \xFA\xE4 |0 # +<UE334> \xFA\xE5 |0 # +<UE335> \xFA\xE6 |0 # +<UE336> \xFA\xE7 |0 # +<UE337> \xFA\xE8 |0 # +<UE338> \xFA\xE9 |0 # +<UE339> \xFA\xEA |0 # +<UE33A> \xFA\xEB |0 # +<UE33B> \xFA\xEC |0 # +<UE33C> \xFA\xED |0 # +<UE33D> \xFA\xEE |0 # +<UE33E> \xFA\xEF |0 # +<UE33F> \xFA\xF0 |0 # +<UE340> \xFA\xF1 |0 # +<UE341> \xFA\xF2 |0 # +<UE342> \xFA\xF3 |0 # +<UE343> \xFA\xF4 |0 # +<UE344> \xFA\xF5 |0 # +<UE345> \xFA\xF6 |0 # +<UE346> \xFA\xF7 |0 # +<UE347> \xFA\xF8 |0 # +<UE348> \xFA\xF9 |0 # +<UE349> \xFA\xFA |0 # +<UE34A> \xFA\xFB |0 # +<UE34B> \xFA\xFC |0 # +<UE34C> \xFA\xFD |0 # +<UE34D> \xFA\xFE |0 # +<UE34E> \xFB\xA1 |0 # +<UE34F> \xFB\xA2 |0 # +<UE350> \xFB\xA3 |0 # +<UE351> \xFB\xA4 |0 # +<UE352> \xFB\xA5 |0 # +<UE353> \xFB\xA6 |0 # +<UE354> \xFB\xA7 |0 # +<UE355> \xFB\xA8 |0 # +<UE356> \xFB\xA9 |0 # +<UE357> \xFB\xAA |0 # +<UE358> \xFB\xAB |0 # +<UE359> \xFB\xAC |0 # +<UE35A> \xFB\xAD |0 # +<UE35B> \xFB\xAE |0 # +<UE35C> \xFB\xAF |0 # +<UE35D> \xFB\xB0 |0 # +<UE35E> \xFB\xB1 |0 # +<UE35F> \xFB\xB2 |0 # +<UE360> \xFB\xB3 |0 # +<UE361> \xFB\xB4 |0 # +<UE362> \xFB\xB5 |0 # +<UE363> \xFB\xB6 |0 # +<UE364> \xFB\xB7 |0 # +<UE365> \xFB\xB8 |0 # +<UE366> \xFB\xB9 |0 # +<UE367> \xFB\xBA |0 # +<UE368> \xFB\xBB |0 # +<UE369> \xFB\xBC |0 # +<UE36A> \xFB\xBD |0 # +<UE36B> \xFB\xBE |0 # +<UE36C> \xFB\xBF |0 # +<UE36D> \xFB\xC0 |0 # +<UE36E> \xFB\xC1 |0 # +<UE36F> \xFB\xC2 |0 # +<UE370> \xFB\xC3 |0 # +<UE371> \xFB\xC4 |0 # +<UE372> \xFB\xC5 |0 # +<UE373> \xFB\xC6 |0 # +<UE374> \xFB\xC7 |0 # +<UE375> \xFB\xC8 |0 # +<UE376> \xFB\xC9 |0 # +<UE377> \xFB\xCA |0 # +<UE378> \xFB\xCB |0 # +<UE379> \xFB\xCC |0 # +<UE37A> \xFB\xCD |0 # +<UE37B> \xFB\xCE |0 # +<UE37C> \xFB\xCF |0 # +<UE37D> \xFB\xD0 |0 # +<UE37E> \xFB\xD1 |0 # +<UE37F> \xFB\xD2 |0 # +<UE380> \xFB\xD3 |0 # +<UE381> \xFB\xD4 |0 # +<UE382> \xFB\xD5 |0 # +<UE383> \xFB\xD6 |0 # +<UE384> \xFB\xD7 |0 # +<UE385> \xFB\xD8 |0 # +<UE386> \xFB\xD9 |0 # +<UE387> \xFB\xDA |0 # +<UE388> \xFB\xDB |0 # +<UE389> \xFB\xDC |0 # +<UE38A> \xFB\xDD |0 # +<UE38B> \xFB\xDE |0 # +<UE38C> \xFB\xDF |0 # +<UE38D> \xFB\xE0 |0 # +<UE38E> \xFB\xE1 |0 # +<UE38F> \xFB\xE2 |0 # +<UE390> \xFB\xE3 |0 # +<UE391> \xFB\xE4 |0 # +<UE392> \xFB\xE5 |0 # +<UE393> \xFB\xE6 |0 # +<UE394> \xFB\xE7 |0 # +<UE395> \xFB\xE8 |0 # +<UE396> \xFB\xE9 |0 # +<UE397> \xFB\xEA |0 # +<UE398> \xFB\xEB |0 # +<UE399> \xFB\xEC |0 # +<UE39A> \xFB\xED |0 # +<UE39B> \xFB\xEE |0 # +<UE39C> \xFB\xEF |0 # +<UE39D> \xFB\xF0 |0 # +<UE39E> \xFB\xF1 |0 # +<UE39F> \xFB\xF2 |0 # +<UE3A0> \xFB\xF3 |0 # +<UE3A1> \xFB\xF4 |0 # +<UE3A2> \xFB\xF5 |0 # +<UE3A3> \xFB\xF6 |0 # +<UE3A4> \xFB\xF7 |0 # +<UE3A5> \xFB\xF8 |0 # +<UE3A6> \xFB\xF9 |0 # +<UE3A7> \xFB\xFA |0 # +<UE3A8> \xFB\xFB |0 # +<UE3A9> \xFB\xFC |0 # +<UE3AA> \xFB\xFD |0 # +<UE3AB> \xFB\xFE |0 # +<UE3AC> \xFC\xA1 |0 # +<UE3AD> \xFC\xA2 |0 # +<UE3AE> \xFC\xA3 |0 # +<UE3AF> \xFC\xA4 |0 # +<UE3B0> \xFC\xA5 |0 # +<UE3B1> \xFC\xA6 |0 # +<UE3B2> \xFC\xA7 |0 # +<UE3B3> \xFC\xA8 |0 # +<UE3B4> \xFC\xA9 |0 # +<UE3B5> \xFC\xAA |0 # +<UE3B6> \xFC\xAB |0 # +<UE3B7> \xFC\xAC |0 # +<UE3B8> \xFC\xAD |0 # +<UE3B9> \xFC\xAE |0 # +<UE3BA> \xFC\xAF |0 # +<UE3BB> \xFC\xB0 |0 # +<UE3BC> \xFC\xB1 |0 # +<UE3BD> \xFC\xB2 |0 # +<UE3BE> \xFC\xB3 |0 # +<UE3BF> \xFC\xB4 |0 # +<UE3C0> \xFC\xB5 |0 # +<UE3C1> \xFC\xB6 |0 # +<UE3C2> \xFC\xB7 |0 # +<UE3C3> \xFC\xB8 |0 # +<UE3C4> \xFC\xB9 |0 # +<UE3C5> \xFC\xBA |0 # +<UE3C6> \xFC\xBB |0 # +<UE3C7> \xFC\xBC |0 # +<UE3C8> \xFC\xBD |0 # +<UE3C9> \xFC\xBE |0 # +<UE3CA> \xFC\xBF |0 # +<UE3CB> \xFC\xC0 |0 # +<UE3CC> \xFC\xC1 |0 # +<UE3CD> \xFC\xC2 |0 # +<UE3CE> \xFC\xC3 |0 # +<UE3CF> \xFC\xC4 |0 # +<UE3D0> \xFC\xC5 |0 # +<UE3D1> \xFC\xC6 |0 # +<UE3D2> \xFC\xC7 |0 # +<UE3D3> \xFC\xC8 |0 # +<UE3D4> \xFC\xC9 |0 # +<UE3D5> \xFC\xCA |0 # +<UE3D6> \xFC\xCB |0 # +<UE3D7> \xFC\xCC |0 # +<UE3D8> \xFC\xCD |0 # +<UE3D9> \xFC\xCE |0 # +<UE3DA> \xFC\xCF |0 # +<UE3DB> \xFC\xD0 |0 # +<UE3DC> \xFC\xD1 |0 # +<UE3DD> \xFC\xD2 |0 # +<UE3DE> \xFC\xD3 |0 # +<UE3DF> \xFC\xD4 |0 # +<UE3E0> \xFC\xD5 |0 # +<UE3E1> \xFC\xD6 |0 # +<UE3E2> \xFC\xD7 |0 # +<UE3E3> \xFC\xD8 |0 # +<UE3E4> \xFC\xD9 |0 # +<UE3E5> \xFC\xDA |0 # +<UE3E6> \xFC\xDB |0 # +<UE3E7> \xFC\xDC |0 # +<UE3E8> \xFC\xDD |0 # +<UE3E9> \xFC\xDE |0 # +<UE3EA> \xFC\xDF |0 # +<UE3EB> \xFC\xE0 |0 # +<UE3EC> \xFC\xE1 |0 # +<UE3ED> \xFC\xE2 |0 # +<UE3EE> \xFC\xE3 |0 # +<UE3EF> \xFC\xE4 |0 # +<UE3F0> \xFC\xE5 |0 # +<UE3F1> \xFC\xE6 |0 # +<UE3F2> \xFC\xE7 |0 # +<UE3F3> \xFC\xE8 |0 # +<UE3F4> \xFC\xE9 |0 # +<UE3F5> \xFC\xEA |0 # +<UE3F6> \xFC\xEB |0 # +<UE3F7> \xFC\xEC |0 # +<UE3F8> \xFC\xED |0 # +<UE3F9> \xFC\xEE |0 # +<UE3FA> \xFC\xEF |0 # +<UE3FB> \xFC\xF0 |0 # +<UE3FC> \xFC\xF1 |0 # +<UE3FD> \xFC\xF2 |0 # +<UE3FE> \xFC\xF3 |0 # +<UE3FF> \xFC\xF4 |0 # +<UE400> \xFC\xF5 |0 # +<UE401> \xFC\xF6 |0 # +<UE402> \xFC\xF7 |0 # +<UE403> \xFC\xF8 |0 # +<UE404> \xFC\xF9 |0 # +<UE405> \xFC\xFA |0 # +<UE406> \xFC\xFB |0 # +<UE407> \xFC\xFC |0 # +<UE408> \xFC\xFD |0 # +<UE409> \xFC\xFE |0 # +<UE40A> \xFD\xA1 |0 # +<UE40B> \xFD\xA2 |0 # +<UE40C> \xFD\xA3 |0 # +<UE40D> \xFD\xA4 |0 # +<UE40E> \xFD\xA5 |0 # +<UE40F> \xFD\xA6 |0 # +<UE410> \xFD\xA7 |0 # +<UE411> \xFD\xA8 |0 # +<UE412> \xFD\xA9 |0 # +<UE413> \xFD\xAA |0 # +<UE414> \xFD\xAB |0 # +<UE415> \xFD\xAC |0 # +<UE416> \xFD\xAD |0 # +<UE417> \xFD\xAE |0 # +<UE418> \xFD\xAF |0 # +<UE419> \xFD\xB0 |0 # +<UE41A> \xFD\xB1 |0 # +<UE41B> \xFD\xB2 |0 # +<UE41C> \xFD\xB3 |0 # +<UE41D> \xFD\xB4 |0 # +<UE41E> \xFD\xB5 |0 # +<UE41F> \xFD\xB6 |0 # +<UE420> \xFD\xB7 |0 # +<UE421> \xFD\xB8 |0 # +<UE422> \xFD\xB9 |0 # +<UE423> \xFD\xBA |0 # +<UE424> \xFD\xBB |0 # +<UE425> \xFD\xBC |0 # +<UE426> \xFD\xBD |0 # +<UE427> \xFD\xBE |0 # +<UE428> \xFD\xBF |0 # +<UE429> \xFD\xC0 |0 # +<UE42A> \xFD\xC1 |0 # +<UE42B> \xFD\xC2 |0 # +<UE42C> \xFD\xC3 |0 # +<UE42D> \xFD\xC4 |0 # +<UE42E> \xFD\xC5 |0 # +<UE42F> \xFD\xC6 |0 # +<UE430> \xFD\xC7 |0 # +<UE431> \xFD\xC8 |0 # +<UE432> \xFD\xC9 |0 # +<UE433> \xFD\xCA |0 # +<UE434> \xFD\xCB |0 # +<UE435> \xFD\xCC |0 # +<UE436> \xFD\xCD |0 # +<UE437> \xFD\xCE |0 # +<UE438> \xFD\xCF |0 # +<UE439> \xFD\xD0 |0 # +<UE43A> \xFD\xD1 |0 # +<UE43B> \xFD\xD2 |0 # +<UE43C> \xFD\xD3 |0 # +<UE43D> \xFD\xD4 |0 # +<UE43E> \xFD\xD5 |0 # +<UE43F> \xFD\xD6 |0 # +<UE440> \xFD\xD7 |0 # +<UE441> \xFD\xD8 |0 # +<UE442> \xFD\xD9 |0 # +<UE443> \xFD\xDA |0 # +<UE444> \xFD\xDB |0 # +<UE445> \xFD\xDC |0 # +<UE446> \xFD\xDD |0 # +<UE447> \xFD\xDE |0 # +<UE448> \xFD\xDF |0 # +<UE449> \xFD\xE0 |0 # +<UE44A> \xFD\xE1 |0 # +<UE44B> \xFD\xE2 |0 # +<UE44C> \xFD\xE3 |0 # +<UE44D> \xFD\xE4 |0 # +<UE44E> \xFD\xE5 |0 # +<UE44F> \xFD\xE6 |0 # +<UE450> \xFD\xE7 |0 # +<UE451> \xFD\xE8 |0 # +<UE452> \xFD\xE9 |0 # +<UE453> \xFD\xEA |0 # +<UE454> \xFD\xEB |0 # +<UE455> \xFD\xEC |0 # +<UE456> \xFD\xED |0 # +<UE457> \xFD\xEE |0 # +<UE458> \xFD\xEF |0 # +<UE459> \xFD\xF0 |0 # +<UE45A> \xFD\xF1 |0 # +<UE45B> \xFD\xF2 |0 # +<UE45C> \xFD\xF3 |0 # +<UE45D> \xFD\xF4 |0 # +<UE45E> \xFD\xF5 |0 # +<UE45F> \xFD\xF6 |0 # +<UE460> \xFD\xF7 |0 # +<UE461> \xFD\xF8 |0 # +<UE462> \xFD\xF9 |0 # +<UE463> \xFD\xFA |0 # +<UE464> \xFD\xFB |0 # +<UE465> \xFD\xFC |0 # +<UE466> \xFD\xFD |0 # +<UE467> \xFD\xFE |0 # +<UE468> \xFE\xA1 |0 # +<UE469> \xFE\xA2 |0 # +<UE46A> \xFE\xA3 |0 # +<UE46B> \xFE\xA4 |0 # +<UE46C> \xFE\xA5 |0 # +<UE46D> \xFE\xA6 |0 # +<UE46E> \xFE\xA7 |0 # +<UE46F> \xFE\xA8 |0 # +<UE470> \xFE\xA9 |0 # +<UE471> \xFE\xAA |0 # +<UE472> \xFE\xAB |0 # +<UE473> \xFE\xAC |0 # +<UE474> \xFE\xAD |0 # +<UE475> \xFE\xAE |0 # +<UE476> \xFE\xAF |0 # +<UE477> \xFE\xB0 |0 # +<UE478> \xFE\xB1 |0 # +<UE479> \xFE\xB2 |0 # +<UE47A> \xFE\xB3 |0 # +<UE47B> \xFE\xB4 |0 # +<UE47C> \xFE\xB5 |0 # +<UE47D> \xFE\xB6 |0 # +<UE47E> \xFE\xB7 |0 # +<UE47F> \xFE\xB8 |0 # +<UE480> \xFE\xB9 |0 # +<UE481> \xFE\xBA |0 # +<UE482> \xFE\xBB |0 # +<UE483> \xFE\xBC |0 # +<UE484> \xFE\xBD |0 # +<UE485> \xFE\xBE |0 # +<UE486> \xFE\xBF |0 # +<UE487> \xFE\xC0 |0 # +<UE488> \xFE\xC1 |0 # +<UE489> \xFE\xC2 |0 # +<UE48A> \xFE\xC3 |0 # +<UE48B> \xFE\xC4 |0 # +<UE48C> \xFE\xC5 |0 # +<UE48D> \xFE\xC6 |0 # +<UE48E> \xFE\xC7 |0 # +<UE48F> \xFE\xC8 |0 # +<UE490> \xFE\xC9 |0 # +<UE491> \xFE\xCA |0 # +<UE492> \xFE\xCB |0 # +<UE493> \xFE\xCC |0 # +<UE494> \xFE\xCD |0 # +<UE495> \xFE\xCE |0 # +<UE496> \xFE\xCF |0 # +<UE497> \xFE\xD0 |0 # +<UE498> \xFE\xD1 |0 # +<UE499> \xFE\xD2 |0 # +<UE49A> \xFE\xD3 |0 # +<UE49B> \xFE\xD4 |0 # +<UE49C> \xFE\xD5 |0 # +<UE49D> \xFE\xD6 |0 # +<UE49E> \xFE\xD7 |0 # +<UE49F> \xFE\xD8 |0 # +<UE4A0> \xFE\xD9 |0 # +<UE4A1> \xFE\xDA |0 # +<UE4A2> \xFE\xDB |0 # +<UE4A3> \xFE\xDC |0 # +<UE4A4> \xFE\xDD |0 # +<UE4A5> \xFE\xDE |0 # +<UE4A6> \xFE\xDF |0 # +<UE4A7> \xFE\xE0 |0 # +<UE4A8> \xFE\xE1 |0 # +<UE4A9> \xFE\xE2 |0 # +<UE4AA> \xFE\xE3 |0 # +<UE4AB> \xFE\xE4 |0 # +<UE4AC> \xFE\xE5 |0 # +<UE4AD> \xFE\xE6 |0 # +<UE4AE> \xFE\xE7 |0 # +<UE4AF> \xFE\xE8 |0 # +<UE4B0> \xFE\xE9 |0 # +<UE4B1> \xFE\xEA |0 # +<UE4B2> \xFE\xEB |0 # +<UE4B3> \xFE\xEC |0 # +<UE4B4> \xFE\xED |0 # +<UE4B5> \xFE\xEE |0 # +<UE4B6> \xFE\xEF |0 # +<UE4B7> \xFE\xF0 |0 # +<UE4B8> \xFE\xF1 |0 # +<UE4B9> \xFE\xF2 |0 # +<UE4BA> \xFE\xF3 |0 # +<UE4BB> \xFE\xF4 |0 # +<UE4BC> \xFE\xF5 |0 # +<UE4BD> \xFE\xF6 |0 # +<UE4BE> \xFE\xF7 |0 # +<UE4BF> \xFE\xF8 |0 # +<UE4C0> \xFE\xF9 |0 # +<UE4C1> \xFE\xFA |0 # +<UE4C2> \xFE\xFB |0 # +<UE4C3> \xFE\xFC |0 # +<UE4C4> \xFE\xFD |0 # +<UE4C5> \xFE\xFE |0 # +<UE4C6> \xA1\x40 |0 # +<UE4C7> \xA1\x41 |0 # +<UE4C8> \xA1\x42 |0 # +<UE4C9> \xA1\x43 |0 # +<UE4CA> \xA1\x44 |0 # +<UE4CB> \xA1\x45 |0 # +<UE4CC> \xA1\x46 |0 # +<UE4CD> \xA1\x47 |0 # +<UE4CE> \xA1\x48 |0 # +<UE4CF> \xA1\x49 |0 # +<UE4D0> \xA1\x4A |0 # +<UE4D1> \xA1\x4B |0 # +<UE4D2> \xA1\x4C |0 # +<UE4D3> \xA1\x4D |0 # +<UE4D4> \xA1\x4E |0 # +<UE4D5> \xA1\x4F |0 # +<UE4D6> \xA1\x50 |0 # +<UE4D7> \xA1\x51 |0 # +<UE4D8> \xA1\x52 |0 # +<UE4D9> \xA1\x53 |0 # +<UE4DA> \xA1\x54 |0 # +<UE4DB> \xA1\x55 |0 # +<UE4DC> \xA1\x56 |0 # +<UE4DD> \xA1\x57 |0 # +<UE4DE> \xA1\x58 |0 # +<UE4DF> \xA1\x59 |0 # +<UE4E0> \xA1\x5A |0 # +<UE4E1> \xA1\x5B |0 # +<UE4E2> \xA1\x5C |0 # +<UE4E3> \xA1\x5D |0 # +<UE4E4> \xA1\x5E |0 # +<UE4E5> \xA1\x5F |0 # +<UE4E6> \xA1\x60 |0 # +<UE4E7> \xA1\x61 |0 # +<UE4E8> \xA1\x62 |0 # +<UE4E9> \xA1\x63 |0 # +<UE4EA> \xA1\x64 |0 # +<UE4EB> \xA1\x65 |0 # +<UE4EC> \xA1\x66 |0 # +<UE4ED> \xA1\x67 |0 # +<UE4EE> \xA1\x68 |0 # +<UE4EF> \xA1\x69 |0 # +<UE4F0> \xA1\x6A |0 # +<UE4F1> \xA1\x6B |0 # +<UE4F2> \xA1\x6C |0 # +<UE4F3> \xA1\x6D |0 # +<UE4F4> \xA1\x6E |0 # +<UE4F5> \xA1\x6F |0 # +<UE4F6> \xA1\x70 |0 # +<UE4F7> \xA1\x71 |0 # +<UE4F8> \xA1\x72 |0 # +<UE4F9> \xA1\x73 |0 # +<UE4FA> \xA1\x74 |0 # +<UE4FB> \xA1\x75 |0 # +<UE4FC> \xA1\x76 |0 # +<UE4FD> \xA1\x77 |0 # +<UE4FE> \xA1\x78 |0 # +<UE4FF> \xA1\x79 |0 # +<UE500> \xA1\x7A |0 # +<UE501> \xA1\x7B |0 # +<UE502> \xA1\x7C |0 # +<UE503> \xA1\x7D |0 # +<UE504> \xA1\x7E |0 # +<UE505> \xA1\x80 |0 # +<UE506> \xA1\x81 |0 # +<UE507> \xA1\x82 |0 # +<UE508> \xA1\x83 |0 # +<UE509> \xA1\x84 |0 # +<UE50A> \xA1\x85 |0 # +<UE50B> \xA1\x86 |0 # +<UE50C> \xA1\x87 |0 # +<UE50D> \xA1\x88 |0 # +<UE50E> \xA1\x89 |0 # +<UE50F> \xA1\x8A |0 # +<UE510> \xA1\x8B |0 # +<UE511> \xA1\x8C |0 # +<UE512> \xA1\x8D |0 # +<UE513> \xA1\x8E |0 # +<UE514> \xA1\x8F |0 # +<UE515> \xA1\x90 |0 # +<UE516> \xA1\x91 |0 # +<UE517> \xA1\x92 |0 # +<UE518> \xA1\x93 |0 # +<UE519> \xA1\x94 |0 # +<UE51A> \xA1\x95 |0 # +<UE51B> \xA1\x96 |0 # +<UE51C> \xA1\x97 |0 # +<UE51D> \xA1\x98 |0 # +<UE51E> \xA1\x99 |0 # +<UE51F> \xA1\x9A |0 # +<UE520> \xA1\x9B |0 # +<UE521> \xA1\x9C |0 # +<UE522> \xA1\x9D |0 # +<UE523> \xA1\x9E |0 # +<UE524> \xA1\x9F |0 # +<UE525> \xA1\xA0 |0 # +<UE526> \xA2\x40 |0 # +<UE527> \xA2\x41 |0 # +<UE528> \xA2\x42 |0 # +<UE529> \xA2\x43 |0 # +<UE52A> \xA2\x44 |0 # +<UE52B> \xA2\x45 |0 # +<UE52C> \xA2\x46 |0 # +<UE52D> \xA2\x47 |0 # +<UE52E> \xA2\x48 |0 # +<UE52F> \xA2\x49 |0 # +<UE530> \xA2\x4A |0 # +<UE531> \xA2\x4B |0 # +<UE532> \xA2\x4C |0 # +<UE533> \xA2\x4D |0 # +<UE534> \xA2\x4E |0 # +<UE535> \xA2\x4F |0 # +<UE536> \xA2\x50 |0 # +<UE537> \xA2\x51 |0 # +<UE538> \xA2\x52 |0 # +<UE539> \xA2\x53 |0 # +<UE53A> \xA2\x54 |0 # +<UE53B> \xA2\x55 |0 # +<UE53C> \xA2\x56 |0 # +<UE53D> \xA2\x57 |0 # +<UE53E> \xA2\x58 |0 # +<UE53F> \xA2\x59 |0 # +<UE540> \xA2\x5A |0 # +<UE541> \xA2\x5B |0 # +<UE542> \xA2\x5C |0 # +<UE543> \xA2\x5D |0 # +<UE544> \xA2\x5E |0 # +<UE545> \xA2\x5F |0 # +<UE546> \xA2\x60 |0 # +<UE547> \xA2\x61 |0 # +<UE548> \xA2\x62 |0 # +<UE549> \xA2\x63 |0 # +<UE54A> \xA2\x64 |0 # +<UE54B> \xA2\x65 |0 # +<UE54C> \xA2\x66 |0 # +<UE54D> \xA2\x67 |0 # +<UE54E> \xA2\x68 |0 # +<UE54F> \xA2\x69 |0 # +<UE550> \xA2\x6A |0 # +<UE551> \xA2\x6B |0 # +<UE552> \xA2\x6C |0 # +<UE553> \xA2\x6D |0 # +<UE554> \xA2\x6E |0 # +<UE555> \xA2\x6F |0 # +<UE556> \xA2\x70 |0 # +<UE557> \xA2\x71 |0 # +<UE558> \xA2\x72 |0 # +<UE559> \xA2\x73 |0 # +<UE55A> \xA2\x74 |0 # +<UE55B> \xA2\x75 |0 # +<UE55C> \xA2\x76 |0 # +<UE55D> \xA2\x77 |0 # +<UE55E> \xA2\x78 |0 # +<UE55F> \xA2\x79 |0 # +<UE560> \xA2\x7A |0 # +<UE561> \xA2\x7B |0 # +<UE562> \xA2\x7C |0 # +<UE563> \xA2\x7D |0 # +<UE564> \xA2\x7E |0 # +<UE565> \xA2\x80 |0 # +<UE566> \xA2\x81 |0 # +<UE567> \xA2\x82 |0 # +<UE568> \xA2\x83 |0 # +<UE569> \xA2\x84 |0 # +<UE56A> \xA2\x85 |0 # +<UE56B> \xA2\x86 |0 # +<UE56C> \xA2\x87 |0 # +<UE56D> \xA2\x88 |0 # +<UE56E> \xA2\x89 |0 # +<UE56F> \xA2\x8A |0 # +<UE570> \xA2\x8B |0 # +<UE571> \xA2\x8C |0 # +<UE572> \xA2\x8D |0 # +<UE573> \xA2\x8E |0 # +<UE574> \xA2\x8F |0 # +<UE575> \xA2\x90 |0 # +<UE576> \xA2\x91 |0 # +<UE577> \xA2\x92 |0 # +<UE578> \xA2\x93 |0 # +<UE579> \xA2\x94 |0 # +<UE57A> \xA2\x95 |0 # +<UE57B> \xA2\x96 |0 # +<UE57C> \xA2\x97 |0 # +<UE57D> \xA2\x98 |0 # +<UE57E> \xA2\x99 |0 # +<UE57F> \xA2\x9A |0 # +<UE580> \xA2\x9B |0 # +<UE581> \xA2\x9C |0 # +<UE582> \xA2\x9D |0 # +<UE583> \xA2\x9E |0 # +<UE584> \xA2\x9F |0 # +<UE585> \xA2\xA0 |0 # +<UE586> \xA3\x40 |0 # +<UE587> \xA3\x41 |0 # +<UE588> \xA3\x42 |0 # +<UE589> \xA3\x43 |0 # +<UE58A> \xA3\x44 |0 # +<UE58B> \xA3\x45 |0 # +<UE58C> \xA3\x46 |0 # +<UE58D> \xA3\x47 |0 # +<UE58E> \xA3\x48 |0 # +<UE58F> \xA3\x49 |0 # +<UE590> \xA3\x4A |0 # +<UE591> \xA3\x4B |0 # +<UE592> \xA3\x4C |0 # +<UE593> \xA3\x4D |0 # +<UE594> \xA3\x4E |0 # +<UE595> \xA3\x4F |0 # +<UE596> \xA3\x50 |0 # +<UE597> \xA3\x51 |0 # +<UE598> \xA3\x52 |0 # +<UE599> \xA3\x53 |0 # +<UE59A> \xA3\x54 |0 # +<UE59B> \xA3\x55 |0 # +<UE59C> \xA3\x56 |0 # +<UE59D> \xA3\x57 |0 # +<UE59E> \xA3\x58 |0 # +<UE59F> \xA3\x59 |0 # +<UE5A0> \xA3\x5A |0 # +<UE5A1> \xA3\x5B |0 # +<UE5A2> \xA3\x5C |0 # +<UE5A3> \xA3\x5D |0 # +<UE5A4> \xA3\x5E |0 # +<UE5A5> \xA3\x5F |0 # +<UE5A6> \xA3\x60 |0 # +<UE5A7> \xA3\x61 |0 # +<UE5A8> \xA3\x62 |0 # +<UE5A9> \xA3\x63 |0 # +<UE5AA> \xA3\x64 |0 # +<UE5AB> \xA3\x65 |0 # +<UE5AC> \xA3\x66 |0 # +<UE5AD> \xA3\x67 |0 # +<UE5AE> \xA3\x68 |0 # +<UE5AF> \xA3\x69 |0 # +<UE5B0> \xA3\x6A |0 # +<UE5B1> \xA3\x6B |0 # +<UE5B2> \xA3\x6C |0 # +<UE5B3> \xA3\x6D |0 # +<UE5B4> \xA3\x6E |0 # +<UE5B5> \xA3\x6F |0 # +<UE5B6> \xA3\x70 |0 # +<UE5B7> \xA3\x71 |0 # +<UE5B8> \xA3\x72 |0 # +<UE5B9> \xA3\x73 |0 # +<UE5BA> \xA3\x74 |0 # +<UE5BB> \xA3\x75 |0 # +<UE5BC> \xA3\x76 |0 # +<UE5BD> \xA3\x77 |0 # +<UE5BE> \xA3\x78 |0 # +<UE5BF> \xA3\x79 |0 # +<UE5C0> \xA3\x7A |0 # +<UE5C1> \xA3\x7B |0 # +<UE5C2> \xA3\x7C |0 # +<UE5C3> \xA3\x7D |0 # +<UE5C4> \xA3\x7E |0 # +<UE5C5> \xA3\x80 |0 # +<UE5C6> \xA3\x81 |0 # +<UE5C7> \xA3\x82 |0 # +<UE5C8> \xA3\x83 |0 # +<UE5C9> \xA3\x84 |0 # +<UE5CA> \xA3\x85 |0 # +<UE5CB> \xA3\x86 |0 # +<UE5CC> \xA3\x87 |0 # +<UE5CD> \xA3\x88 |0 # +<UE5CE> \xA3\x89 |0 # +<UE5CF> \xA3\x8A |0 # +<UE5D0> \xA3\x8B |0 # +<UE5D1> \xA3\x8C |0 # +<UE5D2> \xA3\x8D |0 # +<UE5D3> \xA3\x8E |0 # +<UE5D4> \xA3\x8F |0 # +<UE5D5> \xA3\x90 |0 # +<UE5D6> \xA3\x91 |0 # +<UE5D7> \xA3\x92 |0 # +<UE5D8> \xA3\x93 |0 # +<UE5D9> \xA3\x94 |0 # +<UE5DA> \xA3\x95 |0 # +<UE5DB> \xA3\x96 |0 # +<UE5DC> \xA3\x97 |0 # +<UE5DD> \xA3\x98 |0 # +<UE5DE> \xA3\x99 |0 # +<UE5DF> \xA3\x9A |0 # +<UE5E0> \xA3\x9B |0 # +<UE5E1> \xA3\x9C |0 # +<UE5E2> \xA3\x9D |0 # +<UE5E3> \xA3\x9E |0 # +<UE5E4> \xA3\x9F |0 # +<UE5E5> \xA3\xA0 |0 # +<UE5E6> \xA4\x40 |0 # +<UE5E7> \xA4\x41 |0 # +<UE5E8> \xA4\x42 |0 # +<UE5E9> \xA4\x43 |0 # +<UE5EA> \xA4\x44 |0 # +<UE5EB> \xA4\x45 |0 # +<UE5EC> \xA4\x46 |0 # +<UE5ED> \xA4\x47 |0 # +<UE5EE> \xA4\x48 |0 # +<UE5EF> \xA4\x49 |0 # +<UE5F0> \xA4\x4A |0 # +<UE5F1> \xA4\x4B |0 # +<UE5F2> \xA4\x4C |0 # +<UE5F3> \xA4\x4D |0 # +<UE5F4> \xA4\x4E |0 # +<UE5F5> \xA4\x4F |0 # +<UE5F6> \xA4\x50 |0 # +<UE5F7> \xA4\x51 |0 # +<UE5F8> \xA4\x52 |0 # +<UE5F9> \xA4\x53 |0 # +<UE5FA> \xA4\x54 |0 # +<UE5FB> \xA4\x55 |0 # +<UE5FC> \xA4\x56 |0 # +<UE5FD> \xA4\x57 |0 # +<UE5FE> \xA4\x58 |0 # +<UE5FF> \xA4\x59 |0 # +<UE600> \xA4\x5A |0 # +<UE601> \xA4\x5B |0 # +<UE602> \xA4\x5C |0 # +<UE603> \xA4\x5D |0 # +<UE604> \xA4\x5E |0 # +<UE605> \xA4\x5F |0 # +<UE606> \xA4\x60 |0 # +<UE607> \xA4\x61 |0 # +<UE608> \xA4\x62 |0 # +<UE609> \xA4\x63 |0 # +<UE60A> \xA4\x64 |0 # +<UE60B> \xA4\x65 |0 # +<UE60C> \xA4\x66 |0 # +<UE60D> \xA4\x67 |0 # +<UE60E> \xA4\x68 |0 # +<UE60F> \xA4\x69 |0 # +<UE610> \xA4\x6A |0 # +<UE611> \xA4\x6B |0 # +<UE612> \xA4\x6C |0 # +<UE613> \xA4\x6D |0 # +<UE614> \xA4\x6E |0 # +<UE615> \xA4\x6F |0 # +<UE616> \xA4\x70 |0 # +<UE617> \xA4\x71 |0 # +<UE618> \xA4\x72 |0 # +<UE619> \xA4\x73 |0 # +<UE61A> \xA4\x74 |0 # +<UE61B> \xA4\x75 |0 # +<UE61C> \xA4\x76 |0 # +<UE61D> \xA4\x77 |0 # +<UE61E> \xA4\x78 |0 # +<UE61F> \xA4\x79 |0 # +<UE620> \xA4\x7A |0 # +<UE621> \xA4\x7B |0 # +<UE622> \xA4\x7C |0 # +<UE623> \xA4\x7D |0 # +<UE624> \xA4\x7E |0 # +<UE625> \xA4\x80 |0 # +<UE626> \xA4\x81 |0 # +<UE627> \xA4\x82 |0 # +<UE628> \xA4\x83 |0 # +<UE629> \xA4\x84 |0 # +<UE62A> \xA4\x85 |0 # +<UE62B> \xA4\x86 |0 # +<UE62C> \xA4\x87 |0 # +<UE62D> \xA4\x88 |0 # +<UE62E> \xA4\x89 |0 # +<UE62F> \xA4\x8A |0 # +<UE630> \xA4\x8B |0 # +<UE631> \xA4\x8C |0 # +<UE632> \xA4\x8D |0 # +<UE633> \xA4\x8E |0 # +<UE634> \xA4\x8F |0 # +<UE635> \xA4\x90 |0 # +<UE636> \xA4\x91 |0 # +<UE637> \xA4\x92 |0 # +<UE638> \xA4\x93 |0 # +<UE639> \xA4\x94 |0 # +<UE63A> \xA4\x95 |0 # +<UE63B> \xA4\x96 |0 # +<UE63C> \xA4\x97 |0 # +<UE63D> \xA4\x98 |0 # +<UE63E> \xA4\x99 |0 # +<UE63F> \xA4\x9A |0 # +<UE640> \xA4\x9B |0 # +<UE641> \xA4\x9C |0 # +<UE642> \xA4\x9D |0 # +<UE643> \xA4\x9E |0 # +<UE644> \xA4\x9F |0 # +<UE645> \xA4\xA0 |0 # +<UE646> \xA5\x40 |0 # +<UE647> \xA5\x41 |0 # +<UE648> \xA5\x42 |0 # +<UE649> \xA5\x43 |0 # +<UE64A> \xA5\x44 |0 # +<UE64B> \xA5\x45 |0 # +<UE64C> \xA5\x46 |0 # +<UE64D> \xA5\x47 |0 # +<UE64E> \xA5\x48 |0 # +<UE64F> \xA5\x49 |0 # +<UE650> \xA5\x4A |0 # +<UE651> \xA5\x4B |0 # +<UE652> \xA5\x4C |0 # +<UE653> \xA5\x4D |0 # +<UE654> \xA5\x4E |0 # +<UE655> \xA5\x4F |0 # +<UE656> \xA5\x50 |0 # +<UE657> \xA5\x51 |0 # +<UE658> \xA5\x52 |0 # +<UE659> \xA5\x53 |0 # +<UE65A> \xA5\x54 |0 # +<UE65B> \xA5\x55 |0 # +<UE65C> \xA5\x56 |0 # +<UE65D> \xA5\x57 |0 # +<UE65E> \xA5\x58 |0 # +<UE65F> \xA5\x59 |0 # +<UE660> \xA5\x5A |0 # +<UE661> \xA5\x5B |0 # +<UE662> \xA5\x5C |0 # +<UE663> \xA5\x5D |0 # +<UE664> \xA5\x5E |0 # +<UE665> \xA5\x5F |0 # +<UE666> \xA5\x60 |0 # +<UE667> \xA5\x61 |0 # +<UE668> \xA5\x62 |0 # +<UE669> \xA5\x63 |0 # +<UE66A> \xA5\x64 |0 # +<UE66B> \xA5\x65 |0 # +<UE66C> \xA5\x66 |0 # +<UE66D> \xA5\x67 |0 # +<UE66E> \xA5\x68 |0 # +<UE66F> \xA5\x69 |0 # +<UE670> \xA5\x6A |0 # +<UE671> \xA5\x6B |0 # +<UE672> \xA5\x6C |0 # +<UE673> \xA5\x6D |0 # +<UE674> \xA5\x6E |0 # +<UE675> \xA5\x6F |0 # +<UE676> \xA5\x70 |0 # +<UE677> \xA5\x71 |0 # +<UE678> \xA5\x72 |0 # +<UE679> \xA5\x73 |0 # +<UE67A> \xA5\x74 |0 # +<UE67B> \xA5\x75 |0 # +<UE67C> \xA5\x76 |0 # +<UE67D> \xA5\x77 |0 # +<UE67E> \xA5\x78 |0 # +<UE67F> \xA5\x79 |0 # +<UE680> \xA5\x7A |0 # +<UE681> \xA5\x7B |0 # +<UE682> \xA5\x7C |0 # +<UE683> \xA5\x7D |0 # +<UE684> \xA5\x7E |0 # +<UE685> \xA5\x80 |0 # +<UE686> \xA5\x81 |0 # +<UE687> \xA5\x82 |0 # +<UE688> \xA5\x83 |0 # +<UE689> \xA5\x84 |0 # +<UE68A> \xA5\x85 |0 # +<UE68B> \xA5\x86 |0 # +<UE68C> \xA5\x87 |0 # +<UE68D> \xA5\x88 |0 # +<UE68E> \xA5\x89 |0 # +<UE68F> \xA5\x8A |0 # +<UE690> \xA5\x8B |0 # +<UE691> \xA5\x8C |0 # +<UE692> \xA5\x8D |0 # +<UE693> \xA5\x8E |0 # +<UE694> \xA5\x8F |0 # +<UE695> \xA5\x90 |0 # +<UE696> \xA5\x91 |0 # +<UE697> \xA5\x92 |0 # +<UE698> \xA5\x93 |0 # +<UE699> \xA5\x94 |0 # +<UE69A> \xA5\x95 |0 # +<UE69B> \xA5\x96 |0 # +<UE69C> \xA5\x97 |0 # +<UE69D> \xA5\x98 |0 # +<UE69E> \xA5\x99 |0 # +<UE69F> \xA5\x9A |0 # +<UE6A0> \xA5\x9B |0 # +<UE6A1> \xA5\x9C |0 # +<UE6A2> \xA5\x9D |0 # +<UE6A3> \xA5\x9E |0 # +<UE6A4> \xA5\x9F |0 # +<UE6A5> \xA5\xA0 |0 # +<UE6A6> \xA6\x40 |0 # +<UE6A7> \xA6\x41 |0 # +<UE6A8> \xA6\x42 |0 # +<UE6A9> \xA6\x43 |0 # +<UE6AA> \xA6\x44 |0 # +<UE6AB> \xA6\x45 |0 # +<UE6AC> \xA6\x46 |0 # +<UE6AD> \xA6\x47 |0 # +<UE6AE> \xA6\x48 |0 # +<UE6AF> \xA6\x49 |0 # +<UE6B0> \xA6\x4A |0 # +<UE6B1> \xA6\x4B |0 # +<UE6B2> \xA6\x4C |0 # +<UE6B3> \xA6\x4D |0 # +<UE6B4> \xA6\x4E |0 # +<UE6B5> \xA6\x4F |0 # +<UE6B6> \xA6\x50 |0 # +<UE6B7> \xA6\x51 |0 # +<UE6B8> \xA6\x52 |0 # +<UE6B9> \xA6\x53 |0 # +<UE6BA> \xA6\x54 |0 # +<UE6BB> \xA6\x55 |0 # +<UE6BC> \xA6\x56 |0 # +<UE6BD> \xA6\x57 |0 # +<UE6BE> \xA6\x58 |0 # +<UE6BF> \xA6\x59 |0 # +<UE6C0> \xA6\x5A |0 # +<UE6C1> \xA6\x5B |0 # +<UE6C2> \xA6\x5C |0 # +<UE6C3> \xA6\x5D |0 # +<UE6C4> \xA6\x5E |0 # +<UE6C5> \xA6\x5F |0 # +<UE6C6> \xA6\x60 |0 # +<UE6C7> \xA6\x61 |0 # +<UE6C8> \xA6\x62 |0 # +<UE6C9> \xA6\x63 |0 # +<UE6CA> \xA6\x64 |0 # +<UE6CB> \xA6\x65 |0 # +<UE6CC> \xA6\x66 |0 # +<UE6CD> \xA6\x67 |0 # +<UE6CE> \xA6\x68 |0 # +<UE6CF> \xA6\x69 |0 # +<UE6D0> \xA6\x6A |0 # +<UE6D1> \xA6\x6B |0 # +<UE6D2> \xA6\x6C |0 # +<UE6D3> \xA6\x6D |0 # +<UE6D4> \xA6\x6E |0 # +<UE6D5> \xA6\x6F |0 # +<UE6D6> \xA6\x70 |0 # +<UE6D7> \xA6\x71 |0 # +<UE6D8> \xA6\x72 |0 # +<UE6D9> \xA6\x73 |0 # +<UE6DA> \xA6\x74 |0 # +<UE6DB> \xA6\x75 |0 # +<UE6DC> \xA6\x76 |0 # +<UE6DD> \xA6\x77 |0 # +<UE6DE> \xA6\x78 |0 # +<UE6DF> \xA6\x79 |0 # +<UE6E0> \xA6\x7A |0 # +<UE6E1> \xA6\x7B |0 # +<UE6E2> \xA6\x7C |0 # +<UE6E3> \xA6\x7D |0 # +<UE6E4> \xA6\x7E |0 # +<UE6E5> \xA6\x80 |0 # +<UE6E6> \xA6\x81 |0 # +<UE6E7> \xA6\x82 |0 # +<UE6E8> \xA6\x83 |0 # +<UE6E9> \xA6\x84 |0 # +<UE6EA> \xA6\x85 |0 # +<UE6EB> \xA6\x86 |0 # +<UE6EC> \xA6\x87 |0 # +<UE6ED> \xA6\x88 |0 # +<UE6EE> \xA6\x89 |0 # +<UE6EF> \xA6\x8A |0 # +<UE6F0> \xA6\x8B |0 # +<UE6F1> \xA6\x8C |0 # +<UE6F2> \xA6\x8D |0 # +<UE6F3> \xA6\x8E |0 # +<UE6F4> \xA6\x8F |0 # +<UE6F5> \xA6\x90 |0 # +<UE6F6> \xA6\x91 |0 # +<UE6F7> \xA6\x92 |0 # +<UE6F8> \xA6\x93 |0 # +<UE6F9> \xA6\x94 |0 # +<UE6FA> \xA6\x95 |0 # +<UE6FB> \xA6\x96 |0 # +<UE6FC> \xA6\x97 |0 # +<UE6FD> \xA6\x98 |0 # +<UE6FE> \xA6\x99 |0 # +<UE6FF> \xA6\x9A |0 # +<UE700> \xA6\x9B |0 # +<UE701> \xA6\x9C |0 # +<UE702> \xA6\x9D |0 # +<UE703> \xA6\x9E |0 # +<UE704> \xA6\x9F |0 # +<UE705> \xA6\xA0 |0 # +<UE706> \xA7\x40 |0 # +<UE707> \xA7\x41 |0 # +<UE708> \xA7\x42 |0 # +<UE709> \xA7\x43 |0 # +<UE70A> \xA7\x44 |0 # +<UE70B> \xA7\x45 |0 # +<UE70C> \xA7\x46 |0 # +<UE70D> \xA7\x47 |0 # +<UE70E> \xA7\x48 |0 # +<UE70F> \xA7\x49 |0 # +<UE710> \xA7\x4A |0 # +<UE711> \xA7\x4B |0 # +<UE712> \xA7\x4C |0 # +<UE713> \xA7\x4D |0 # +<UE714> \xA7\x4E |0 # +<UE715> \xA7\x4F |0 # +<UE716> \xA7\x50 |0 # +<UE717> \xA7\x51 |0 # +<UE718> \xA7\x52 |0 # +<UE719> \xA7\x53 |0 # +<UE71A> \xA7\x54 |0 # +<UE71B> \xA7\x55 |0 # +<UE71C> \xA7\x56 |0 # +<UE71D> \xA7\x57 |0 # +<UE71E> \xA7\x58 |0 # +<UE71F> \xA7\x59 |0 # +<UE720> \xA7\x5A |0 # +<UE721> \xA7\x5B |0 # +<UE722> \xA7\x5C |0 # +<UE723> \xA7\x5D |0 # +<UE724> \xA7\x5E |0 # +<UE725> \xA7\x5F |0 # +<UE726> \xA7\x60 |0 # +<UE727> \xA7\x61 |0 # +<UE728> \xA7\x62 |0 # +<UE729> \xA7\x63 |0 # +<UE72A> \xA7\x64 |0 # +<UE72B> \xA7\x65 |0 # +<UE72C> \xA7\x66 |0 # +<UE72D> \xA7\x67 |0 # +<UE72E> \xA7\x68 |0 # +<UE72F> \xA7\x69 |0 # +<UE730> \xA7\x6A |0 # +<UE731> \xA7\x6B |0 # +<UE732> \xA7\x6C |0 # +<UE733> \xA7\x6D |0 # +<UE734> \xA7\x6E |0 # +<UE735> \xA7\x6F |0 # +<UE736> \xA7\x70 |0 # +<UE737> \xA7\x71 |0 # +<UE738> \xA7\x72 |0 # +<UE739> \xA7\x73 |0 # +<UE73A> \xA7\x74 |0 # +<UE73B> \xA7\x75 |0 # +<UE73C> \xA7\x76 |0 # +<UE73D> \xA7\x77 |0 # +<UE73E> \xA7\x78 |0 # +<UE73F> \xA7\x79 |0 # +<UE740> \xA7\x7A |0 # +<UE741> \xA7\x7B |0 # +<UE742> \xA7\x7C |0 # +<UE743> \xA7\x7D |0 # +<UE744> \xA7\x7E |0 # +<UE745> \xA7\x80 |0 # +<UE746> \xA7\x81 |0 # +<UE747> \xA7\x82 |0 # +<UE748> \xA7\x83 |0 # +<UE749> \xA7\x84 |0 # +<UE74A> \xA7\x85 |0 # +<UE74B> \xA7\x86 |0 # +<UE74C> \xA7\x87 |0 # +<UE74D> \xA7\x88 |0 # +<UE74E> \xA7\x89 |0 # +<UE74F> \xA7\x8A |0 # +<UE750> \xA7\x8B |0 # +<UE751> \xA7\x8C |0 # +<UE752> \xA7\x8D |0 # +<UE753> \xA7\x8E |0 # +<UE754> \xA7\x8F |0 # +<UE755> \xA7\x90 |0 # +<UE756> \xA7\x91 |0 # +<UE757> \xA7\x92 |0 # +<UE758> \xA7\x93 |0 # +<UE759> \xA7\x94 |0 # +<UE75A> \xA7\x95 |0 # +<UE75B> \xA7\x96 |0 # +<UE75C> \xA7\x97 |0 # +<UE75D> \xA7\x98 |0 # +<UE75E> \xA7\x99 |0 # +<UE75F> \xA7\x9A |0 # +<UE760> \xA7\x9B |0 # +<UE761> \xA7\x9C |0 # +<UE762> \xA7\x9D |0 # +<UE763> \xA7\x9E |0 # +<UE764> \xA7\x9F |0 # +<UE765> \xA7\xA0 |0 # +<UE766> \xA2\xAB |0 # +<UE767> \xA2\xAC |0 # +<UE768> \xA2\xAD |0 # +<UE769> \xA2\xAE |0 # +<UE76A> \xA2\xAF |0 # +<UE76B> \xA2\xB0 |0 # +<UE76C> \xA2\xE3 |0 # +<UE76D> \xA2\xE4 |0 # +<UE76E> \xA2\xEF |0 # +<UE76F> \xA2\xF0 |0 # +<UE770> \xA2\xFD |0 # +<UE771> \xA2\xFE |0 # +<UE772> \xA4\xF4 |0 # +<UE773> \xA4\xF5 |0 # +<UE774> \xA4\xF6 |0 # +<UE775> \xA4\xF7 |0 # +<UE776> \xA4\xF8 |0 # +<UE777> \xA4\xF9 |0 # +<UE778> \xA4\xFA |0 # +<UE779> \xA4\xFB |0 # +<UE77A> \xA4\xFC |0 # +<UE77B> \xA4\xFD |0 # +<UE77C> \xA4\xFE |0 # +<UE77D> \xA5\xF7 |0 # +<UE77E> \xA5\xF8 |0 # +<UE77F> \xA5\xF9 |0 # +<UE780> \xA5\xFA |0 # +<UE781> \xA5\xFB |0 # +<UE782> \xA5\xFC |0 # +<UE783> \xA5\xFD |0 # +<UE784> \xA5\xFE |0 # +<UE785> \xA6\xB9 |0 # +<UE786> \xA6\xBA |0 # +<UE787> \xA6\xBB |0 # +<UE788> \xA6\xBC |0 # +<UE789> \xA6\xBD |0 # +<UE78A> \xA6\xBE |0 # +<UE78B> \xA6\xBF |0 # +<UE78C> \xA6\xC0 |0 # +<UE78D> \xA6\xD9 |0 # +<UE78E> \xA6\xDA |0 # +<UE78F> \xA6\xDB |0 # +<UE790> \xA6\xDC |0 # +<UE791> \xA6\xDD |0 # +<UE792> \xA6\xDE |0 # +<UE793> \xA6\xDF |0 # +<UE794> \xA6\xEC |0 # +<UE795> \xA6\xED |0 # +<UE796> \xA6\xF3 |0 # +<UE797> \xA6\xF6 |0 # +<UE798> \xA6\xF7 |0 # +<UE799> \xA6\xF8 |0 # +<UE79A> \xA6\xF9 |0 # +<UE79B> \xA6\xFA |0 # +<UE79C> \xA6\xFB |0 # +<UE79D> \xA6\xFC |0 # +<UE79E> \xA6\xFD |0 # +<UE79F> \xA6\xFE |0 # +<UE7A0> \xA7\xC2 |0 # +<UE7A1> \xA7\xC3 |0 # +<UE7A2> \xA7\xC4 |0 # +<UE7A3> \xA7\xC5 |0 # +<UE7A4> \xA7\xC6 |0 # +<UE7A5> \xA7\xC7 |0 # +<UE7A6> \xA7\xC8 |0 # +<UE7A7> \xA7\xC9 |0 # +<UE7A8> \xA7\xCA |0 # +<UE7A9> \xA7\xCB |0 # +<UE7AA> \xA7\xCC |0 # +<UE7AB> \xA7\xCD |0 # +<UE7AC> \xA7\xCE |0 # +<UE7AD> \xA7\xCF |0 # +<UE7AE> \xA7\xD0 |0 # +<UE7AF> \xA7\xF2 |0 # +<UE7B0> \xA7\xF3 |0 # +<UE7B1> \xA7\xF4 |0 # +<UE7B2> \xA7\xF5 |0 # +<UE7B3> \xA7\xF6 |0 # +<UE7B4> \xA7\xF7 |0 # +<UE7B5> \xA7\xF8 |0 # +<UE7B6> \xA7\xF9 |0 # +<UE7B7> \xA7\xFA |0 # +<UE7B8> \xA7\xFB |0 # +<UE7B9> \xA7\xFC |0 # +<UE7BA> \xA7\xFD |0 # +<UE7BB> \xA7\xFE |0 # +<UE7BC> \xA8\x96 |0 # +<UE7BD> \xA8\x97 |0 # +<UE7BE> \xA8\x98 |0 # +<UE7BF> \xA8\x99 |0 # +<UE7C0> \xA8\x9A |0 # +<UE7C1> \xA8\x9B |0 # +<UE7C2> \xA8\x9C |0 # +<UE7C3> \xA8\x9D |0 # +<UE7C4> \xA8\x9E |0 # +<UE7C5> \xA8\x9F |0 # +<UE7C6> \xA8\xA0 |0 # +<UE7C7> \xA8\xBC |0 # +<UE7C8> \xA8\xBF |0 # +<UE7C9> \xA8\xC1 |0 # +<UE7CA> \xA8\xC2 |0 # +<UE7CB> \xA8\xC3 |0 # +<UE7CC> \xA8\xC4 |0 # +<UE7CD> \xA8\xEA |0 # +<UE7CE> \xA8\xEB |0 # +<UE7CF> \xA8\xEC |0 # +<UE7D0> \xA8\xED |0 # +<UE7D1> \xA8\xEE |0 # +<UE7D2> \xA8\xEF |0 # +<UE7D3> \xA8\xF0 |0 # +<UE7D4> \xA8\xF1 |0 # +<UE7D5> \xA8\xF2 |0 # +<UE7D6> \xA8\xF3 |0 # +<UE7D7> \xA8\xF4 |0 # +<UE7D8> \xA8\xF5 |0 # +<UE7D9> \xA8\xF6 |0 # +<UE7DA> \xA8\xF7 |0 # +<UE7DB> \xA8\xF8 |0 # +<UE7DC> \xA8\xF9 |0 # +<UE7DD> \xA8\xFA |0 # +<UE7DE> \xA8\xFB |0 # +<UE7DF> \xA8\xFC |0 # +<UE7E0> \xA8\xFD |0 # +<UE7E1> \xA8\xFE |0 # +<UE7E2> \xA9\x58 |0 # +<UE7E3> \xA9\x5B |0 # +<UE7E4> \xA9\x5D |0 # +<UE7E5> \xA9\x5E |0 # +<UE7E6> \xA9\x5F |0 # +<UE7E7> \xA9\x89 |0 # +<UE7E8> \xA9\x8A |0 # +<UE7E9> \xA9\x8B |0 # +<UE7EA> \xA9\x8C |0 # +<UE7EB> \xA9\x8D |0 # +<UE7EC> \xA9\x8E |0 # +<UE7ED> \xA9\x8F |0 # +<UE7EE> \xA9\x90 |0 # +<UE7EF> \xA9\x91 |0 # +<UE7F0> \xA9\x92 |0 # +<UE7F1> \xA9\x93 |0 # +<UE7F2> \xA9\x94 |0 # +<UE7F3> \xA9\x95 |0 # +<UE7F4> \xA9\x97 |0 # +<UE7F5> \xA9\x98 |0 # +<UE7F6> \xA9\x99 |0 # +<UE7F7> \xA9\x9A |0 # +<UE7F8> \xA9\x9B |0 # +<UE7F9> \xA9\x9C |0 # +<UE7FA> \xA9\x9D |0 # +<UE7FB> \xA9\x9E |0 # +<UE7FC> \xA9\x9F |0 # +<UE7FD> \xA9\xA0 |0 # +<UE7FE> \xA9\xA1 |0 # +<UE7FF> \xA9\xA2 |0 # +<UE800> \xA9\xA3 |0 # +<UE801> \xA9\xF0 |0 # +<UE802> \xA9\xF1 |0 # +<UE803> \xA9\xF2 |0 # +<UE804> \xA9\xF3 |0 # +<UE805> \xA9\xF4 |0 # +<UE806> \xA9\xF5 |0 # +<UE807> \xA9\xF6 |0 # +<UE808> \xA9\xF7 |0 # +<UE809> \xA9\xF8 |0 # +<UE80A> \xA9\xF9 |0 # +<UE80B> \xA9\xFA |0 # +<UE80C> \xA9\xFB |0 # +<UE80D> \xA9\xFC |0 # +<UE80E> \xA9\xFD |0 # +<UE80F> \xA9\xFE |0 # +<UE810> \xD7\xFA |0 # +<UE811> \xD7\xFB |0 # +<UE812> \xD7\xFC |0 # +<UE813> \xD7\xFD |0 # +<UE814> \xD7\xFE |0 # +<UE815> \xFE\x50 |0 # +<UE816> \xFE\x51 |0 # +<UE817> \xFE\x52 |0 # +<UE818> \xFE\x53 |0 # +<UE819> \xFE\x54 |0 # +<UE81A> \xFE\x55 |0 # +<UE81B> \xFE\x56 |0 # +<UE81C> \xFE\x57 |0 # +<UE81D> \xFE\x58 |0 # +<UE81E> \xFE\x59 |0 # +<UE81F> \xFE\x5A |0 # +<UE820> \xFE\x5B |0 # +<UE821> \xFE\x5C |0 # +<UE822> \xFE\x5D |0 # +<UE823> \xFE\x5E |0 # +<UE824> \xFE\x5F |0 # +<UE825> \xFE\x60 |0 # +<UE826> \xFE\x61 |0 # +<UE827> \xFE\x62 |0 # +<UE828> \xFE\x63 |0 # +<UE829> \xFE\x64 |0 # +<UE82A> \xFE\x65 |0 # +<UE82B> \xFE\x66 |0 # +<UE82C> \xFE\x67 |0 # +<UE82D> \xFE\x68 |0 # +<UE82E> \xFE\x69 |0 # +<UE82F> \xFE\x6A |0 # +<UE830> \xFE\x6B |0 # +<UE831> \xFE\x6C |0 # +<UE832> \xFE\x6D |0 # +<UE833> \xFE\x6E |0 # +<UE834> \xFE\x6F |0 # +<UE835> \xFE\x70 |0 # +<UE836> \xFE\x71 |0 # +<UE837> \xFE\x72 |0 # +<UE838> \xFE\x73 |0 # +<UE839> \xFE\x74 |0 # +<UE83A> \xFE\x75 |0 # +<UE83B> \xFE\x76 |0 # +<UE83C> \xFE\x77 |0 # +<UE83D> \xFE\x78 |0 # +<UE83E> \xFE\x79 |0 # +<UE83F> \xFE\x7A |0 # +<UE840> \xFE\x7B |0 # +<UE841> \xFE\x7C |0 # +<UE842> \xFE\x7D |0 # +<UE843> \xFE\x7E |0 # +<UE844> \xFE\x80 |0 # +<UE845> \xFE\x81 |0 # +<UE846> \xFE\x82 |0 # +<UE847> \xFE\x83 |0 # +<UE848> \xFE\x84 |0 # +<UE849> \xFE\x85 |0 # +<UE84A> \xFE\x86 |0 # +<UE84B> \xFE\x87 |0 # +<UE84C> \xFE\x88 |0 # +<UE84D> \xFE\x89 |0 # +<UE84E> \xFE\x8A |0 # +<UE84F> \xFE\x8B |0 # +<UE850> \xFE\x8C |0 # +<UE851> \xFE\x8D |0 # +<UE852> \xFE\x8E |0 # +<UE853> \xFE\x8F |0 # +<UE854> \xFE\x90 |0 # +<UE855> \xFE\x91 |0 # +<UE856> \xFE\x92 |0 # +<UE857> \xFE\x93 |0 # +<UE858> \xFE\x94 |0 # +<UE859> \xFE\x95 |0 # +<UE85A> \xFE\x96 |0 # +<UE85B> \xFE\x97 |0 # +<UE85C> \xFE\x98 |0 # +<UE85D> \xFE\x99 |0 # +<UE85E> \xFE\x9A |0 # +<UE85F> \xFE\x9B |0 # +<UE860> \xFE\x9C |0 # +<UE861> \xFE\x9D |0 # +<UE862> \xFE\x9E |0 # +<UE863> \xFE\x9F |0 # +<UE864> \xFE\xA0 |0 # +<UF8F5> \xFF |0 # <UF92C> \xFD\x9C |0 # CJK COMPATIBILITY IDEOGRAPH <UF979> \xFD\x9D |0 # CJK COMPATIBILITY IDEOGRAPH <UF995> \xFD\x9E |0 # CJK COMPATIBILITY IDEOGRAPH diff --git a/ext/Encode/ucm/cp949.ucm b/ext/Encode/ucm/cp949.ucm index d766c81ceb..fcfcfb56a9 100644 --- a/ext/Encode/ucm/cp949.ucm +++ b/ext/Encode/ucm/cp949.ucm @@ -1,8 +1,8 @@ # -# $Id: cp949.ucm,v 1.20 2002/04/04 19:50:53 dankogai Exp $ +# $Id: cp949.ucm,v 1.22 2002/10/21 06:05:37 dankogai Exp $ # # Original table can be obtained at -# http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP949.TXT +# http://www.microsoft.com/typography/unicode/949.txt # <code_set_name> "cp949" <mb_cur_min> 1 @@ -137,6 +137,7 @@ CHARMAP <U007D> \x7D |0 # RIGHT CURLY BRACKET <U007E> \x7E |0 # TILDE <U007F> \x7F |0 # DELETE +<U0080> \x80 |0 # <U00A1> \xA2\xAE |0 # INVERTED EXCLAMATION MARK <U00A4> \xA2\xB4 |0 # CURRENCY SIGN <U00A7> \xA1\xD7 |0 # SECTION SIGN @@ -16817,6 +16818,195 @@ CHARMAP <UD7A1> \xC6\x50 |0 # HANGUL SYLLABLE HIEUH I THIEUTH <UD7A2> \xC6\x51 |0 # HANGUL SYLLABLE HIEUH I PHIEUPH <UD7A3> \xC6\x52 |0 # HANGUL SYLLABLE HIEUH I HIEUH +<UE000> \xC9\xA1 |0 # +<UE001> \xC9\xA2 |0 # +<UE002> \xC9\xA3 |0 # +<UE003> \xC9\xA4 |0 # +<UE004> \xC9\xA5 |0 # +<UE005> \xC9\xA6 |0 # +<UE006> \xC9\xA7 |0 # +<UE007> \xC9\xA8 |0 # +<UE008> \xC9\xA9 |0 # +<UE009> \xC9\xAA |0 # +<UE00A> \xC9\xAB |0 # +<UE00B> \xC9\xAC |0 # +<UE00C> \xC9\xAD |0 # +<UE00D> \xC9\xAE |0 # +<UE00E> \xC9\xAF |0 # +<UE00F> \xC9\xB0 |0 # +<UE010> \xC9\xB1 |0 # +<UE011> \xC9\xB2 |0 # +<UE012> \xC9\xB3 |0 # +<UE013> \xC9\xB4 |0 # +<UE014> \xC9\xB5 |0 # +<UE015> \xC9\xB6 |0 # +<UE016> \xC9\xB7 |0 # +<UE017> \xC9\xB8 |0 # +<UE018> \xC9\xB9 |0 # +<UE019> \xC9\xBA |0 # +<UE01A> \xC9\xBB |0 # +<UE01B> \xC9\xBC |0 # +<UE01C> \xC9\xBD |0 # +<UE01D> \xC9\xBE |0 # +<UE01E> \xC9\xBF |0 # +<UE01F> \xC9\xC0 |0 # +<UE020> \xC9\xC1 |0 # +<UE021> \xC9\xC2 |0 # +<UE022> \xC9\xC3 |0 # +<UE023> \xC9\xC4 |0 # +<UE024> \xC9\xC5 |0 # +<UE025> \xC9\xC6 |0 # +<UE026> \xC9\xC7 |0 # +<UE027> \xC9\xC8 |0 # +<UE028> \xC9\xC9 |0 # +<UE029> \xC9\xCA |0 # +<UE02A> \xC9\xCB |0 # +<UE02B> \xC9\xCC |0 # +<UE02C> \xC9\xCD |0 # +<UE02D> \xC9\xCE |0 # +<UE02E> \xC9\xCF |0 # +<UE02F> \xC9\xD0 |0 # +<UE030> \xC9\xD1 |0 # +<UE031> \xC9\xD2 |0 # +<UE032> \xC9\xD3 |0 # +<UE033> \xC9\xD4 |0 # +<UE034> \xC9\xD5 |0 # +<UE035> \xC9\xD6 |0 # +<UE036> \xC9\xD7 |0 # +<UE037> \xC9\xD8 |0 # +<UE038> \xC9\xD9 |0 # +<UE039> \xC9\xDA |0 # +<UE03A> \xC9\xDB |0 # +<UE03B> \xC9\xDC |0 # +<UE03C> \xC9\xDD |0 # +<UE03D> \xC9\xDE |0 # +<UE03E> \xC9\xDF |0 # +<UE03F> \xC9\xE0 |0 # +<UE040> \xC9\xE1 |0 # +<UE041> \xC9\xE2 |0 # +<UE042> \xC9\xE3 |0 # +<UE043> \xC9\xE4 |0 # +<UE044> \xC9\xE5 |0 # +<UE045> \xC9\xE6 |0 # +<UE046> \xC9\xE7 |0 # +<UE047> \xC9\xE8 |0 # +<UE048> \xC9\xE9 |0 # +<UE049> \xC9\xEA |0 # +<UE04A> \xC9\xEB |0 # +<UE04B> \xC9\xEC |0 # +<UE04C> \xC9\xED |0 # +<UE04D> \xC9\xEE |0 # +<UE04E> \xC9\xEF |0 # +<UE04F> \xC9\xF0 |0 # +<UE050> \xC9\xF1 |0 # +<UE051> \xC9\xF2 |0 # +<UE052> \xC9\xF3 |0 # +<UE053> \xC9\xF4 |0 # +<UE054> \xC9\xF5 |0 # +<UE055> \xC9\xF6 |0 # +<UE056> \xC9\xF7 |0 # +<UE057> \xC9\xF8 |0 # +<UE058> \xC9\xF9 |0 # +<UE059> \xC9\xFA |0 # +<UE05A> \xC9\xFB |0 # +<UE05B> \xC9\xFC |0 # +<UE05C> \xC9\xFD |0 # +<UE05D> \xC9\xFE |0 # +<UE05E> \xFE\xA1 |0 # +<UE05F> \xFE\xA2 |0 # +<UE060> \xFE\xA3 |0 # +<UE061> \xFE\xA4 |0 # +<UE062> \xFE\xA5 |0 # +<UE063> \xFE\xA6 |0 # +<UE064> \xFE\xA7 |0 # +<UE065> \xFE\xA8 |0 # +<UE066> \xFE\xA9 |0 # +<UE067> \xFE\xAA |0 # +<UE068> \xFE\xAB |0 # +<UE069> \xFE\xAC |0 # +<UE06A> \xFE\xAD |0 # +<UE06B> \xFE\xAE |0 # +<UE06C> \xFE\xAF |0 # +<UE06D> \xFE\xB0 |0 # +<UE06E> \xFE\xB1 |0 # +<UE06F> \xFE\xB2 |0 # +<UE070> \xFE\xB3 |0 # +<UE071> \xFE\xB4 |0 # +<UE072> \xFE\xB5 |0 # +<UE073> \xFE\xB6 |0 # +<UE074> \xFE\xB7 |0 # +<UE075> \xFE\xB8 |0 # +<UE076> \xFE\xB9 |0 # +<UE077> \xFE\xBA |0 # +<UE078> \xFE\xBB |0 # +<UE079> \xFE\xBC |0 # +<UE07A> \xFE\xBD |0 # +<UE07B> \xFE\xBE |0 # +<UE07C> \xFE\xBF |0 # +<UE07D> \xFE\xC0 |0 # +<UE07E> \xFE\xC1 |0 # +<UE07F> \xFE\xC2 |0 # +<UE080> \xFE\xC3 |0 # +<UE081> \xFE\xC4 |0 # +<UE082> \xFE\xC5 |0 # +<UE083> \xFE\xC6 |0 # +<UE084> \xFE\xC7 |0 # +<UE085> \xFE\xC8 |0 # +<UE086> \xFE\xC9 |0 # +<UE087> \xFE\xCA |0 # +<UE088> \xFE\xCB |0 # +<UE089> \xFE\xCC |0 # +<UE08A> \xFE\xCD |0 # +<UE08B> \xFE\xCE |0 # +<UE08C> \xFE\xCF |0 # +<UE08D> \xFE\xD0 |0 # +<UE08E> \xFE\xD1 |0 # +<UE08F> \xFE\xD2 |0 # +<UE090> \xFE\xD3 |0 # +<UE091> \xFE\xD4 |0 # +<UE092> \xFE\xD5 |0 # +<UE093> \xFE\xD6 |0 # +<UE094> \xFE\xD7 |0 # +<UE095> \xFE\xD8 |0 # +<UE096> \xFE\xD9 |0 # +<UE097> \xFE\xDA |0 # +<UE098> \xFE\xDB |0 # +<UE099> \xFE\xDC |0 # +<UE09A> \xFE\xDD |0 # +<UE09B> \xFE\xDE |0 # +<UE09C> \xFE\xDF |0 # +<UE09D> \xFE\xE0 |0 # +<UE09E> \xFE\xE1 |0 # +<UE09F> \xFE\xE2 |0 # +<UE0A0> \xFE\xE3 |0 # +<UE0A1> \xFE\xE4 |0 # +<UE0A2> \xFE\xE5 |0 # +<UE0A3> \xFE\xE6 |0 # +<UE0A4> \xFE\xE7 |0 # +<UE0A5> \xFE\xE8 |0 # +<UE0A6> \xFE\xE9 |0 # +<UE0A7> \xFE\xEA |0 # +<UE0A8> \xFE\xEB |0 # +<UE0A9> \xFE\xEC |0 # +<UE0AA> \xFE\xED |0 # +<UE0AB> \xFE\xEE |0 # +<UE0AC> \xFE\xEF |0 # +<UE0AD> \xFE\xF0 |0 # +<UE0AE> \xFE\xF1 |0 # +<UE0AF> \xFE\xF2 |0 # +<UE0B0> \xFE\xF3 |0 # +<UE0B1> \xFE\xF4 |0 # +<UE0B2> \xFE\xF5 |0 # +<UE0B3> \xFE\xF6 |0 # +<UE0B4> \xFE\xF7 |0 # +<UE0B5> \xFE\xF8 |0 # +<UE0B6> \xFE\xF9 |0 # +<UE0B7> \xFE\xFA |0 # +<UE0B8> \xFE\xFB |0 # +<UE0B9> \xFE\xFC |0 # +<UE0BA> \xFE\xFD |0 # +<UE0BB> \xFE\xFE |0 # +<UF8F7> \xFF |0 # <UF900> \xCB\xD0 |0 # CJK COMPATIBILITY IDEOGRAPH <UF901> \xCB\xD6 |0 # CJK COMPATIBILITY IDEOGRAPH <UF902> \xCB\xE7 |0 # CJK COMPATIBILITY IDEOGRAPH diff --git a/ext/Encode/ucm/cp950.ucm b/ext/Encode/ucm/cp950.ucm index 537c90a351..dbb89e43c6 100644 --- a/ext/Encode/ucm/cp950.ucm +++ b/ext/Encode/ucm/cp950.ucm @@ -1,8 +1,8 @@ # -# $Id: cp950.ucm,v 1.20 2002/04/04 19:50:54 dankogai Exp $ +# $Id: cp950.ucm,v 1.22 2002/10/21 06:05:37 dankogai Exp $ # # Original table can be obtained at -# http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP950.TXT +# http://www.microsoft.com/typography/unicode/950.txt # <code_set_name> "cp950" <mb_cur_min> 1 @@ -137,6 +137,7 @@ CHARMAP <U007D> \x7D |0 # RIGHT CURLY BRACKET <U007E> \x7E |0 # TILDE <U007F> \x7F |0 # DELETE +<U0080> \x80 |0 # <U00A7> \xA1\xB1 |0 # SECTION SIGN <U00AF> \xA1\xC2 |0 # MACRON <U00B0> \xA2\x58 |0 # DEGREE SIGN @@ -266,6 +267,7 @@ CHARMAP <U2534> \xA2\x72 |0 # BOX DRAWINGS LIGHT UP AND HORIZONTAL <U253C> \xA2\x71 |0 # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL <U2550> \xF9\xF9 |0 # BOX DRAWINGS DOUBLE HORIZONTAL +<U2550> \xA2\xA4 |3 # BOX DRAWINGS DOUBLE HORIZONTAL <U2551> \xF9\xF8 |0 # BOX DRAWINGS DOUBLE VERTICAL <U2552> \xF9\xE6 |0 # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE <U2553> \xF9\xEF |0 # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE @@ -280,9 +282,11 @@ CHARMAP <U255C> \xF9\xF7 |0 # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE <U255D> \xF9\xE5 |0 # BOX DRAWINGS DOUBLE UP AND LEFT <U255E> \xF9\xE9 |0 # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE +<U255E> \xA2\xA5 |3 # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE <U255F> \xF9\xF2 |0 # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE <U2560> \xF9\xE0 |0 # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT <U2561> \xF9\xEB |0 # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE +<U2561> \xA2\xA7 |3 # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE <U2562> \xF9\xF4 |0 # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE <U2563> \xF9\xE2 |0 # BOX DRAWINGS DOUBLE VERTICAL AND LEFT <U2564> \xF9\xE7 |0 # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE @@ -292,12 +296,17 @@ CHARMAP <U2568> \xF9\xF6 |0 # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE <U2569> \xF9\xE4 |0 # BOX DRAWINGS DOUBLE UP AND HORIZONTAL <U256A> \xF9\xEA |0 # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE +<U256A> \xA2\xA6 |3 # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE <U256B> \xF9\xF3 |0 # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE <U256C> \xF9\xE1 |0 # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL -<U256D> \xF9\xFA |0 # BOX DRAWINGS LIGHT ARC DOWN AND RIGHT -<U256E> \xF9\xFB |0 # BOX DRAWINGS LIGHT ARC DOWN AND LEFT -<U256F> \xF9\xFD |0 # BOX DRAWINGS LIGHT ARC UP AND LEFT -<U2570> \xF9\xFC |0 # BOX DRAWINGS LIGHT ARC UP AND RIGHT +<U256D> \xA2\x7E |0 # BOX DRAWINGS LIGHT ARC DOWN AND RIGHT +<U256D> \xF9\xFA |3 # BOX DRAWINGS LIGHT ARC DOWN AND RIGHT +<U256E> \xA2\xA1 |0 # BOX DRAWINGS LIGHT ARC DOWN AND LEFT +<U256E> \xF9\xFB |3 # BOX DRAWINGS LIGHT ARC DOWN AND LEFT +<U256F> \xA2\xA3 |0 # BOX DRAWINGS LIGHT ARC UP AND LEFT +<U256F> \xF9\xFD |3 # BOX DRAWINGS LIGHT ARC UP AND LEFT +<U2570> \xA2\xA2 |0 # BOX DRAWINGS LIGHT ARC UP AND RIGHT +<U2570> \xF9\xFC |3 # BOX DRAWINGS LIGHT ARC UP AND RIGHT <U2571> \xA2\xAC |0 # BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT <U2572> \xA2\xAD |0 # BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT <U2573> \xA2\xAE |0 # BOX DRAWINGS LIGHT DIAGONAL CROSS @@ -1210,9 +1219,11 @@ CHARMAP <U533F> \xB0\xCE |0 # CJK UNIFIED IDEOGRAPH <U5340> \xB0\xCF |0 # CJK UNIFIED IDEOGRAPH <U5341> \xA4\x51 |0 # CJK UNIFIED IDEOGRAPH +<U5341> \xA2\xCC |3 # CJK UNIFIED IDEOGRAPH <U5343> \xA4\x64 |0 # CJK UNIFIED IDEOGRAPH <U5344> \xA2\xCD |0 # CJK UNIFIED IDEOGRAPH <U5345> \xA4\xCA |0 # CJK UNIFIED IDEOGRAPH +<U5345> \xA2\xCE |3 # CJK UNIFIED IDEOGRAPH <U5347> \xA4\xC9 |0 # CJK UNIFIED IDEOGRAPH <U5348> \xA4\xC8 |0 # CJK UNIFIED IDEOGRAPH <U5349> \xA5\x63 |0 # CJK UNIFIED IDEOGRAPH @@ -13484,6 +13495,6224 @@ CHARMAP <U9FA0> \xEF\xB6 |0 # CJK UNIFIED IDEOGRAPH <U9FA2> \xF7\xCF |0 # CJK UNIFIED IDEOGRAPH <U9FA4> \xF9\xA1 |0 # CJK UNIFIED IDEOGRAPH +<UE000> \xFA\x40 |0 # +<UE001> \xFA\x41 |0 # +<UE002> \xFA\x42 |0 # +<UE003> \xFA\x43 |0 # +<UE004> \xFA\x44 |0 # +<UE005> \xFA\x45 |0 # +<UE006> \xFA\x46 |0 # +<UE007> \xFA\x47 |0 # +<UE008> \xFA\x48 |0 # +<UE009> \xFA\x49 |0 # +<UE00A> \xFA\x4A |0 # +<UE00B> \xFA\x4B |0 # +<UE00C> \xFA\x4C |0 # +<UE00D> \xFA\x4D |0 # +<UE00E> \xFA\x4E |0 # +<UE00F> \xFA\x4F |0 # +<UE010> \xFA\x50 |0 # +<UE011> \xFA\x51 |0 # +<UE012> \xFA\x52 |0 # +<UE013> \xFA\x53 |0 # +<UE014> \xFA\x54 |0 # +<UE015> \xFA\x55 |0 # +<UE016> \xFA\x56 |0 # +<UE017> \xFA\x57 |0 # +<UE018> \xFA\x58 |0 # +<UE019> \xFA\x59 |0 # +<UE01A> \xFA\x5A |0 # +<UE01B> \xFA\x5B |0 # +<UE01C> \xFA\x5C |0 # +<UE01D> \xFA\x5D |0 # +<UE01E> \xFA\x5E |0 # +<UE01F> \xFA\x5F |0 # +<UE020> \xFA\x60 |0 # +<UE021> \xFA\x61 |0 # +<UE022> \xFA\x62 |0 # +<UE023> \xFA\x63 |0 # +<UE024> \xFA\x64 |0 # +<UE025> \xFA\x65 |0 # +<UE026> \xFA\x66 |0 # +<UE027> \xFA\x67 |0 # +<UE028> \xFA\x68 |0 # +<UE029> \xFA\x69 |0 # +<UE02A> \xFA\x6A |0 # +<UE02B> \xFA\x6B |0 # +<UE02C> \xFA\x6C |0 # +<UE02D> \xFA\x6D |0 # +<UE02E> \xFA\x6E |0 # +<UE02F> \xFA\x6F |0 # +<UE030> \xFA\x70 |0 # +<UE031> \xFA\x71 |0 # +<UE032> \xFA\x72 |0 # +<UE033> \xFA\x73 |0 # +<UE034> \xFA\x74 |0 # +<UE035> \xFA\x75 |0 # +<UE036> \xFA\x76 |0 # +<UE037> \xFA\x77 |0 # +<UE038> \xFA\x78 |0 # +<UE039> \xFA\x79 |0 # +<UE03A> \xFA\x7A |0 # +<UE03B> \xFA\x7B |0 # +<UE03C> \xFA\x7C |0 # +<UE03D> \xFA\x7D |0 # +<UE03E> \xFA\x7E |0 # +<UE03F> \xFA\xA1 |0 # +<UE040> \xFA\xA2 |0 # +<UE041> \xFA\xA3 |0 # +<UE042> \xFA\xA4 |0 # +<UE043> \xFA\xA5 |0 # +<UE044> \xFA\xA6 |0 # +<UE045> \xFA\xA7 |0 # +<UE046> \xFA\xA8 |0 # +<UE047> \xFA\xA9 |0 # +<UE048> \xFA\xAA |0 # +<UE049> \xFA\xAB |0 # +<UE04A> \xFA\xAC |0 # +<UE04B> \xFA\xAD |0 # +<UE04C> \xFA\xAE |0 # +<UE04D> \xFA\xAF |0 # +<UE04E> \xFA\xB0 |0 # +<UE04F> \xFA\xB1 |0 # +<UE050> \xFA\xB2 |0 # +<UE051> \xFA\xB3 |0 # +<UE052> \xFA\xB4 |0 # +<UE053> \xFA\xB5 |0 # +<UE054> \xFA\xB6 |0 # +<UE055> \xFA\xB7 |0 # +<UE056> \xFA\xB8 |0 # +<UE057> \xFA\xB9 |0 # +<UE058> \xFA\xBA |0 # +<UE059> \xFA\xBB |0 # +<UE05A> \xFA\xBC |0 # +<UE05B> \xFA\xBD |0 # +<UE05C> \xFA\xBE |0 # +<UE05D> \xFA\xBF |0 # +<UE05E> \xFA\xC0 |0 # +<UE05F> \xFA\xC1 |0 # +<UE060> \xFA\xC2 |0 # +<UE061> \xFA\xC3 |0 # +<UE062> \xFA\xC4 |0 # +<UE063> \xFA\xC5 |0 # +<UE064> \xFA\xC6 |0 # +<UE065> \xFA\xC7 |0 # +<UE066> \xFA\xC8 |0 # +<UE067> \xFA\xC9 |0 # +<UE068> \xFA\xCA |0 # +<UE069> \xFA\xCB |0 # +<UE06A> \xFA\xCC |0 # +<UE06B> \xFA\xCD |0 # +<UE06C> \xFA\xCE |0 # +<UE06D> \xFA\xCF |0 # +<UE06E> \xFA\xD0 |0 # +<UE06F> \xFA\xD1 |0 # +<UE070> \xFA\xD2 |0 # +<UE071> \xFA\xD3 |0 # +<UE072> \xFA\xD4 |0 # +<UE073> \xFA\xD5 |0 # +<UE074> \xFA\xD6 |0 # +<UE075> \xFA\xD7 |0 # +<UE076> \xFA\xD8 |0 # +<UE077> \xFA\xD9 |0 # +<UE078> \xFA\xDA |0 # +<UE079> \xFA\xDB |0 # +<UE07A> \xFA\xDC |0 # +<UE07B> \xFA\xDD |0 # +<UE07C> \xFA\xDE |0 # +<UE07D> \xFA\xDF |0 # +<UE07E> \xFA\xE0 |0 # +<UE07F> \xFA\xE1 |0 # +<UE080> \xFA\xE2 |0 # +<UE081> \xFA\xE3 |0 # +<UE082> \xFA\xE4 |0 # +<UE083> \xFA\xE5 |0 # +<UE084> \xFA\xE6 |0 # +<UE085> \xFA\xE7 |0 # +<UE086> \xFA\xE8 |0 # +<UE087> \xFA\xE9 |0 # +<UE088> \xFA\xEA |0 # +<UE089> \xFA\xEB |0 # +<UE08A> \xFA\xEC |0 # +<UE08B> \xFA\xED |0 # +<UE08C> \xFA\xEE |0 # +<UE08D> \xFA\xEF |0 # +<UE08E> \xFA\xF0 |0 # +<UE08F> \xFA\xF1 |0 # +<UE090> \xFA\xF2 |0 # +<UE091> \xFA\xF3 |0 # +<UE092> \xFA\xF4 |0 # +<UE093> \xFA\xF5 |0 # +<UE094> \xFA\xF6 |0 # +<UE095> \xFA\xF7 |0 # +<UE096> \xFA\xF8 |0 # +<UE097> \xFA\xF9 |0 # +<UE098> \xFA\xFA |0 # +<UE099> \xFA\xFB |0 # +<UE09A> \xFA\xFC |0 # +<UE09B> \xFA\xFD |0 # +<UE09C> \xFA\xFE |0 # +<UE09D> \xFB\x40 |0 # +<UE09E> \xFB\x41 |0 # +<UE09F> \xFB\x42 |0 # +<UE0A0> \xFB\x43 |0 # +<UE0A1> \xFB\x44 |0 # +<UE0A2> \xFB\x45 |0 # +<UE0A3> \xFB\x46 |0 # +<UE0A4> \xFB\x47 |0 # +<UE0A5> \xFB\x48 |0 # +<UE0A6> \xFB\x49 |0 # +<UE0A7> \xFB\x4A |0 # +<UE0A8> \xFB\x4B |0 # +<UE0A9> \xFB\x4C |0 # +<UE0AA> \xFB\x4D |0 # +<UE0AB> \xFB\x4E |0 # +<UE0AC> \xFB\x4F |0 # +<UE0AD> \xFB\x50 |0 # +<UE0AE> \xFB\x51 |0 # +<UE0AF> \xFB\x52 |0 # +<UE0B0> \xFB\x53 |0 # +<UE0B1> \xFB\x54 |0 # +<UE0B2> \xFB\x55 |0 # +<UE0B3> \xFB\x56 |0 # +<UE0B4> \xFB\x57 |0 # +<UE0B5> \xFB\x58 |0 # +<UE0B6> \xFB\x59 |0 # +<UE0B7> \xFB\x5A |0 # +<UE0B8> \xFB\x5B |0 # +<UE0B9> \xFB\x5C |0 # +<UE0BA> \xFB\x5D |0 # +<UE0BB> \xFB\x5E |0 # +<UE0BC> \xFB\x5F |0 # +<UE0BD> \xFB\x60 |0 # +<UE0BE> \xFB\x61 |0 # +<UE0BF> \xFB\x62 |0 # +<UE0C0> \xFB\x63 |0 # +<UE0C1> \xFB\x64 |0 # +<UE0C2> \xFB\x65 |0 # +<UE0C3> \xFB\x66 |0 # +<UE0C4> \xFB\x67 |0 # +<UE0C5> \xFB\x68 |0 # +<UE0C6> \xFB\x69 |0 # +<UE0C7> \xFB\x6A |0 # +<UE0C8> \xFB\x6B |0 # +<UE0C9> \xFB\x6C |0 # +<UE0CA> \xFB\x6D |0 # +<UE0CB> \xFB\x6E |0 # +<UE0CC> \xFB\x6F |0 # +<UE0CD> \xFB\x70 |0 # +<UE0CE> \xFB\x71 |0 # +<UE0CF> \xFB\x72 |0 # +<UE0D0> \xFB\x73 |0 # +<UE0D1> \xFB\x74 |0 # +<UE0D2> \xFB\x75 |0 # +<UE0D3> \xFB\x76 |0 # +<UE0D4> \xFB\x77 |0 # +<UE0D5> \xFB\x78 |0 # +<UE0D6> \xFB\x79 |0 # +<UE0D7> \xFB\x7A |0 # +<UE0D8> \xFB\x7B |0 # +<UE0D9> \xFB\x7C |0 # +<UE0DA> \xFB\x7D |0 # +<UE0DB> \xFB\x7E |0 # +<UE0DC> \xFB\xA1 |0 # +<UE0DD> \xFB\xA2 |0 # +<UE0DE> \xFB\xA3 |0 # +<UE0DF> \xFB\xA4 |0 # +<UE0E0> \xFB\xA5 |0 # +<UE0E1> \xFB\xA6 |0 # +<UE0E2> \xFB\xA7 |0 # +<UE0E3> \xFB\xA8 |0 # +<UE0E4> \xFB\xA9 |0 # +<UE0E5> \xFB\xAA |0 # +<UE0E6> \xFB\xAB |0 # +<UE0E7> \xFB\xAC |0 # +<UE0E8> \xFB\xAD |0 # +<UE0E9> \xFB\xAE |0 # +<UE0EA> \xFB\xAF |0 # +<UE0EB> \xFB\xB0 |0 # +<UE0EC> \xFB\xB1 |0 # +<UE0ED> \xFB\xB2 |0 # +<UE0EE> \xFB\xB3 |0 # +<UE0EF> \xFB\xB4 |0 # +<UE0F0> \xFB\xB5 |0 # +<UE0F1> \xFB\xB6 |0 # +<UE0F2> \xFB\xB7 |0 # +<UE0F3> \xFB\xB8 |0 # +<UE0F4> \xFB\xB9 |0 # +<UE0F5> \xFB\xBA |0 # +<UE0F6> \xFB\xBB |0 # +<UE0F7> \xFB\xBC |0 # +<UE0F8> \xFB\xBD |0 # +<UE0F9> \xFB\xBE |0 # +<UE0FA> \xFB\xBF |0 # +<UE0FB> \xFB\xC0 |0 # +<UE0FC> \xFB\xC1 |0 # +<UE0FD> \xFB\xC2 |0 # +<UE0FE> \xFB\xC3 |0 # +<UE0FF> \xFB\xC4 |0 # +<UE100> \xFB\xC5 |0 # +<UE101> \xFB\xC6 |0 # +<UE102> \xFB\xC7 |0 # +<UE103> \xFB\xC8 |0 # +<UE104> \xFB\xC9 |0 # +<UE105> \xFB\xCA |0 # +<UE106> \xFB\xCB |0 # +<UE107> \xFB\xCC |0 # +<UE108> \xFB\xCD |0 # +<UE109> \xFB\xCE |0 # +<UE10A> \xFB\xCF |0 # +<UE10B> \xFB\xD0 |0 # +<UE10C> \xFB\xD1 |0 # +<UE10D> \xFB\xD2 |0 # +<UE10E> \xFB\xD3 |0 # +<UE10F> \xFB\xD4 |0 # +<UE110> \xFB\xD5 |0 # +<UE111> \xFB\xD6 |0 # +<UE112> \xFB\xD7 |0 # +<UE113> \xFB\xD8 |0 # +<UE114> \xFB\xD9 |0 # +<UE115> \xFB\xDA |0 # +<UE116> \xFB\xDB |0 # +<UE117> \xFB\xDC |0 # +<UE118> \xFB\xDD |0 # +<UE119> \xFB\xDE |0 # +<UE11A> \xFB\xDF |0 # +<UE11B> \xFB\xE0 |0 # +<UE11C> \xFB\xE1 |0 # +<UE11D> \xFB\xE2 |0 # +<UE11E> \xFB\xE3 |0 # +<UE11F> \xFB\xE4 |0 # +<UE120> \xFB\xE5 |0 # +<UE121> \xFB\xE6 |0 # +<UE122> \xFB\xE7 |0 # +<UE123> \xFB\xE8 |0 # +<UE124> \xFB\xE9 |0 # +<UE125> \xFB\xEA |0 # +<UE126> \xFB\xEB |0 # +<UE127> \xFB\xEC |0 # +<UE128> \xFB\xED |0 # +<UE129> \xFB\xEE |0 # +<UE12A> \xFB\xEF |0 # +<UE12B> \xFB\xF0 |0 # +<UE12C> \xFB\xF1 |0 # +<UE12D> \xFB\xF2 |0 # +<UE12E> \xFB\xF3 |0 # +<UE12F> \xFB\xF4 |0 # +<UE130> \xFB\xF5 |0 # +<UE131> \xFB\xF6 |0 # +<UE132> \xFB\xF7 |0 # +<UE133> \xFB\xF8 |0 # +<UE134> \xFB\xF9 |0 # +<UE135> \xFB\xFA |0 # +<UE136> \xFB\xFB |0 # +<UE137> \xFB\xFC |0 # +<UE138> \xFB\xFD |0 # +<UE139> \xFB\xFE |0 # +<UE13A> \xFC\x40 |0 # +<UE13B> \xFC\x41 |0 # +<UE13C> \xFC\x42 |0 # +<UE13D> \xFC\x43 |0 # +<UE13E> \xFC\x44 |0 # +<UE13F> \xFC\x45 |0 # +<UE140> \xFC\x46 |0 # +<UE141> \xFC\x47 |0 # +<UE142> \xFC\x48 |0 # +<UE143> \xFC\x49 |0 # +<UE144> \xFC\x4A |0 # +<UE145> \xFC\x4B |0 # +<UE146> \xFC\x4C |0 # +<UE147> \xFC\x4D |0 # +<UE148> \xFC\x4E |0 # +<UE149> \xFC\x4F |0 # +<UE14A> \xFC\x50 |0 # +<UE14B> \xFC\x51 |0 # +<UE14C> \xFC\x52 |0 # +<UE14D> \xFC\x53 |0 # +<UE14E> \xFC\x54 |0 # +<UE14F> \xFC\x55 |0 # +<UE150> \xFC\x56 |0 # +<UE151> \xFC\x57 |0 # +<UE152> \xFC\x58 |0 # +<UE153> \xFC\x59 |0 # +<UE154> \xFC\x5A |0 # +<UE155> \xFC\x5B |0 # +<UE156> \xFC\x5C |0 # +<UE157> \xFC\x5D |0 # +<UE158> \xFC\x5E |0 # +<UE159> \xFC\x5F |0 # +<UE15A> \xFC\x60 |0 # +<UE15B> \xFC\x61 |0 # +<UE15C> \xFC\x62 |0 # +<UE15D> \xFC\x63 |0 # +<UE15E> \xFC\x64 |0 # +<UE15F> \xFC\x65 |0 # +<UE160> \xFC\x66 |0 # +<UE161> \xFC\x67 |0 # +<UE162> \xFC\x68 |0 # +<UE163> \xFC\x69 |0 # +<UE164> \xFC\x6A |0 # +<UE165> \xFC\x6B |0 # +<UE166> \xFC\x6C |0 # +<UE167> \xFC\x6D |0 # +<UE168> \xFC\x6E |0 # +<UE169> \xFC\x6F |0 # +<UE16A> \xFC\x70 |0 # +<UE16B> \xFC\x71 |0 # +<UE16C> \xFC\x72 |0 # +<UE16D> \xFC\x73 |0 # +<UE16E> \xFC\x74 |0 # +<UE16F> \xFC\x75 |0 # +<UE170> \xFC\x76 |0 # +<UE171> \xFC\x77 |0 # +<UE172> \xFC\x78 |0 # +<UE173> \xFC\x79 |0 # +<UE174> \xFC\x7A |0 # +<UE175> \xFC\x7B |0 # +<UE176> \xFC\x7C |0 # +<UE177> \xFC\x7D |0 # +<UE178> \xFC\x7E |0 # +<UE179> \xFC\xA1 |0 # +<UE17A> \xFC\xA2 |0 # +<UE17B> \xFC\xA3 |0 # +<UE17C> \xFC\xA4 |0 # +<UE17D> \xFC\xA5 |0 # +<UE17E> \xFC\xA6 |0 # +<UE17F> \xFC\xA7 |0 # +<UE180> \xFC\xA8 |0 # +<UE181> \xFC\xA9 |0 # +<UE182> \xFC\xAA |0 # +<UE183> \xFC\xAB |0 # +<UE184> \xFC\xAC |0 # +<UE185> \xFC\xAD |0 # +<UE186> \xFC\xAE |0 # +<UE187> \xFC\xAF |0 # +<UE188> \xFC\xB0 |0 # +<UE189> \xFC\xB1 |0 # +<UE18A> \xFC\xB2 |0 # +<UE18B> \xFC\xB3 |0 # +<UE18C> \xFC\xB4 |0 # +<UE18D> \xFC\xB5 |0 # +<UE18E> \xFC\xB6 |0 # +<UE18F> \xFC\xB7 |0 # +<UE190> \xFC\xB8 |0 # +<UE191> \xFC\xB9 |0 # +<UE192> \xFC\xBA |0 # +<UE193> \xFC\xBB |0 # +<UE194> \xFC\xBC |0 # +<UE195> \xFC\xBD |0 # +<UE196> \xFC\xBE |0 # +<UE197> \xFC\xBF |0 # +<UE198> \xFC\xC0 |0 # +<UE199> \xFC\xC1 |0 # +<UE19A> \xFC\xC2 |0 # +<UE19B> \xFC\xC3 |0 # +<UE19C> \xFC\xC4 |0 # +<UE19D> \xFC\xC5 |0 # +<UE19E> \xFC\xC6 |0 # +<UE19F> \xFC\xC7 |0 # +<UE1A0> \xFC\xC8 |0 # +<UE1A1> \xFC\xC9 |0 # +<UE1A2> \xFC\xCA |0 # +<UE1A3> \xFC\xCB |0 # +<UE1A4> \xFC\xCC |0 # +<UE1A5> \xFC\xCD |0 # +<UE1A6> \xFC\xCE |0 # +<UE1A7> \xFC\xCF |0 # +<UE1A8> \xFC\xD0 |0 # +<UE1A9> \xFC\xD1 |0 # +<UE1AA> \xFC\xD2 |0 # +<UE1AB> \xFC\xD3 |0 # +<UE1AC> \xFC\xD4 |0 # +<UE1AD> \xFC\xD5 |0 # +<UE1AE> \xFC\xD6 |0 # +<UE1AF> \xFC\xD7 |0 # +<UE1B0> \xFC\xD8 |0 # +<UE1B1> \xFC\xD9 |0 # +<UE1B2> \xFC\xDA |0 # +<UE1B3> \xFC\xDB |0 # +<UE1B4> \xFC\xDC |0 # +<UE1B5> \xFC\xDD |0 # +<UE1B6> \xFC\xDE |0 # +<UE1B7> \xFC\xDF |0 # +<UE1B8> \xFC\xE0 |0 # +<UE1B9> \xFC\xE1 |0 # +<UE1BA> \xFC\xE2 |0 # +<UE1BB> \xFC\xE3 |0 # +<UE1BC> \xFC\xE4 |0 # +<UE1BD> \xFC\xE5 |0 # +<UE1BE> \xFC\xE6 |0 # +<UE1BF> \xFC\xE7 |0 # +<UE1C0> \xFC\xE8 |0 # +<UE1C1> \xFC\xE9 |0 # +<UE1C2> \xFC\xEA |0 # +<UE1C3> \xFC\xEB |0 # +<UE1C4> \xFC\xEC |0 # +<UE1C5> \xFC\xED |0 # +<UE1C6> \xFC\xEE |0 # +<UE1C7> \xFC\xEF |0 # +<UE1C8> \xFC\xF0 |0 # +<UE1C9> \xFC\xF1 |0 # +<UE1CA> \xFC\xF2 |0 # +<UE1CB> \xFC\xF3 |0 # +<UE1CC> \xFC\xF4 |0 # +<UE1CD> \xFC\xF5 |0 # +<UE1CE> \xFC\xF6 |0 # +<UE1CF> \xFC\xF7 |0 # +<UE1D0> \xFC\xF8 |0 # +<UE1D1> \xFC\xF9 |0 # +<UE1D2> \xFC\xFA |0 # +<UE1D3> \xFC\xFB |0 # +<UE1D4> \xFC\xFC |0 # +<UE1D5> \xFC\xFD |0 # +<UE1D6> \xFC\xFE |0 # +<UE1D7> \xFD\x40 |0 # +<UE1D8> \xFD\x41 |0 # +<UE1D9> \xFD\x42 |0 # +<UE1DA> \xFD\x43 |0 # +<UE1DB> \xFD\x44 |0 # +<UE1DC> \xFD\x45 |0 # +<UE1DD> \xFD\x46 |0 # +<UE1DE> \xFD\x47 |0 # +<UE1DF> \xFD\x48 |0 # +<UE1E0> \xFD\x49 |0 # +<UE1E1> \xFD\x4A |0 # +<UE1E2> \xFD\x4B |0 # +<UE1E3> \xFD\x4C |0 # +<UE1E4> \xFD\x4D |0 # +<UE1E5> \xFD\x4E |0 # +<UE1E6> \xFD\x4F |0 # +<UE1E7> \xFD\x50 |0 # +<UE1E8> \xFD\x51 |0 # +<UE1E9> \xFD\x52 |0 # +<UE1EA> \xFD\x53 |0 # +<UE1EB> \xFD\x54 |0 # +<UE1EC> \xFD\x55 |0 # +<UE1ED> \xFD\x56 |0 # +<UE1EE> \xFD\x57 |0 # +<UE1EF> \xFD\x58 |0 # +<UE1F0> \xFD\x59 |0 # +<UE1F1> \xFD\x5A |0 # +<UE1F2> \xFD\x5B |0 # +<UE1F3> \xFD\x5C |0 # +<UE1F4> \xFD\x5D |0 # +<UE1F5> \xFD\x5E |0 # +<UE1F6> \xFD\x5F |0 # +<UE1F7> \xFD\x60 |0 # +<UE1F8> \xFD\x61 |0 # +<UE1F9> \xFD\x62 |0 # +<UE1FA> \xFD\x63 |0 # +<UE1FB> \xFD\x64 |0 # +<UE1FC> \xFD\x65 |0 # +<UE1FD> \xFD\x66 |0 # +<UE1FE> \xFD\x67 |0 # +<UE1FF> \xFD\x68 |0 # +<UE200> \xFD\x69 |0 # +<UE201> \xFD\x6A |0 # +<UE202> \xFD\x6B |0 # +<UE203> \xFD\x6C |0 # +<UE204> \xFD\x6D |0 # +<UE205> \xFD\x6E |0 # +<UE206> \xFD\x6F |0 # +<UE207> \xFD\x70 |0 # +<UE208> \xFD\x71 |0 # +<UE209> \xFD\x72 |0 # +<UE20A> \xFD\x73 |0 # +<UE20B> \xFD\x74 |0 # +<UE20C> \xFD\x75 |0 # +<UE20D> \xFD\x76 |0 # +<UE20E> \xFD\x77 |0 # +<UE20F> \xFD\x78 |0 # +<UE210> \xFD\x79 |0 # +<UE211> \xFD\x7A |0 # +<UE212> \xFD\x7B |0 # +<UE213> \xFD\x7C |0 # +<UE214> \xFD\x7D |0 # +<UE215> \xFD\x7E |0 # +<UE216> \xFD\xA1 |0 # +<UE217> \xFD\xA2 |0 # +<UE218> \xFD\xA3 |0 # +<UE219> \xFD\xA4 |0 # +<UE21A> \xFD\xA5 |0 # +<UE21B> \xFD\xA6 |0 # +<UE21C> \xFD\xA7 |0 # +<UE21D> \xFD\xA8 |0 # +<UE21E> \xFD\xA9 |0 # +<UE21F> \xFD\xAA |0 # +<UE220> \xFD\xAB |0 # +<UE221> \xFD\xAC |0 # +<UE222> \xFD\xAD |0 # +<UE223> \xFD\xAE |0 # +<UE224> \xFD\xAF |0 # +<UE225> \xFD\xB0 |0 # +<UE226> \xFD\xB1 |0 # +<UE227> \xFD\xB2 |0 # +<UE228> \xFD\xB3 |0 # +<UE229> \xFD\xB4 |0 # +<UE22A> \xFD\xB5 |0 # +<UE22B> \xFD\xB6 |0 # +<UE22C> \xFD\xB7 |0 # +<UE22D> \xFD\xB8 |0 # +<UE22E> \xFD\xB9 |0 # +<UE22F> \xFD\xBA |0 # +<UE230> \xFD\xBB |0 # +<UE231> \xFD\xBC |0 # +<UE232> \xFD\xBD |0 # +<UE233> \xFD\xBE |0 # +<UE234> \xFD\xBF |0 # +<UE235> \xFD\xC0 |0 # +<UE236> \xFD\xC1 |0 # +<UE237> \xFD\xC2 |0 # +<UE238> \xFD\xC3 |0 # +<UE239> \xFD\xC4 |0 # +<UE23A> \xFD\xC5 |0 # +<UE23B> \xFD\xC6 |0 # +<UE23C> \xFD\xC7 |0 # +<UE23D> \xFD\xC8 |0 # +<UE23E> \xFD\xC9 |0 # +<UE23F> \xFD\xCA |0 # +<UE240> \xFD\xCB |0 # +<UE241> \xFD\xCC |0 # +<UE242> \xFD\xCD |0 # +<UE243> \xFD\xCE |0 # +<UE244> \xFD\xCF |0 # +<UE245> \xFD\xD0 |0 # +<UE246> \xFD\xD1 |0 # +<UE247> \xFD\xD2 |0 # +<UE248> \xFD\xD3 |0 # +<UE249> \xFD\xD4 |0 # +<UE24A> \xFD\xD5 |0 # +<UE24B> \xFD\xD6 |0 # +<UE24C> \xFD\xD7 |0 # +<UE24D> \xFD\xD8 |0 # +<UE24E> \xFD\xD9 |0 # +<UE24F> \xFD\xDA |0 # +<UE250> \xFD\xDB |0 # +<UE251> \xFD\xDC |0 # +<UE252> \xFD\xDD |0 # +<UE253> \xFD\xDE |0 # +<UE254> \xFD\xDF |0 # +<UE255> \xFD\xE0 |0 # +<UE256> \xFD\xE1 |0 # +<UE257> \xFD\xE2 |0 # +<UE258> \xFD\xE3 |0 # +<UE259> \xFD\xE4 |0 # +<UE25A> \xFD\xE5 |0 # +<UE25B> \xFD\xE6 |0 # +<UE25C> \xFD\xE7 |0 # +<UE25D> \xFD\xE8 |0 # +<UE25E> \xFD\xE9 |0 # +<UE25F> \xFD\xEA |0 # +<UE260> \xFD\xEB |0 # +<UE261> \xFD\xEC |0 # +<UE262> \xFD\xED |0 # +<UE263> \xFD\xEE |0 # +<UE264> \xFD\xEF |0 # +<UE265> \xFD\xF0 |0 # +<UE266> \xFD\xF1 |0 # +<UE267> \xFD\xF2 |0 # +<UE268> \xFD\xF3 |0 # +<UE269> \xFD\xF4 |0 # +<UE26A> \xFD\xF5 |0 # +<UE26B> \xFD\xF6 |0 # +<UE26C> \xFD\xF7 |0 # +<UE26D> \xFD\xF8 |0 # +<UE26E> \xFD\xF9 |0 # +<UE26F> \xFD\xFA |0 # +<UE270> \xFD\xFB |0 # +<UE271> \xFD\xFC |0 # +<UE272> \xFD\xFD |0 # +<UE273> \xFD\xFE |0 # +<UE274> \xFE\x40 |0 # +<UE275> \xFE\x41 |0 # +<UE276> \xFE\x42 |0 # +<UE277> \xFE\x43 |0 # +<UE278> \xFE\x44 |0 # +<UE279> \xFE\x45 |0 # +<UE27A> \xFE\x46 |0 # +<UE27B> \xFE\x47 |0 # +<UE27C> \xFE\x48 |0 # +<UE27D> \xFE\x49 |0 # +<UE27E> \xFE\x4A |0 # +<UE27F> \xFE\x4B |0 # +<UE280> \xFE\x4C |0 # +<UE281> \xFE\x4D |0 # +<UE282> \xFE\x4E |0 # +<UE283> \xFE\x4F |0 # +<UE284> \xFE\x50 |0 # +<UE285> \xFE\x51 |0 # +<UE286> \xFE\x52 |0 # +<UE287> \xFE\x53 |0 # +<UE288> \xFE\x54 |0 # +<UE289> \xFE\x55 |0 # +<UE28A> \xFE\x56 |0 # +<UE28B> \xFE\x57 |0 # +<UE28C> \xFE\x58 |0 # +<UE28D> \xFE\x59 |0 # +<UE28E> \xFE\x5A |0 # +<UE28F> \xFE\x5B |0 # +<UE290> \xFE\x5C |0 # +<UE291> \xFE\x5D |0 # +<UE292> \xFE\x5E |0 # +<UE293> \xFE\x5F |0 # +<UE294> \xFE\x60 |0 # +<UE295> \xFE\x61 |0 # +<UE296> \xFE\x62 |0 # +<UE297> \xFE\x63 |0 # +<UE298> \xFE\x64 |0 # +<UE299> \xFE\x65 |0 # +<UE29A> \xFE\x66 |0 # +<UE29B> \xFE\x67 |0 # +<UE29C> \xFE\x68 |0 # +<UE29D> \xFE\x69 |0 # +<UE29E> \xFE\x6A |0 # +<UE29F> \xFE\x6B |0 # +<UE2A0> \xFE\x6C |0 # +<UE2A1> \xFE\x6D |0 # +<UE2A2> \xFE\x6E |0 # +<UE2A3> \xFE\x6F |0 # +<UE2A4> \xFE\x70 |0 # +<UE2A5> \xFE\x71 |0 # +<UE2A6> \xFE\x72 |0 # +<UE2A7> \xFE\x73 |0 # +<UE2A8> \xFE\x74 |0 # +<UE2A9> \xFE\x75 |0 # +<UE2AA> \xFE\x76 |0 # +<UE2AB> \xFE\x77 |0 # +<UE2AC> \xFE\x78 |0 # +<UE2AD> \xFE\x79 |0 # +<UE2AE> \xFE\x7A |0 # +<UE2AF> \xFE\x7B |0 # +<UE2B0> \xFE\x7C |0 # +<UE2B1> \xFE\x7D |0 # +<UE2B2> \xFE\x7E |0 # +<UE2B3> \xFE\xA1 |0 # +<UE2B4> \xFE\xA2 |0 # +<UE2B5> \xFE\xA3 |0 # +<UE2B6> \xFE\xA4 |0 # +<UE2B7> \xFE\xA5 |0 # +<UE2B8> \xFE\xA6 |0 # +<UE2B9> \xFE\xA7 |0 # +<UE2BA> \xFE\xA8 |0 # +<UE2BB> \xFE\xA9 |0 # +<UE2BC> \xFE\xAA |0 # +<UE2BD> \xFE\xAB |0 # +<UE2BE> \xFE\xAC |0 # +<UE2BF> \xFE\xAD |0 # +<UE2C0> \xFE\xAE |0 # +<UE2C1> \xFE\xAF |0 # +<UE2C2> \xFE\xB0 |0 # +<UE2C3> \xFE\xB1 |0 # +<UE2C4> \xFE\xB2 |0 # +<UE2C5> \xFE\xB3 |0 # +<UE2C6> \xFE\xB4 |0 # +<UE2C7> \xFE\xB5 |0 # +<UE2C8> \xFE\xB6 |0 # +<UE2C9> \xFE\xB7 |0 # +<UE2CA> \xFE\xB8 |0 # +<UE2CB> \xFE\xB9 |0 # +<UE2CC> \xFE\xBA |0 # +<UE2CD> \xFE\xBB |0 # +<UE2CE> \xFE\xBC |0 # +<UE2CF> \xFE\xBD |0 # +<UE2D0> \xFE\xBE |0 # +<UE2D1> \xFE\xBF |0 # +<UE2D2> \xFE\xC0 |0 # +<UE2D3> \xFE\xC1 |0 # +<UE2D4> \xFE\xC2 |0 # +<UE2D5> \xFE\xC3 |0 # +<UE2D6> \xFE\xC4 |0 # +<UE2D7> \xFE\xC5 |0 # +<UE2D8> \xFE\xC6 |0 # +<UE2D9> \xFE\xC7 |0 # +<UE2DA> \xFE\xC8 |0 # +<UE2DB> \xFE\xC9 |0 # +<UE2DC> \xFE\xCA |0 # +<UE2DD> \xFE\xCB |0 # +<UE2DE> \xFE\xCC |0 # +<UE2DF> \xFE\xCD |0 # +<UE2E0> \xFE\xCE |0 # +<UE2E1> \xFE\xCF |0 # +<UE2E2> \xFE\xD0 |0 # +<UE2E3> \xFE\xD1 |0 # +<UE2E4> \xFE\xD2 |0 # +<UE2E5> \xFE\xD3 |0 # +<UE2E6> \xFE\xD4 |0 # +<UE2E7> \xFE\xD5 |0 # +<UE2E8> \xFE\xD6 |0 # +<UE2E9> \xFE\xD7 |0 # +<UE2EA> \xFE\xD8 |0 # +<UE2EB> \xFE\xD9 |0 # +<UE2EC> \xFE\xDA |0 # +<UE2ED> \xFE\xDB |0 # +<UE2EE> \xFE\xDC |0 # +<UE2EF> \xFE\xDD |0 # +<UE2F0> \xFE\xDE |0 # +<UE2F1> \xFE\xDF |0 # +<UE2F2> \xFE\xE0 |0 # +<UE2F3> \xFE\xE1 |0 # +<UE2F4> \xFE\xE2 |0 # +<UE2F5> \xFE\xE3 |0 # +<UE2F6> \xFE\xE4 |0 # +<UE2F7> \xFE\xE5 |0 # +<UE2F8> \xFE\xE6 |0 # +<UE2F9> \xFE\xE7 |0 # +<UE2FA> \xFE\xE8 |0 # +<UE2FB> \xFE\xE9 |0 # +<UE2FC> \xFE\xEA |0 # +<UE2FD> \xFE\xEB |0 # +<UE2FE> \xFE\xEC |0 # +<UE2FF> \xFE\xED |0 # +<UE300> \xFE\xEE |0 # +<UE301> \xFE\xEF |0 # +<UE302> \xFE\xF0 |0 # +<UE303> \xFE\xF1 |0 # +<UE304> \xFE\xF2 |0 # +<UE305> \xFE\xF3 |0 # +<UE306> \xFE\xF4 |0 # +<UE307> \xFE\xF5 |0 # +<UE308> \xFE\xF6 |0 # +<UE309> \xFE\xF7 |0 # +<UE30A> \xFE\xF8 |0 # +<UE30B> \xFE\xF9 |0 # +<UE30C> \xFE\xFA |0 # +<UE30D> \xFE\xFB |0 # +<UE30E> \xFE\xFC |0 # +<UE30F> \xFE\xFD |0 # +<UE310> \xFE\xFE |0 # +<UE311> \x8E\x40 |0 # +<UE312> \x8E\x41 |0 # +<UE313> \x8E\x42 |0 # +<UE314> \x8E\x43 |0 # +<UE315> \x8E\x44 |0 # +<UE316> \x8E\x45 |0 # +<UE317> \x8E\x46 |0 # +<UE318> \x8E\x47 |0 # +<UE319> \x8E\x48 |0 # +<UE31A> \x8E\x49 |0 # +<UE31B> \x8E\x4A |0 # +<UE31C> \x8E\x4B |0 # +<UE31D> \x8E\x4C |0 # +<UE31E> \x8E\x4D |0 # +<UE31F> \x8E\x4E |0 # +<UE320> \x8E\x4F |0 # +<UE321> \x8E\x50 |0 # +<UE322> \x8E\x51 |0 # +<UE323> \x8E\x52 |0 # +<UE324> \x8E\x53 |0 # +<UE325> \x8E\x54 |0 # +<UE326> \x8E\x55 |0 # +<UE327> \x8E\x56 |0 # +<UE328> \x8E\x57 |0 # +<UE329> \x8E\x58 |0 # +<UE32A> \x8E\x59 |0 # +<UE32B> \x8E\x5A |0 # +<UE32C> \x8E\x5B |0 # +<UE32D> \x8E\x5C |0 # +<UE32E> \x8E\x5D |0 # +<UE32F> \x8E\x5E |0 # +<UE330> \x8E\x5F |0 # +<UE331> \x8E\x60 |0 # +<UE332> \x8E\x61 |0 # +<UE333> \x8E\x62 |0 # +<UE334> \x8E\x63 |0 # +<UE335> \x8E\x64 |0 # +<UE336> \x8E\x65 |0 # +<UE337> \x8E\x66 |0 # +<UE338> \x8E\x67 |0 # +<UE339> \x8E\x68 |0 # +<UE33A> \x8E\x69 |0 # +<UE33B> \x8E\x6A |0 # +<UE33C> \x8E\x6B |0 # +<UE33D> \x8E\x6C |0 # +<UE33E> \x8E\x6D |0 # +<UE33F> \x8E\x6E |0 # +<UE340> \x8E\x6F |0 # +<UE341> \x8E\x70 |0 # +<UE342> \x8E\x71 |0 # +<UE343> \x8E\x72 |0 # +<UE344> \x8E\x73 |0 # +<UE345> \x8E\x74 |0 # +<UE346> \x8E\x75 |0 # +<UE347> \x8E\x76 |0 # +<UE348> \x8E\x77 |0 # +<UE349> \x8E\x78 |0 # +<UE34A> \x8E\x79 |0 # +<UE34B> \x8E\x7A |0 # +<UE34C> \x8E\x7B |0 # +<UE34D> \x8E\x7C |0 # +<UE34E> \x8E\x7D |0 # +<UE34F> \x8E\x7E |0 # +<UE350> \x8E\xA1 |0 # +<UE351> \x8E\xA2 |0 # +<UE352> \x8E\xA3 |0 # +<UE353> \x8E\xA4 |0 # +<UE354> \x8E\xA5 |0 # +<UE355> \x8E\xA6 |0 # +<UE356> \x8E\xA7 |0 # +<UE357> \x8E\xA8 |0 # +<UE358> \x8E\xA9 |0 # +<UE359> \x8E\xAA |0 # +<UE35A> \x8E\xAB |0 # +<UE35B> \x8E\xAC |0 # +<UE35C> \x8E\xAD |0 # +<UE35D> \x8E\xAE |0 # +<UE35E> \x8E\xAF |0 # +<UE35F> \x8E\xB0 |0 # +<UE360> \x8E\xB1 |0 # +<UE361> \x8E\xB2 |0 # +<UE362> \x8E\xB3 |0 # +<UE363> \x8E\xB4 |0 # +<UE364> \x8E\xB5 |0 # +<UE365> \x8E\xB6 |0 # +<UE366> \x8E\xB7 |0 # +<UE367> \x8E\xB8 |0 # +<UE368> \x8E\xB9 |0 # +<UE369> \x8E\xBA |0 # +<UE36A> \x8E\xBB |0 # +<UE36B> \x8E\xBC |0 # +<UE36C> \x8E\xBD |0 # +<UE36D> \x8E\xBE |0 # +<UE36E> \x8E\xBF |0 # +<UE36F> \x8E\xC0 |0 # +<UE370> \x8E\xC1 |0 # +<UE371> \x8E\xC2 |0 # +<UE372> \x8E\xC3 |0 # +<UE373> \x8E\xC4 |0 # +<UE374> \x8E\xC5 |0 # +<UE375> \x8E\xC6 |0 # +<UE376> \x8E\xC7 |0 # +<UE377> \x8E\xC8 |0 # +<UE378> \x8E\xC9 |0 # +<UE379> \x8E\xCA |0 # +<UE37A> \x8E\xCB |0 # +<UE37B> \x8E\xCC |0 # +<UE37C> \x8E\xCD |0 # +<UE37D> \x8E\xCE |0 # +<UE37E> \x8E\xCF |0 # +<UE37F> \x8E\xD0 |0 # +<UE380> \x8E\xD1 |0 # +<UE381> \x8E\xD2 |0 # +<UE382> \x8E\xD3 |0 # +<UE383> \x8E\xD4 |0 # +<UE384> \x8E\xD5 |0 # +<UE385> \x8E\xD6 |0 # +<UE386> \x8E\xD7 |0 # +<UE387> \x8E\xD8 |0 # +<UE388> \x8E\xD9 |0 # +<UE389> \x8E\xDA |0 # +<UE38A> \x8E\xDB |0 # +<UE38B> \x8E\xDC |0 # +<UE38C> \x8E\xDD |0 # +<UE38D> \x8E\xDE |0 # +<UE38E> \x8E\xDF |0 # +<UE38F> \x8E\xE0 |0 # +<UE390> \x8E\xE1 |0 # +<UE391> \x8E\xE2 |0 # +<UE392> \x8E\xE3 |0 # +<UE393> \x8E\xE4 |0 # +<UE394> \x8E\xE5 |0 # +<UE395> \x8E\xE6 |0 # +<UE396> \x8E\xE7 |0 # +<UE397> \x8E\xE8 |0 # +<UE398> \x8E\xE9 |0 # +<UE399> \x8E\xEA |0 # +<UE39A> \x8E\xEB |0 # +<UE39B> \x8E\xEC |0 # +<UE39C> \x8E\xED |0 # +<UE39D> \x8E\xEE |0 # +<UE39E> \x8E\xEF |0 # +<UE39F> \x8E\xF0 |0 # +<UE3A0> \x8E\xF1 |0 # +<UE3A1> \x8E\xF2 |0 # +<UE3A2> \x8E\xF3 |0 # +<UE3A3> \x8E\xF4 |0 # +<UE3A4> \x8E\xF5 |0 # +<UE3A5> \x8E\xF6 |0 # +<UE3A6> \x8E\xF7 |0 # +<UE3A7> \x8E\xF8 |0 # +<UE3A8> \x8E\xF9 |0 # +<UE3A9> \x8E\xFA |0 # +<UE3AA> \x8E\xFB |0 # +<UE3AB> \x8E\xFC |0 # +<UE3AC> \x8E\xFD |0 # +<UE3AD> \x8E\xFE |0 # +<UE3AE> \x8F\x40 |0 # +<UE3AF> \x8F\x41 |0 # +<UE3B0> \x8F\x42 |0 # +<UE3B1> \x8F\x43 |0 # +<UE3B2> \x8F\x44 |0 # +<UE3B3> \x8F\x45 |0 # +<UE3B4> \x8F\x46 |0 # +<UE3B5> \x8F\x47 |0 # +<UE3B6> \x8F\x48 |0 # +<UE3B7> \x8F\x49 |0 # +<UE3B8> \x8F\x4A |0 # +<UE3B9> \x8F\x4B |0 # +<UE3BA> \x8F\x4C |0 # +<UE3BB> \x8F\x4D |0 # +<UE3BC> \x8F\x4E |0 # +<UE3BD> \x8F\x4F |0 # +<UE3BE> \x8F\x50 |0 # +<UE3BF> \x8F\x51 |0 # +<UE3C0> \x8F\x52 |0 # +<UE3C1> \x8F\x53 |0 # +<UE3C2> \x8F\x54 |0 # +<UE3C3> \x8F\x55 |0 # +<UE3C4> \x8F\x56 |0 # +<UE3C5> \x8F\x57 |0 # +<UE3C6> \x8F\x58 |0 # +<UE3C7> \x8F\x59 |0 # +<UE3C8> \x8F\x5A |0 # +<UE3C9> \x8F\x5B |0 # +<UE3CA> \x8F\x5C |0 # +<UE3CB> \x8F\x5D |0 # +<UE3CC> \x8F\x5E |0 # +<UE3CD> \x8F\x5F |0 # +<UE3CE> \x8F\x60 |0 # +<UE3CF> \x8F\x61 |0 # +<UE3D0> \x8F\x62 |0 # +<UE3D1> \x8F\x63 |0 # +<UE3D2> \x8F\x64 |0 # +<UE3D3> \x8F\x65 |0 # +<UE3D4> \x8F\x66 |0 # +<UE3D5> \x8F\x67 |0 # +<UE3D6> \x8F\x68 |0 # +<UE3D7> \x8F\x69 |0 # +<UE3D8> \x8F\x6A |0 # +<UE3D9> \x8F\x6B |0 # +<UE3DA> \x8F\x6C |0 # +<UE3DB> \x8F\x6D |0 # +<UE3DC> \x8F\x6E |0 # +<UE3DD> \x8F\x6F |0 # +<UE3DE> \x8F\x70 |0 # +<UE3DF> \x8F\x71 |0 # +<UE3E0> \x8F\x72 |0 # +<UE3E1> \x8F\x73 |0 # +<UE3E2> \x8F\x74 |0 # +<UE3E3> \x8F\x75 |0 # +<UE3E4> \x8F\x76 |0 # +<UE3E5> \x8F\x77 |0 # +<UE3E6> \x8F\x78 |0 # +<UE3E7> \x8F\x79 |0 # +<UE3E8> \x8F\x7A |0 # +<UE3E9> \x8F\x7B |0 # +<UE3EA> \x8F\x7C |0 # +<UE3EB> \x8F\x7D |0 # +<UE3EC> \x8F\x7E |0 # +<UE3ED> \x8F\xA1 |0 # +<UE3EE> \x8F\xA2 |0 # +<UE3EF> \x8F\xA3 |0 # +<UE3F0> \x8F\xA4 |0 # +<UE3F1> \x8F\xA5 |0 # +<UE3F2> \x8F\xA6 |0 # +<UE3F3> \x8F\xA7 |0 # +<UE3F4> \x8F\xA8 |0 # +<UE3F5> \x8F\xA9 |0 # +<UE3F6> \x8F\xAA |0 # +<UE3F7> \x8F\xAB |0 # +<UE3F8> \x8F\xAC |0 # +<UE3F9> \x8F\xAD |0 # +<UE3FA> \x8F\xAE |0 # +<UE3FB> \x8F\xAF |0 # +<UE3FC> \x8F\xB0 |0 # +<UE3FD> \x8F\xB1 |0 # +<UE3FE> \x8F\xB2 |0 # +<UE3FF> \x8F\xB3 |0 # +<UE400> \x8F\xB4 |0 # +<UE401> \x8F\xB5 |0 # +<UE402> \x8F\xB6 |0 # +<UE403> \x8F\xB7 |0 # +<UE404> \x8F\xB8 |0 # +<UE405> \x8F\xB9 |0 # +<UE406> \x8F\xBA |0 # +<UE407> \x8F\xBB |0 # +<UE408> \x8F\xBC |0 # +<UE409> \x8F\xBD |0 # +<UE40A> \x8F\xBE |0 # +<UE40B> \x8F\xBF |0 # +<UE40C> \x8F\xC0 |0 # +<UE40D> \x8F\xC1 |0 # +<UE40E> \x8F\xC2 |0 # +<UE40F> \x8F\xC3 |0 # +<UE410> \x8F\xC4 |0 # +<UE411> \x8F\xC5 |0 # +<UE412> \x8F\xC6 |0 # +<UE413> \x8F\xC7 |0 # +<UE414> \x8F\xC8 |0 # +<UE415> \x8F\xC9 |0 # +<UE416> \x8F\xCA |0 # +<UE417> \x8F\xCB |0 # +<UE418> \x8F\xCC |0 # +<UE419> \x8F\xCD |0 # +<UE41A> \x8F\xCE |0 # +<UE41B> \x8F\xCF |0 # +<UE41C> \x8F\xD0 |0 # +<UE41D> \x8F\xD1 |0 # +<UE41E> \x8F\xD2 |0 # +<UE41F> \x8F\xD3 |0 # +<UE420> \x8F\xD4 |0 # +<UE421> \x8F\xD5 |0 # +<UE422> \x8F\xD6 |0 # +<UE423> \x8F\xD7 |0 # +<UE424> \x8F\xD8 |0 # +<UE425> \x8F\xD9 |0 # +<UE426> \x8F\xDA |0 # +<UE427> \x8F\xDB |0 # +<UE428> \x8F\xDC |0 # +<UE429> \x8F\xDD |0 # +<UE42A> \x8F\xDE |0 # +<UE42B> \x8F\xDF |0 # +<UE42C> \x8F\xE0 |0 # +<UE42D> \x8F\xE1 |0 # +<UE42E> \x8F\xE2 |0 # +<UE42F> \x8F\xE3 |0 # +<UE430> \x8F\xE4 |0 # +<UE431> \x8F\xE5 |0 # +<UE432> \x8F\xE6 |0 # +<UE433> \x8F\xE7 |0 # +<UE434> \x8F\xE8 |0 # +<UE435> \x8F\xE9 |0 # +<UE436> \x8F\xEA |0 # +<UE437> \x8F\xEB |0 # +<UE438> \x8F\xEC |0 # +<UE439> \x8F\xED |0 # +<UE43A> \x8F\xEE |0 # +<UE43B> \x8F\xEF |0 # +<UE43C> \x8F\xF0 |0 # +<UE43D> \x8F\xF1 |0 # +<UE43E> \x8F\xF2 |0 # +<UE43F> \x8F\xF3 |0 # +<UE440> \x8F\xF4 |0 # +<UE441> \x8F\xF5 |0 # +<UE442> \x8F\xF6 |0 # +<UE443> \x8F\xF7 |0 # +<UE444> \x8F\xF8 |0 # +<UE445> \x8F\xF9 |0 # +<UE446> \x8F\xFA |0 # +<UE447> \x8F\xFB |0 # +<UE448> \x8F\xFC |0 # +<UE449> \x8F\xFD |0 # +<UE44A> \x8F\xFE |0 # +<UE44B> \x90\x40 |0 # +<UE44C> \x90\x41 |0 # +<UE44D> \x90\x42 |0 # +<UE44E> \x90\x43 |0 # +<UE44F> \x90\x44 |0 # +<UE450> \x90\x45 |0 # +<UE451> \x90\x46 |0 # +<UE452> \x90\x47 |0 # +<UE453> \x90\x48 |0 # +<UE454> \x90\x49 |0 # +<UE455> \x90\x4A |0 # +<UE456> \x90\x4B |0 # +<UE457> \x90\x4C |0 # +<UE458> \x90\x4D |0 # +<UE459> \x90\x4E |0 # +<UE45A> \x90\x4F |0 # +<UE45B> \x90\x50 |0 # +<UE45C> \x90\x51 |0 # +<UE45D> \x90\x52 |0 # +<UE45E> \x90\x53 |0 # +<UE45F> \x90\x54 |0 # +<UE460> \x90\x55 |0 # +<UE461> \x90\x56 |0 # +<UE462> \x90\x57 |0 # +<UE463> \x90\x58 |0 # +<UE464> \x90\x59 |0 # +<UE465> \x90\x5A |0 # +<UE466> \x90\x5B |0 # +<UE467> \x90\x5C |0 # +<UE468> \x90\x5D |0 # +<UE469> \x90\x5E |0 # +<UE46A> \x90\x5F |0 # +<UE46B> \x90\x60 |0 # +<UE46C> \x90\x61 |0 # +<UE46D> \x90\x62 |0 # +<UE46E> \x90\x63 |0 # +<UE46F> \x90\x64 |0 # +<UE470> \x90\x65 |0 # +<UE471> \x90\x66 |0 # +<UE472> \x90\x67 |0 # +<UE473> \x90\x68 |0 # +<UE474> \x90\x69 |0 # +<UE475> \x90\x6A |0 # +<UE476> \x90\x6B |0 # +<UE477> \x90\x6C |0 # +<UE478> \x90\x6D |0 # +<UE479> \x90\x6E |0 # +<UE47A> \x90\x6F |0 # +<UE47B> \x90\x70 |0 # +<UE47C> \x90\x71 |0 # +<UE47D> \x90\x72 |0 # +<UE47E> \x90\x73 |0 # +<UE47F> \x90\x74 |0 # +<UE480> \x90\x75 |0 # +<UE481> \x90\x76 |0 # +<UE482> \x90\x77 |0 # +<UE483> \x90\x78 |0 # +<UE484> \x90\x79 |0 # +<UE485> \x90\x7A |0 # +<UE486> \x90\x7B |0 # +<UE487> \x90\x7C |0 # +<UE488> \x90\x7D |0 # +<UE489> \x90\x7E |0 # +<UE48A> \x90\xA1 |0 # +<UE48B> \x90\xA2 |0 # +<UE48C> \x90\xA3 |0 # +<UE48D> \x90\xA4 |0 # +<UE48E> \x90\xA5 |0 # +<UE48F> \x90\xA6 |0 # +<UE490> \x90\xA7 |0 # +<UE491> \x90\xA8 |0 # +<UE492> \x90\xA9 |0 # +<UE493> \x90\xAA |0 # +<UE494> \x90\xAB |0 # +<UE495> \x90\xAC |0 # +<UE496> \x90\xAD |0 # +<UE497> \x90\xAE |0 # +<UE498> \x90\xAF |0 # +<UE499> \x90\xB0 |0 # +<UE49A> \x90\xB1 |0 # +<UE49B> \x90\xB2 |0 # +<UE49C> \x90\xB3 |0 # +<UE49D> \x90\xB4 |0 # +<UE49E> \x90\xB5 |0 # +<UE49F> \x90\xB6 |0 # +<UE4A0> \x90\xB7 |0 # +<UE4A1> \x90\xB8 |0 # +<UE4A2> \x90\xB9 |0 # +<UE4A3> \x90\xBA |0 # +<UE4A4> \x90\xBB |0 # +<UE4A5> \x90\xBC |0 # +<UE4A6> \x90\xBD |0 # +<UE4A7> \x90\xBE |0 # +<UE4A8> \x90\xBF |0 # +<UE4A9> \x90\xC0 |0 # +<UE4AA> \x90\xC1 |0 # +<UE4AB> \x90\xC2 |0 # +<UE4AC> \x90\xC3 |0 # +<UE4AD> \x90\xC4 |0 # +<UE4AE> \x90\xC5 |0 # +<UE4AF> \x90\xC6 |0 # +<UE4B0> \x90\xC7 |0 # +<UE4B1> \x90\xC8 |0 # +<UE4B2> \x90\xC9 |0 # +<UE4B3> \x90\xCA |0 # +<UE4B4> \x90\xCB |0 # +<UE4B5> \x90\xCC |0 # +<UE4B6> \x90\xCD |0 # +<UE4B7> \x90\xCE |0 # +<UE4B8> \x90\xCF |0 # +<UE4B9> \x90\xD0 |0 # +<UE4BA> \x90\xD1 |0 # +<UE4BB> \x90\xD2 |0 # +<UE4BC> \x90\xD3 |0 # +<UE4BD> \x90\xD4 |0 # +<UE4BE> \x90\xD5 |0 # +<UE4BF> \x90\xD6 |0 # +<UE4C0> \x90\xD7 |0 # +<UE4C1> \x90\xD8 |0 # +<UE4C2> \x90\xD9 |0 # +<UE4C3> \x90\xDA |0 # +<UE4C4> \x90\xDB |0 # +<UE4C5> \x90\xDC |0 # +<UE4C6> \x90\xDD |0 # +<UE4C7> \x90\xDE |0 # +<UE4C8> \x90\xDF |0 # +<UE4C9> \x90\xE0 |0 # +<UE4CA> \x90\xE1 |0 # +<UE4CB> \x90\xE2 |0 # +<UE4CC> \x90\xE3 |0 # +<UE4CD> \x90\xE4 |0 # +<UE4CE> \x90\xE5 |0 # +<UE4CF> \x90\xE6 |0 # +<UE4D0> \x90\xE7 |0 # +<UE4D1> \x90\xE8 |0 # +<UE4D2> \x90\xE9 |0 # +<UE4D3> \x90\xEA |0 # +<UE4D4> \x90\xEB |0 # +<UE4D5> \x90\xEC |0 # +<UE4D6> \x90\xED |0 # +<UE4D7> \x90\xEE |0 # +<UE4D8> \x90\xEF |0 # +<UE4D9> \x90\xF0 |0 # +<UE4DA> \x90\xF1 |0 # +<UE4DB> \x90\xF2 |0 # +<UE4DC> \x90\xF3 |0 # +<UE4DD> \x90\xF4 |0 # +<UE4DE> \x90\xF5 |0 # +<UE4DF> \x90\xF6 |0 # +<UE4E0> \x90\xF7 |0 # +<UE4E1> \x90\xF8 |0 # +<UE4E2> \x90\xF9 |0 # +<UE4E3> \x90\xFA |0 # +<UE4E4> \x90\xFB |0 # +<UE4E5> \x90\xFC |0 # +<UE4E6> \x90\xFD |0 # +<UE4E7> \x90\xFE |0 # +<UE4E8> \x91\x40 |0 # +<UE4E9> \x91\x41 |0 # +<UE4EA> \x91\x42 |0 # +<UE4EB> \x91\x43 |0 # +<UE4EC> \x91\x44 |0 # +<UE4ED> \x91\x45 |0 # +<UE4EE> \x91\x46 |0 # +<UE4EF> \x91\x47 |0 # +<UE4F0> \x91\x48 |0 # +<UE4F1> \x91\x49 |0 # +<UE4F2> \x91\x4A |0 # +<UE4F3> \x91\x4B |0 # +<UE4F4> \x91\x4C |0 # +<UE4F5> \x91\x4D |0 # +<UE4F6> \x91\x4E |0 # +<UE4F7> \x91\x4F |0 # +<UE4F8> \x91\x50 |0 # +<UE4F9> \x91\x51 |0 # +<UE4FA> \x91\x52 |0 # +<UE4FB> \x91\x53 |0 # +<UE4FC> \x91\x54 |0 # +<UE4FD> \x91\x55 |0 # +<UE4FE> \x91\x56 |0 # +<UE4FF> \x91\x57 |0 # +<UE500> \x91\x58 |0 # +<UE501> \x91\x59 |0 # +<UE502> \x91\x5A |0 # +<UE503> \x91\x5B |0 # +<UE504> \x91\x5C |0 # +<UE505> \x91\x5D |0 # +<UE506> \x91\x5E |0 # +<UE507> \x91\x5F |0 # +<UE508> \x91\x60 |0 # +<UE509> \x91\x61 |0 # +<UE50A> \x91\x62 |0 # +<UE50B> \x91\x63 |0 # +<UE50C> \x91\x64 |0 # +<UE50D> \x91\x65 |0 # +<UE50E> \x91\x66 |0 # +<UE50F> \x91\x67 |0 # +<UE510> \x91\x68 |0 # +<UE511> \x91\x69 |0 # +<UE512> \x91\x6A |0 # +<UE513> \x91\x6B |0 # +<UE514> \x91\x6C |0 # +<UE515> \x91\x6D |0 # +<UE516> \x91\x6E |0 # +<UE517> \x91\x6F |0 # +<UE518> \x91\x70 |0 # +<UE519> \x91\x71 |0 # +<UE51A> \x91\x72 |0 # +<UE51B> \x91\x73 |0 # +<UE51C> \x91\x74 |0 # +<UE51D> \x91\x75 |0 # +<UE51E> \x91\x76 |0 # +<UE51F> \x91\x77 |0 # +<UE520> \x91\x78 |0 # +<UE521> \x91\x79 |0 # +<UE522> \x91\x7A |0 # +<UE523> \x91\x7B |0 # +<UE524> \x91\x7C |0 # +<UE525> \x91\x7D |0 # +<UE526> \x91\x7E |0 # +<UE527> \x91\xA1 |0 # +<UE528> \x91\xA2 |0 # +<UE529> \x91\xA3 |0 # +<UE52A> \x91\xA4 |0 # +<UE52B> \x91\xA5 |0 # +<UE52C> \x91\xA6 |0 # +<UE52D> \x91\xA7 |0 # +<UE52E> \x91\xA8 |0 # +<UE52F> \x91\xA9 |0 # +<UE530> \x91\xAA |0 # +<UE531> \x91\xAB |0 # +<UE532> \x91\xAC |0 # +<UE533> \x91\xAD |0 # +<UE534> \x91\xAE |0 # +<UE535> \x91\xAF |0 # +<UE536> \x91\xB0 |0 # +<UE537> \x91\xB1 |0 # +<UE538> \x91\xB2 |0 # +<UE539> \x91\xB3 |0 # +<UE53A> \x91\xB4 |0 # +<UE53B> \x91\xB5 |0 # +<UE53C> \x91\xB6 |0 # +<UE53D> \x91\xB7 |0 # +<UE53E> \x91\xB8 |0 # +<UE53F> \x91\xB9 |0 # +<UE540> \x91\xBA |0 # +<UE541> \x91\xBB |0 # +<UE542> \x91\xBC |0 # +<UE543> \x91\xBD |0 # +<UE544> \x91\xBE |0 # +<UE545> \x91\xBF |0 # +<UE546> \x91\xC0 |0 # +<UE547> \x91\xC1 |0 # +<UE548> \x91\xC2 |0 # +<UE549> \x91\xC3 |0 # +<UE54A> \x91\xC4 |0 # +<UE54B> \x91\xC5 |0 # +<UE54C> \x91\xC6 |0 # +<UE54D> \x91\xC7 |0 # +<UE54E> \x91\xC8 |0 # +<UE54F> \x91\xC9 |0 # +<UE550> \x91\xCA |0 # +<UE551> \x91\xCB |0 # +<UE552> \x91\xCC |0 # +<UE553> \x91\xCD |0 # +<UE554> \x91\xCE |0 # +<UE555> \x91\xCF |0 # +<UE556> \x91\xD0 |0 # +<UE557> \x91\xD1 |0 # +<UE558> \x91\xD2 |0 # +<UE559> \x91\xD3 |0 # +<UE55A> \x91\xD4 |0 # +<UE55B> \x91\xD5 |0 # +<UE55C> \x91\xD6 |0 # +<UE55D> \x91\xD7 |0 # +<UE55E> \x91\xD8 |0 # +<UE55F> \x91\xD9 |0 # +<UE560> \x91\xDA |0 # +<UE561> \x91\xDB |0 # +<UE562> \x91\xDC |0 # +<UE563> \x91\xDD |0 # +<UE564> \x91\xDE |0 # +<UE565> \x91\xDF |0 # +<UE566> \x91\xE0 |0 # +<UE567> \x91\xE1 |0 # +<UE568> \x91\xE2 |0 # +<UE569> \x91\xE3 |0 # +<UE56A> \x91\xE4 |0 # +<UE56B> \x91\xE5 |0 # +<UE56C> \x91\xE6 |0 # +<UE56D> \x91\xE7 |0 # +<UE56E> \x91\xE8 |0 # +<UE56F> \x91\xE9 |0 # +<UE570> \x91\xEA |0 # +<UE571> \x91\xEB |0 # +<UE572> \x91\xEC |0 # +<UE573> \x91\xED |0 # +<UE574> \x91\xEE |0 # +<UE575> \x91\xEF |0 # +<UE576> \x91\xF0 |0 # +<UE577> \x91\xF1 |0 # +<UE578> \x91\xF2 |0 # +<UE579> \x91\xF3 |0 # +<UE57A> \x91\xF4 |0 # +<UE57B> \x91\xF5 |0 # +<UE57C> \x91\xF6 |0 # +<UE57D> \x91\xF7 |0 # +<UE57E> \x91\xF8 |0 # +<UE57F> \x91\xF9 |0 # +<UE580> \x91\xFA |0 # +<UE581> \x91\xFB |0 # +<UE582> \x91\xFC |0 # +<UE583> \x91\xFD |0 # +<UE584> \x91\xFE |0 # +<UE585> \x92\x40 |0 # +<UE586> \x92\x41 |0 # +<UE587> \x92\x42 |0 # +<UE588> \x92\x43 |0 # +<UE589> \x92\x44 |0 # +<UE58A> \x92\x45 |0 # +<UE58B> \x92\x46 |0 # +<UE58C> \x92\x47 |0 # +<UE58D> \x92\x48 |0 # +<UE58E> \x92\x49 |0 # +<UE58F> \x92\x4A |0 # +<UE590> \x92\x4B |0 # +<UE591> \x92\x4C |0 # +<UE592> \x92\x4D |0 # +<UE593> \x92\x4E |0 # +<UE594> \x92\x4F |0 # +<UE595> \x92\x50 |0 # +<UE596> \x92\x51 |0 # +<UE597> \x92\x52 |0 # +<UE598> \x92\x53 |0 # +<UE599> \x92\x54 |0 # +<UE59A> \x92\x55 |0 # +<UE59B> \x92\x56 |0 # +<UE59C> \x92\x57 |0 # +<UE59D> \x92\x58 |0 # +<UE59E> \x92\x59 |0 # +<UE59F> \x92\x5A |0 # +<UE5A0> \x92\x5B |0 # +<UE5A1> \x92\x5C |0 # +<UE5A2> \x92\x5D |0 # +<UE5A3> \x92\x5E |0 # +<UE5A4> \x92\x5F |0 # +<UE5A5> \x92\x60 |0 # +<UE5A6> \x92\x61 |0 # +<UE5A7> \x92\x62 |0 # +<UE5A8> \x92\x63 |0 # +<UE5A9> \x92\x64 |0 # +<UE5AA> \x92\x65 |0 # +<UE5AB> \x92\x66 |0 # +<UE5AC> \x92\x67 |0 # +<UE5AD> \x92\x68 |0 # +<UE5AE> \x92\x69 |0 # +<UE5AF> \x92\x6A |0 # +<UE5B0> \x92\x6B |0 # +<UE5B1> \x92\x6C |0 # +<UE5B2> \x92\x6D |0 # +<UE5B3> \x92\x6E |0 # +<UE5B4> \x92\x6F |0 # +<UE5B5> \x92\x70 |0 # +<UE5B6> \x92\x71 |0 # +<UE5B7> \x92\x72 |0 # +<UE5B8> \x92\x73 |0 # +<UE5B9> \x92\x74 |0 # +<UE5BA> \x92\x75 |0 # +<UE5BB> \x92\x76 |0 # +<UE5BC> \x92\x77 |0 # +<UE5BD> \x92\x78 |0 # +<UE5BE> \x92\x79 |0 # +<UE5BF> \x92\x7A |0 # +<UE5C0> \x92\x7B |0 # +<UE5C1> \x92\x7C |0 # +<UE5C2> \x92\x7D |0 # +<UE5C3> \x92\x7E |0 # +<UE5C4> \x92\xA1 |0 # +<UE5C5> \x92\xA2 |0 # +<UE5C6> \x92\xA3 |0 # +<UE5C7> \x92\xA4 |0 # +<UE5C8> \x92\xA5 |0 # +<UE5C9> \x92\xA6 |0 # +<UE5CA> \x92\xA7 |0 # +<UE5CB> \x92\xA8 |0 # +<UE5CC> \x92\xA9 |0 # +<UE5CD> \x92\xAA |0 # +<UE5CE> \x92\xAB |0 # +<UE5CF> \x92\xAC |0 # +<UE5D0> \x92\xAD |0 # +<UE5D1> \x92\xAE |0 # +<UE5D2> \x92\xAF |0 # +<UE5D3> \x92\xB0 |0 # +<UE5D4> \x92\xB1 |0 # +<UE5D5> \x92\xB2 |0 # +<UE5D6> \x92\xB3 |0 # +<UE5D7> \x92\xB4 |0 # +<UE5D8> \x92\xB5 |0 # +<UE5D9> \x92\xB6 |0 # +<UE5DA> \x92\xB7 |0 # +<UE5DB> \x92\xB8 |0 # +<UE5DC> \x92\xB9 |0 # +<UE5DD> \x92\xBA |0 # +<UE5DE> \x92\xBB |0 # +<UE5DF> \x92\xBC |0 # +<UE5E0> \x92\xBD |0 # +<UE5E1> \x92\xBE |0 # +<UE5E2> \x92\xBF |0 # +<UE5E3> \x92\xC0 |0 # +<UE5E4> \x92\xC1 |0 # +<UE5E5> \x92\xC2 |0 # +<UE5E6> \x92\xC3 |0 # +<UE5E7> \x92\xC4 |0 # +<UE5E8> \x92\xC5 |0 # +<UE5E9> \x92\xC6 |0 # +<UE5EA> \x92\xC7 |0 # +<UE5EB> \x92\xC8 |0 # +<UE5EC> \x92\xC9 |0 # +<UE5ED> \x92\xCA |0 # +<UE5EE> \x92\xCB |0 # +<UE5EF> \x92\xCC |0 # +<UE5F0> \x92\xCD |0 # +<UE5F1> \x92\xCE |0 # +<UE5F2> \x92\xCF |0 # +<UE5F3> \x92\xD0 |0 # +<UE5F4> \x92\xD1 |0 # +<UE5F5> \x92\xD2 |0 # +<UE5F6> \x92\xD3 |0 # +<UE5F7> \x92\xD4 |0 # +<UE5F8> \x92\xD5 |0 # +<UE5F9> \x92\xD6 |0 # +<UE5FA> \x92\xD7 |0 # +<UE5FB> \x92\xD8 |0 # +<UE5FC> \x92\xD9 |0 # +<UE5FD> \x92\xDA |0 # +<UE5FE> \x92\xDB |0 # +<UE5FF> \x92\xDC |0 # +<UE600> \x92\xDD |0 # +<UE601> \x92\xDE |0 # +<UE602> \x92\xDF |0 # +<UE603> \x92\xE0 |0 # +<UE604> \x92\xE1 |0 # +<UE605> \x92\xE2 |0 # +<UE606> \x92\xE3 |0 # +<UE607> \x92\xE4 |0 # +<UE608> \x92\xE5 |0 # +<UE609> \x92\xE6 |0 # +<UE60A> \x92\xE7 |0 # +<UE60B> \x92\xE8 |0 # +<UE60C> \x92\xE9 |0 # +<UE60D> \x92\xEA |0 # +<UE60E> \x92\xEB |0 # +<UE60F> \x92\xEC |0 # +<UE610> \x92\xED |0 # +<UE611> \x92\xEE |0 # +<UE612> \x92\xEF |0 # +<UE613> \x92\xF0 |0 # +<UE614> \x92\xF1 |0 # +<UE615> \x92\xF2 |0 # +<UE616> \x92\xF3 |0 # +<UE617> \x92\xF4 |0 # +<UE618> \x92\xF5 |0 # +<UE619> \x92\xF6 |0 # +<UE61A> \x92\xF7 |0 # +<UE61B> \x92\xF8 |0 # +<UE61C> \x92\xF9 |0 # +<UE61D> \x92\xFA |0 # +<UE61E> \x92\xFB |0 # +<UE61F> \x92\xFC |0 # +<UE620> \x92\xFD |0 # +<UE621> \x92\xFE |0 # +<UE622> \x93\x40 |0 # +<UE623> \x93\x41 |0 # +<UE624> \x93\x42 |0 # +<UE625> \x93\x43 |0 # +<UE626> \x93\x44 |0 # +<UE627> \x93\x45 |0 # +<UE628> \x93\x46 |0 # +<UE629> \x93\x47 |0 # +<UE62A> \x93\x48 |0 # +<UE62B> \x93\x49 |0 # +<UE62C> \x93\x4A |0 # +<UE62D> \x93\x4B |0 # +<UE62E> \x93\x4C |0 # +<UE62F> \x93\x4D |0 # +<UE630> \x93\x4E |0 # +<UE631> \x93\x4F |0 # +<UE632> \x93\x50 |0 # +<UE633> \x93\x51 |0 # +<UE634> \x93\x52 |0 # +<UE635> \x93\x53 |0 # +<UE636> \x93\x54 |0 # +<UE637> \x93\x55 |0 # +<UE638> \x93\x56 |0 # +<UE639> \x93\x57 |0 # +<UE63A> \x93\x58 |0 # +<UE63B> \x93\x59 |0 # +<UE63C> \x93\x5A |0 # +<UE63D> \x93\x5B |0 # +<UE63E> \x93\x5C |0 # +<UE63F> \x93\x5D |0 # +<UE640> \x93\x5E |0 # +<UE641> \x93\x5F |0 # +<UE642> \x93\x60 |0 # +<UE643> \x93\x61 |0 # +<UE644> \x93\x62 |0 # +<UE645> \x93\x63 |0 # +<UE646> \x93\x64 |0 # +<UE647> \x93\x65 |0 # +<UE648> \x93\x66 |0 # +<UE649> \x93\x67 |0 # +<UE64A> \x93\x68 |0 # +<UE64B> \x93\x69 |0 # +<UE64C> \x93\x6A |0 # +<UE64D> \x93\x6B |0 # +<UE64E> \x93\x6C |0 # +<UE64F> \x93\x6D |0 # +<UE650> \x93\x6E |0 # +<UE651> \x93\x6F |0 # +<UE652> \x93\x70 |0 # +<UE653> \x93\x71 |0 # +<UE654> \x93\x72 |0 # +<UE655> \x93\x73 |0 # +<UE656> \x93\x74 |0 # +<UE657> \x93\x75 |0 # +<UE658> \x93\x76 |0 # +<UE659> \x93\x77 |0 # +<UE65A> \x93\x78 |0 # +<UE65B> \x93\x79 |0 # +<UE65C> \x93\x7A |0 # +<UE65D> \x93\x7B |0 # +<UE65E> \x93\x7C |0 # +<UE65F> \x93\x7D |0 # +<UE660> \x93\x7E |0 # +<UE661> \x93\xA1 |0 # +<UE662> \x93\xA2 |0 # +<UE663> \x93\xA3 |0 # +<UE664> \x93\xA4 |0 # +<UE665> \x93\xA5 |0 # +<UE666> \x93\xA6 |0 # +<UE667> \x93\xA7 |0 # +<UE668> \x93\xA8 |0 # +<UE669> \x93\xA9 |0 # +<UE66A> \x93\xAA |0 # +<UE66B> \x93\xAB |0 # +<UE66C> \x93\xAC |0 # +<UE66D> \x93\xAD |0 # +<UE66E> \x93\xAE |0 # +<UE66F> \x93\xAF |0 # +<UE670> \x93\xB0 |0 # +<UE671> \x93\xB1 |0 # +<UE672> \x93\xB2 |0 # +<UE673> \x93\xB3 |0 # +<UE674> \x93\xB4 |0 # +<UE675> \x93\xB5 |0 # +<UE676> \x93\xB6 |0 # +<UE677> \x93\xB7 |0 # +<UE678> \x93\xB8 |0 # +<UE679> \x93\xB9 |0 # +<UE67A> \x93\xBA |0 # +<UE67B> \x93\xBB |0 # +<UE67C> \x93\xBC |0 # +<UE67D> \x93\xBD |0 # +<UE67E> \x93\xBE |0 # +<UE67F> \x93\xBF |0 # +<UE680> \x93\xC0 |0 # +<UE681> \x93\xC1 |0 # +<UE682> \x93\xC2 |0 # +<UE683> \x93\xC3 |0 # +<UE684> \x93\xC4 |0 # +<UE685> \x93\xC5 |0 # +<UE686> \x93\xC6 |0 # +<UE687> \x93\xC7 |0 # +<UE688> \x93\xC8 |0 # +<UE689> \x93\xC9 |0 # +<UE68A> \x93\xCA |0 # +<UE68B> \x93\xCB |0 # +<UE68C> \x93\xCC |0 # +<UE68D> \x93\xCD |0 # +<UE68E> \x93\xCE |0 # +<UE68F> \x93\xCF |0 # +<UE690> \x93\xD0 |0 # +<UE691> \x93\xD1 |0 # +<UE692> \x93\xD2 |0 # +<UE693> \x93\xD3 |0 # +<UE694> \x93\xD4 |0 # +<UE695> \x93\xD5 |0 # +<UE696> \x93\xD6 |0 # +<UE697> \x93\xD7 |0 # +<UE698> \x93\xD8 |0 # +<UE699> \x93\xD9 |0 # +<UE69A> \x93\xDA |0 # +<UE69B> \x93\xDB |0 # +<UE69C> \x93\xDC |0 # +<UE69D> \x93\xDD |0 # +<UE69E> \x93\xDE |0 # +<UE69F> \x93\xDF |0 # +<UE6A0> \x93\xE0 |0 # +<UE6A1> \x93\xE1 |0 # +<UE6A2> \x93\xE2 |0 # +<UE6A3> \x93\xE3 |0 # +<UE6A4> \x93\xE4 |0 # +<UE6A5> \x93\xE5 |0 # +<UE6A6> \x93\xE6 |0 # +<UE6A7> \x93\xE7 |0 # +<UE6A8> \x93\xE8 |0 # +<UE6A9> \x93\xE9 |0 # +<UE6AA> \x93\xEA |0 # +<UE6AB> \x93\xEB |0 # +<UE6AC> \x93\xEC |0 # +<UE6AD> \x93\xED |0 # +<UE6AE> \x93\xEE |0 # +<UE6AF> \x93\xEF |0 # +<UE6B0> \x93\xF0 |0 # +<UE6B1> \x93\xF1 |0 # +<UE6B2> \x93\xF2 |0 # +<UE6B3> \x93\xF3 |0 # +<UE6B4> \x93\xF4 |0 # +<UE6B5> \x93\xF5 |0 # +<UE6B6> \x93\xF6 |0 # +<UE6B7> \x93\xF7 |0 # +<UE6B8> \x93\xF8 |0 # +<UE6B9> \x93\xF9 |0 # +<UE6BA> \x93\xFA |0 # +<UE6BB> \x93\xFB |0 # +<UE6BC> \x93\xFC |0 # +<UE6BD> \x93\xFD |0 # +<UE6BE> \x93\xFE |0 # +<UE6BF> \x94\x40 |0 # +<UE6C0> \x94\x41 |0 # +<UE6C1> \x94\x42 |0 # +<UE6C2> \x94\x43 |0 # +<UE6C3> \x94\x44 |0 # +<UE6C4> \x94\x45 |0 # +<UE6C5> \x94\x46 |0 # +<UE6C6> \x94\x47 |0 # +<UE6C7> \x94\x48 |0 # +<UE6C8> \x94\x49 |0 # +<UE6C9> \x94\x4A |0 # +<UE6CA> \x94\x4B |0 # +<UE6CB> \x94\x4C |0 # +<UE6CC> \x94\x4D |0 # +<UE6CD> \x94\x4E |0 # +<UE6CE> \x94\x4F |0 # +<UE6CF> \x94\x50 |0 # +<UE6D0> \x94\x51 |0 # +<UE6D1> \x94\x52 |0 # +<UE6D2> \x94\x53 |0 # +<UE6D3> \x94\x54 |0 # +<UE6D4> \x94\x55 |0 # +<UE6D5> \x94\x56 |0 # +<UE6D6> \x94\x57 |0 # +<UE6D7> \x94\x58 |0 # +<UE6D8> \x94\x59 |0 # +<UE6D9> \x94\x5A |0 # +<UE6DA> \x94\x5B |0 # +<UE6DB> \x94\x5C |0 # +<UE6DC> \x94\x5D |0 # +<UE6DD> \x94\x5E |0 # +<UE6DE> \x94\x5F |0 # +<UE6DF> \x94\x60 |0 # +<UE6E0> \x94\x61 |0 # +<UE6E1> \x94\x62 |0 # +<UE6E2> \x94\x63 |0 # +<UE6E3> \x94\x64 |0 # +<UE6E4> \x94\x65 |0 # +<UE6E5> \x94\x66 |0 # +<UE6E6> \x94\x67 |0 # +<UE6E7> \x94\x68 |0 # +<UE6E8> \x94\x69 |0 # +<UE6E9> \x94\x6A |0 # +<UE6EA> \x94\x6B |0 # +<UE6EB> \x94\x6C |0 # +<UE6EC> \x94\x6D |0 # +<UE6ED> \x94\x6E |0 # +<UE6EE> \x94\x6F |0 # +<UE6EF> \x94\x70 |0 # +<UE6F0> \x94\x71 |0 # +<UE6F1> \x94\x72 |0 # +<UE6F2> \x94\x73 |0 # +<UE6F3> \x94\x74 |0 # +<UE6F4> \x94\x75 |0 # +<UE6F5> \x94\x76 |0 # +<UE6F6> \x94\x77 |0 # +<UE6F7> \x94\x78 |0 # +<UE6F8> \x94\x79 |0 # +<UE6F9> \x94\x7A |0 # +<UE6FA> \x94\x7B |0 # +<UE6FB> \x94\x7C |0 # +<UE6FC> \x94\x7D |0 # +<UE6FD> \x94\x7E |0 # +<UE6FE> \x94\xA1 |0 # +<UE6FF> \x94\xA2 |0 # +<UE700> \x94\xA3 |0 # +<UE701> \x94\xA4 |0 # +<UE702> \x94\xA5 |0 # +<UE703> \x94\xA6 |0 # +<UE704> \x94\xA7 |0 # +<UE705> \x94\xA8 |0 # +<UE706> \x94\xA9 |0 # +<UE707> \x94\xAA |0 # +<UE708> \x94\xAB |0 # +<UE709> \x94\xAC |0 # +<UE70A> \x94\xAD |0 # +<UE70B> \x94\xAE |0 # +<UE70C> \x94\xAF |0 # +<UE70D> \x94\xB0 |0 # +<UE70E> \x94\xB1 |0 # +<UE70F> \x94\xB2 |0 # +<UE710> \x94\xB3 |0 # +<UE711> \x94\xB4 |0 # +<UE712> \x94\xB5 |0 # +<UE713> \x94\xB6 |0 # +<UE714> \x94\xB7 |0 # +<UE715> \x94\xB8 |0 # +<UE716> \x94\xB9 |0 # +<UE717> \x94\xBA |0 # +<UE718> \x94\xBB |0 # +<UE719> \x94\xBC |0 # +<UE71A> \x94\xBD |0 # +<UE71B> \x94\xBE |0 # +<UE71C> \x94\xBF |0 # +<UE71D> \x94\xC0 |0 # +<UE71E> \x94\xC1 |0 # +<UE71F> \x94\xC2 |0 # +<UE720> \x94\xC3 |0 # +<UE721> \x94\xC4 |0 # +<UE722> \x94\xC5 |0 # +<UE723> \x94\xC6 |0 # +<UE724> \x94\xC7 |0 # +<UE725> \x94\xC8 |0 # +<UE726> \x94\xC9 |0 # +<UE727> \x94\xCA |0 # +<UE728> \x94\xCB |0 # +<UE729> \x94\xCC |0 # +<UE72A> \x94\xCD |0 # +<UE72B> \x94\xCE |0 # +<UE72C> \x94\xCF |0 # +<UE72D> \x94\xD0 |0 # +<UE72E> \x94\xD1 |0 # +<UE72F> \x94\xD2 |0 # +<UE730> \x94\xD3 |0 # +<UE731> \x94\xD4 |0 # +<UE732> \x94\xD5 |0 # +<UE733> \x94\xD6 |0 # +<UE734> \x94\xD7 |0 # +<UE735> \x94\xD8 |0 # +<UE736> \x94\xD9 |0 # +<UE737> \x94\xDA |0 # +<UE738> \x94\xDB |0 # +<UE739> \x94\xDC |0 # +<UE73A> \x94\xDD |0 # +<UE73B> \x94\xDE |0 # +<UE73C> \x94\xDF |0 # +<UE73D> \x94\xE0 |0 # +<UE73E> \x94\xE1 |0 # +<UE73F> \x94\xE2 |0 # +<UE740> \x94\xE3 |0 # +<UE741> \x94\xE4 |0 # +<UE742> \x94\xE5 |0 # +<UE743> \x94\xE6 |0 # +<UE744> \x94\xE7 |0 # +<UE745> \x94\xE8 |0 # +<UE746> \x94\xE9 |0 # +<UE747> \x94\xEA |0 # +<UE748> \x94\xEB |0 # +<UE749> \x94\xEC |0 # +<UE74A> \x94\xED |0 # +<UE74B> \x94\xEE |0 # +<UE74C> \x94\xEF |0 # +<UE74D> \x94\xF0 |0 # +<UE74E> \x94\xF1 |0 # +<UE74F> \x94\xF2 |0 # +<UE750> \x94\xF3 |0 # +<UE751> \x94\xF4 |0 # +<UE752> \x94\xF5 |0 # +<UE753> \x94\xF6 |0 # +<UE754> \x94\xF7 |0 # +<UE755> \x94\xF8 |0 # +<UE756> \x94\xF9 |0 # +<UE757> \x94\xFA |0 # +<UE758> \x94\xFB |0 # +<UE759> \x94\xFC |0 # +<UE75A> \x94\xFD |0 # +<UE75B> \x94\xFE |0 # +<UE75C> \x95\x40 |0 # +<UE75D> \x95\x41 |0 # +<UE75E> \x95\x42 |0 # +<UE75F> \x95\x43 |0 # +<UE760> \x95\x44 |0 # +<UE761> \x95\x45 |0 # +<UE762> \x95\x46 |0 # +<UE763> \x95\x47 |0 # +<UE764> \x95\x48 |0 # +<UE765> \x95\x49 |0 # +<UE766> \x95\x4A |0 # +<UE767> \x95\x4B |0 # +<UE768> \x95\x4C |0 # +<UE769> \x95\x4D |0 # +<UE76A> \x95\x4E |0 # +<UE76B> \x95\x4F |0 # +<UE76C> \x95\x50 |0 # +<UE76D> \x95\x51 |0 # +<UE76E> \x95\x52 |0 # +<UE76F> \x95\x53 |0 # +<UE770> \x95\x54 |0 # +<UE771> \x95\x55 |0 # +<UE772> \x95\x56 |0 # +<UE773> \x95\x57 |0 # +<UE774> \x95\x58 |0 # +<UE775> \x95\x59 |0 # +<UE776> \x95\x5A |0 # +<UE777> \x95\x5B |0 # +<UE778> \x95\x5C |0 # +<UE779> \x95\x5D |0 # +<UE77A> \x95\x5E |0 # +<UE77B> \x95\x5F |0 # +<UE77C> \x95\x60 |0 # +<UE77D> \x95\x61 |0 # +<UE77E> \x95\x62 |0 # +<UE77F> \x95\x63 |0 # +<UE780> \x95\x64 |0 # +<UE781> \x95\x65 |0 # +<UE782> \x95\x66 |0 # +<UE783> \x95\x67 |0 # +<UE784> \x95\x68 |0 # +<UE785> \x95\x69 |0 # +<UE786> \x95\x6A |0 # +<UE787> \x95\x6B |0 # +<UE788> \x95\x6C |0 # +<UE789> \x95\x6D |0 # +<UE78A> \x95\x6E |0 # +<UE78B> \x95\x6F |0 # +<UE78C> \x95\x70 |0 # +<UE78D> \x95\x71 |0 # +<UE78E> \x95\x72 |0 # +<UE78F> \x95\x73 |0 # +<UE790> \x95\x74 |0 # +<UE791> \x95\x75 |0 # +<UE792> \x95\x76 |0 # +<UE793> \x95\x77 |0 # +<UE794> \x95\x78 |0 # +<UE795> \x95\x79 |0 # +<UE796> \x95\x7A |0 # +<UE797> \x95\x7B |0 # +<UE798> \x95\x7C |0 # +<UE799> \x95\x7D |0 # +<UE79A> \x95\x7E |0 # +<UE79B> \x95\xA1 |0 # +<UE79C> \x95\xA2 |0 # +<UE79D> \x95\xA3 |0 # +<UE79E> \x95\xA4 |0 # +<UE79F> \x95\xA5 |0 # +<UE7A0> \x95\xA6 |0 # +<UE7A1> \x95\xA7 |0 # +<UE7A2> \x95\xA8 |0 # +<UE7A3> \x95\xA9 |0 # +<UE7A4> \x95\xAA |0 # +<UE7A5> \x95\xAB |0 # +<UE7A6> \x95\xAC |0 # +<UE7A7> \x95\xAD |0 # +<UE7A8> \x95\xAE |0 # +<UE7A9> \x95\xAF |0 # +<UE7AA> \x95\xB0 |0 # +<UE7AB> \x95\xB1 |0 # +<UE7AC> \x95\xB2 |0 # +<UE7AD> \x95\xB3 |0 # +<UE7AE> \x95\xB4 |0 # +<UE7AF> \x95\xB5 |0 # +<UE7B0> \x95\xB6 |0 # +<UE7B1> \x95\xB7 |0 # +<UE7B2> \x95\xB8 |0 # +<UE7B3> \x95\xB9 |0 # +<UE7B4> \x95\xBA |0 # +<UE7B5> \x95\xBB |0 # +<UE7B6> \x95\xBC |0 # +<UE7B7> \x95\xBD |0 # +<UE7B8> \x95\xBE |0 # +<UE7B9> \x95\xBF |0 # +<UE7BA> \x95\xC0 |0 # +<UE7BB> \x95\xC1 |0 # +<UE7BC> \x95\xC2 |0 # +<UE7BD> \x95\xC3 |0 # +<UE7BE> \x95\xC4 |0 # +<UE7BF> \x95\xC5 |0 # +<UE7C0> \x95\xC6 |0 # +<UE7C1> \x95\xC7 |0 # +<UE7C2> \x95\xC8 |0 # +<UE7C3> \x95\xC9 |0 # +<UE7C4> \x95\xCA |0 # +<UE7C5> \x95\xCB |0 # +<UE7C6> \x95\xCC |0 # +<UE7C7> \x95\xCD |0 # +<UE7C8> \x95\xCE |0 # +<UE7C9> \x95\xCF |0 # +<UE7CA> \x95\xD0 |0 # +<UE7CB> \x95\xD1 |0 # +<UE7CC> \x95\xD2 |0 # +<UE7CD> \x95\xD3 |0 # +<UE7CE> \x95\xD4 |0 # +<UE7CF> \x95\xD5 |0 # +<UE7D0> \x95\xD6 |0 # +<UE7D1> \x95\xD7 |0 # +<UE7D2> \x95\xD8 |0 # +<UE7D3> \x95\xD9 |0 # +<UE7D4> \x95\xDA |0 # +<UE7D5> \x95\xDB |0 # +<UE7D6> \x95\xDC |0 # +<UE7D7> \x95\xDD |0 # +<UE7D8> \x95\xDE |0 # +<UE7D9> \x95\xDF |0 # +<UE7DA> \x95\xE0 |0 # +<UE7DB> \x95\xE1 |0 # +<UE7DC> \x95\xE2 |0 # +<UE7DD> \x95\xE3 |0 # +<UE7DE> \x95\xE4 |0 # +<UE7DF> \x95\xE5 |0 # +<UE7E0> \x95\xE6 |0 # +<UE7E1> \x95\xE7 |0 # +<UE7E2> \x95\xE8 |0 # +<UE7E3> \x95\xE9 |0 # +<UE7E4> \x95\xEA |0 # +<UE7E5> \x95\xEB |0 # +<UE7E6> \x95\xEC |0 # +<UE7E7> \x95\xED |0 # +<UE7E8> \x95\xEE |0 # +<UE7E9> \x95\xEF |0 # +<UE7EA> \x95\xF0 |0 # +<UE7EB> \x95\xF1 |0 # +<UE7EC> \x95\xF2 |0 # +<UE7ED> \x95\xF3 |0 # +<UE7EE> \x95\xF4 |0 # +<UE7EF> \x95\xF5 |0 # +<UE7F0> \x95\xF6 |0 # +<UE7F1> \x95\xF7 |0 # +<UE7F2> \x95\xF8 |0 # +<UE7F3> \x95\xF9 |0 # +<UE7F4> \x95\xFA |0 # +<UE7F5> \x95\xFB |0 # +<UE7F6> \x95\xFC |0 # +<UE7F7> \x95\xFD |0 # +<UE7F8> \x95\xFE |0 # +<UE7F9> \x96\x40 |0 # +<UE7FA> \x96\x41 |0 # +<UE7FB> \x96\x42 |0 # +<UE7FC> \x96\x43 |0 # +<UE7FD> \x96\x44 |0 # +<UE7FE> \x96\x45 |0 # +<UE7FF> \x96\x46 |0 # +<UE800> \x96\x47 |0 # +<UE801> \x96\x48 |0 # +<UE802> \x96\x49 |0 # +<UE803> \x96\x4A |0 # +<UE804> \x96\x4B |0 # +<UE805> \x96\x4C |0 # +<UE806> \x96\x4D |0 # +<UE807> \x96\x4E |0 # +<UE808> \x96\x4F |0 # +<UE809> \x96\x50 |0 # +<UE80A> \x96\x51 |0 # +<UE80B> \x96\x52 |0 # +<UE80C> \x96\x53 |0 # +<UE80D> \x96\x54 |0 # +<UE80E> \x96\x55 |0 # +<UE80F> \x96\x56 |0 # +<UE810> \x96\x57 |0 # +<UE811> \x96\x58 |0 # +<UE812> \x96\x59 |0 # +<UE813> \x96\x5A |0 # +<UE814> \x96\x5B |0 # +<UE815> \x96\x5C |0 # +<UE816> \x96\x5D |0 # +<UE817> \x96\x5E |0 # +<UE818> \x96\x5F |0 # +<UE819> \x96\x60 |0 # +<UE81A> \x96\x61 |0 # +<UE81B> \x96\x62 |0 # +<UE81C> \x96\x63 |0 # +<UE81D> \x96\x64 |0 # +<UE81E> \x96\x65 |0 # +<UE81F> \x96\x66 |0 # +<UE820> \x96\x67 |0 # +<UE821> \x96\x68 |0 # +<UE822> \x96\x69 |0 # +<UE823> \x96\x6A |0 # +<UE824> \x96\x6B |0 # +<UE825> \x96\x6C |0 # +<UE826> \x96\x6D |0 # +<UE827> \x96\x6E |0 # +<UE828> \x96\x6F |0 # +<UE829> \x96\x70 |0 # +<UE82A> \x96\x71 |0 # +<UE82B> \x96\x72 |0 # +<UE82C> \x96\x73 |0 # +<UE82D> \x96\x74 |0 # +<UE82E> \x96\x75 |0 # +<UE82F> \x96\x76 |0 # +<UE830> \x96\x77 |0 # +<UE831> \x96\x78 |0 # +<UE832> \x96\x79 |0 # +<UE833> \x96\x7A |0 # +<UE834> \x96\x7B |0 # +<UE835> \x96\x7C |0 # +<UE836> \x96\x7D |0 # +<UE837> \x96\x7E |0 # +<UE838> \x96\xA1 |0 # +<UE839> \x96\xA2 |0 # +<UE83A> \x96\xA3 |0 # +<UE83B> \x96\xA4 |0 # +<UE83C> \x96\xA5 |0 # +<UE83D> \x96\xA6 |0 # +<UE83E> \x96\xA7 |0 # +<UE83F> \x96\xA8 |0 # +<UE840> \x96\xA9 |0 # +<UE841> \x96\xAA |0 # +<UE842> \x96\xAB |0 # +<UE843> \x96\xAC |0 # +<UE844> \x96\xAD |0 # +<UE845> \x96\xAE |0 # +<UE846> \x96\xAF |0 # +<UE847> \x96\xB0 |0 # +<UE848> \x96\xB1 |0 # +<UE849> \x96\xB2 |0 # +<UE84A> \x96\xB3 |0 # +<UE84B> \x96\xB4 |0 # +<UE84C> \x96\xB5 |0 # +<UE84D> \x96\xB6 |0 # +<UE84E> \x96\xB7 |0 # +<UE84F> \x96\xB8 |0 # +<UE850> \x96\xB9 |0 # +<UE851> \x96\xBA |0 # +<UE852> \x96\xBB |0 # +<UE853> \x96\xBC |0 # +<UE854> \x96\xBD |0 # +<UE855> \x96\xBE |0 # +<UE856> \x96\xBF |0 # +<UE857> \x96\xC0 |0 # +<UE858> \x96\xC1 |0 # +<UE859> \x96\xC2 |0 # +<UE85A> \x96\xC3 |0 # +<UE85B> \x96\xC4 |0 # +<UE85C> \x96\xC5 |0 # +<UE85D> \x96\xC6 |0 # +<UE85E> \x96\xC7 |0 # +<UE85F> \x96\xC8 |0 # +<UE860> \x96\xC9 |0 # +<UE861> \x96\xCA |0 # +<UE862> \x96\xCB |0 # +<UE863> \x96\xCC |0 # +<UE864> \x96\xCD |0 # +<UE865> \x96\xCE |0 # +<UE866> \x96\xCF |0 # +<UE867> \x96\xD0 |0 # +<UE868> \x96\xD1 |0 # +<UE869> \x96\xD2 |0 # +<UE86A> \x96\xD3 |0 # +<UE86B> \x96\xD4 |0 # +<UE86C> \x96\xD5 |0 # +<UE86D> \x96\xD6 |0 # +<UE86E> \x96\xD7 |0 # +<UE86F> \x96\xD8 |0 # +<UE870> \x96\xD9 |0 # +<UE871> \x96\xDA |0 # +<UE872> \x96\xDB |0 # +<UE873> \x96\xDC |0 # +<UE874> \x96\xDD |0 # +<UE875> \x96\xDE |0 # +<UE876> \x96\xDF |0 # +<UE877> \x96\xE0 |0 # +<UE878> \x96\xE1 |0 # +<UE879> \x96\xE2 |0 # +<UE87A> \x96\xE3 |0 # +<UE87B> \x96\xE4 |0 # +<UE87C> \x96\xE5 |0 # +<UE87D> \x96\xE6 |0 # +<UE87E> \x96\xE7 |0 # +<UE87F> \x96\xE8 |0 # +<UE880> \x96\xE9 |0 # +<UE881> \x96\xEA |0 # +<UE882> \x96\xEB |0 # +<UE883> \x96\xEC |0 # +<UE884> \x96\xED |0 # +<UE885> \x96\xEE |0 # +<UE886> \x96\xEF |0 # +<UE887> \x96\xF0 |0 # +<UE888> \x96\xF1 |0 # +<UE889> \x96\xF2 |0 # +<UE88A> \x96\xF3 |0 # +<UE88B> \x96\xF4 |0 # +<UE88C> \x96\xF5 |0 # +<UE88D> \x96\xF6 |0 # +<UE88E> \x96\xF7 |0 # +<UE88F> \x96\xF8 |0 # +<UE890> \x96\xF9 |0 # +<UE891> \x96\xFA |0 # +<UE892> \x96\xFB |0 # +<UE893> \x96\xFC |0 # +<UE894> \x96\xFD |0 # +<UE895> \x96\xFE |0 # +<UE896> \x97\x40 |0 # +<UE897> \x97\x41 |0 # +<UE898> \x97\x42 |0 # +<UE899> \x97\x43 |0 # +<UE89A> \x97\x44 |0 # +<UE89B> \x97\x45 |0 # +<UE89C> \x97\x46 |0 # +<UE89D> \x97\x47 |0 # +<UE89E> \x97\x48 |0 # +<UE89F> \x97\x49 |0 # +<UE8A0> \x97\x4A |0 # +<UE8A1> \x97\x4B |0 # +<UE8A2> \x97\x4C |0 # +<UE8A3> \x97\x4D |0 # +<UE8A4> \x97\x4E |0 # +<UE8A5> \x97\x4F |0 # +<UE8A6> \x97\x50 |0 # +<UE8A7> \x97\x51 |0 # +<UE8A8> \x97\x52 |0 # +<UE8A9> \x97\x53 |0 # +<UE8AA> \x97\x54 |0 # +<UE8AB> \x97\x55 |0 # +<UE8AC> \x97\x56 |0 # +<UE8AD> \x97\x57 |0 # +<UE8AE> \x97\x58 |0 # +<UE8AF> \x97\x59 |0 # +<UE8B0> \x97\x5A |0 # +<UE8B1> \x97\x5B |0 # +<UE8B2> \x97\x5C |0 # +<UE8B3> \x97\x5D |0 # +<UE8B4> \x97\x5E |0 # +<UE8B5> \x97\x5F |0 # +<UE8B6> \x97\x60 |0 # +<UE8B7> \x97\x61 |0 # +<UE8B8> \x97\x62 |0 # +<UE8B9> \x97\x63 |0 # +<UE8BA> \x97\x64 |0 # +<UE8BB> \x97\x65 |0 # +<UE8BC> \x97\x66 |0 # +<UE8BD> \x97\x67 |0 # +<UE8BE> \x97\x68 |0 # +<UE8BF> \x97\x69 |0 # +<UE8C0> \x97\x6A |0 # +<UE8C1> \x97\x6B |0 # +<UE8C2> \x97\x6C |0 # +<UE8C3> \x97\x6D |0 # +<UE8C4> \x97\x6E |0 # +<UE8C5> \x97\x6F |0 # +<UE8C6> \x97\x70 |0 # +<UE8C7> \x97\x71 |0 # +<UE8C8> \x97\x72 |0 # +<UE8C9> \x97\x73 |0 # +<UE8CA> \x97\x74 |0 # +<UE8CB> \x97\x75 |0 # +<UE8CC> \x97\x76 |0 # +<UE8CD> \x97\x77 |0 # +<UE8CE> \x97\x78 |0 # +<UE8CF> \x97\x79 |0 # +<UE8D0> \x97\x7A |0 # +<UE8D1> \x97\x7B |0 # +<UE8D2> \x97\x7C |0 # +<UE8D3> \x97\x7D |0 # +<UE8D4> \x97\x7E |0 # +<UE8D5> \x97\xA1 |0 # +<UE8D6> \x97\xA2 |0 # +<UE8D7> \x97\xA3 |0 # +<UE8D8> \x97\xA4 |0 # +<UE8D9> \x97\xA5 |0 # +<UE8DA> \x97\xA6 |0 # +<UE8DB> \x97\xA7 |0 # +<UE8DC> \x97\xA8 |0 # +<UE8DD> \x97\xA9 |0 # +<UE8DE> \x97\xAA |0 # +<UE8DF> \x97\xAB |0 # +<UE8E0> \x97\xAC |0 # +<UE8E1> \x97\xAD |0 # +<UE8E2> \x97\xAE |0 # +<UE8E3> \x97\xAF |0 # +<UE8E4> \x97\xB0 |0 # +<UE8E5> \x97\xB1 |0 # +<UE8E6> \x97\xB2 |0 # +<UE8E7> \x97\xB3 |0 # +<UE8E8> \x97\xB4 |0 # +<UE8E9> \x97\xB5 |0 # +<UE8EA> \x97\xB6 |0 # +<UE8EB> \x97\xB7 |0 # +<UE8EC> \x97\xB8 |0 # +<UE8ED> \x97\xB9 |0 # +<UE8EE> \x97\xBA |0 # +<UE8EF> \x97\xBB |0 # +<UE8F0> \x97\xBC |0 # +<UE8F1> \x97\xBD |0 # +<UE8F2> \x97\xBE |0 # +<UE8F3> \x97\xBF |0 # +<UE8F4> \x97\xC0 |0 # +<UE8F5> \x97\xC1 |0 # +<UE8F6> \x97\xC2 |0 # +<UE8F7> \x97\xC3 |0 # +<UE8F8> \x97\xC4 |0 # +<UE8F9> \x97\xC5 |0 # +<UE8FA> \x97\xC6 |0 # +<UE8FB> \x97\xC7 |0 # +<UE8FC> \x97\xC8 |0 # +<UE8FD> \x97\xC9 |0 # +<UE8FE> \x97\xCA |0 # +<UE8FF> \x97\xCB |0 # +<UE900> \x97\xCC |0 # +<UE901> \x97\xCD |0 # +<UE902> \x97\xCE |0 # +<UE903> \x97\xCF |0 # +<UE904> \x97\xD0 |0 # +<UE905> \x97\xD1 |0 # +<UE906> \x97\xD2 |0 # +<UE907> \x97\xD3 |0 # +<UE908> \x97\xD4 |0 # +<UE909> \x97\xD5 |0 # +<UE90A> \x97\xD6 |0 # +<UE90B> \x97\xD7 |0 # +<UE90C> \x97\xD8 |0 # +<UE90D> \x97\xD9 |0 # +<UE90E> \x97\xDA |0 # +<UE90F> \x97\xDB |0 # +<UE910> \x97\xDC |0 # +<UE911> \x97\xDD |0 # +<UE912> \x97\xDE |0 # +<UE913> \x97\xDF |0 # +<UE914> \x97\xE0 |0 # +<UE915> \x97\xE1 |0 # +<UE916> \x97\xE2 |0 # +<UE917> \x97\xE3 |0 # +<UE918> \x97\xE4 |0 # +<UE919> \x97\xE5 |0 # +<UE91A> \x97\xE6 |0 # +<UE91B> \x97\xE7 |0 # +<UE91C> \x97\xE8 |0 # +<UE91D> \x97\xE9 |0 # +<UE91E> \x97\xEA |0 # +<UE91F> \x97\xEB |0 # +<UE920> \x97\xEC |0 # +<UE921> \x97\xED |0 # +<UE922> \x97\xEE |0 # +<UE923> \x97\xEF |0 # +<UE924> \x97\xF0 |0 # +<UE925> \x97\xF1 |0 # +<UE926> \x97\xF2 |0 # +<UE927> \x97\xF3 |0 # +<UE928> \x97\xF4 |0 # +<UE929> \x97\xF5 |0 # +<UE92A> \x97\xF6 |0 # +<UE92B> \x97\xF7 |0 # +<UE92C> \x97\xF8 |0 # +<UE92D> \x97\xF9 |0 # +<UE92E> \x97\xFA |0 # +<UE92F> \x97\xFB |0 # +<UE930> \x97\xFC |0 # +<UE931> \x97\xFD |0 # +<UE932> \x97\xFE |0 # +<UE933> \x98\x40 |0 # +<UE934> \x98\x41 |0 # +<UE935> \x98\x42 |0 # +<UE936> \x98\x43 |0 # +<UE937> \x98\x44 |0 # +<UE938> \x98\x45 |0 # +<UE939> \x98\x46 |0 # +<UE93A> \x98\x47 |0 # +<UE93B> \x98\x48 |0 # +<UE93C> \x98\x49 |0 # +<UE93D> \x98\x4A |0 # +<UE93E> \x98\x4B |0 # +<UE93F> \x98\x4C |0 # +<UE940> \x98\x4D |0 # +<UE941> \x98\x4E |0 # +<UE942> \x98\x4F |0 # +<UE943> \x98\x50 |0 # +<UE944> \x98\x51 |0 # +<UE945> \x98\x52 |0 # +<UE946> \x98\x53 |0 # +<UE947> \x98\x54 |0 # +<UE948> \x98\x55 |0 # +<UE949> \x98\x56 |0 # +<UE94A> \x98\x57 |0 # +<UE94B> \x98\x58 |0 # +<UE94C> \x98\x59 |0 # +<UE94D> \x98\x5A |0 # +<UE94E> \x98\x5B |0 # +<UE94F> \x98\x5C |0 # +<UE950> \x98\x5D |0 # +<UE951> \x98\x5E |0 # +<UE952> \x98\x5F |0 # +<UE953> \x98\x60 |0 # +<UE954> \x98\x61 |0 # +<UE955> \x98\x62 |0 # +<UE956> \x98\x63 |0 # +<UE957> \x98\x64 |0 # +<UE958> \x98\x65 |0 # +<UE959> \x98\x66 |0 # +<UE95A> \x98\x67 |0 # +<UE95B> \x98\x68 |0 # +<UE95C> \x98\x69 |0 # +<UE95D> \x98\x6A |0 # +<UE95E> \x98\x6B |0 # +<UE95F> \x98\x6C |0 # +<UE960> \x98\x6D |0 # +<UE961> \x98\x6E |0 # +<UE962> \x98\x6F |0 # +<UE963> \x98\x70 |0 # +<UE964> \x98\x71 |0 # +<UE965> \x98\x72 |0 # +<UE966> \x98\x73 |0 # +<UE967> \x98\x74 |0 # +<UE968> \x98\x75 |0 # +<UE969> \x98\x76 |0 # +<UE96A> \x98\x77 |0 # +<UE96B> \x98\x78 |0 # +<UE96C> \x98\x79 |0 # +<UE96D> \x98\x7A |0 # +<UE96E> \x98\x7B |0 # +<UE96F> \x98\x7C |0 # +<UE970> \x98\x7D |0 # +<UE971> \x98\x7E |0 # +<UE972> \x98\xA1 |0 # +<UE973> \x98\xA2 |0 # +<UE974> \x98\xA3 |0 # +<UE975> \x98\xA4 |0 # +<UE976> \x98\xA5 |0 # +<UE977> \x98\xA6 |0 # +<UE978> \x98\xA7 |0 # +<UE979> \x98\xA8 |0 # +<UE97A> \x98\xA9 |0 # +<UE97B> \x98\xAA |0 # +<UE97C> \x98\xAB |0 # +<UE97D> \x98\xAC |0 # +<UE97E> \x98\xAD |0 # +<UE97F> \x98\xAE |0 # +<UE980> \x98\xAF |0 # +<UE981> \x98\xB0 |0 # +<UE982> \x98\xB1 |0 # +<UE983> \x98\xB2 |0 # +<UE984> \x98\xB3 |0 # +<UE985> \x98\xB4 |0 # +<UE986> \x98\xB5 |0 # +<UE987> \x98\xB6 |0 # +<UE988> \x98\xB7 |0 # +<UE989> \x98\xB8 |0 # +<UE98A> \x98\xB9 |0 # +<UE98B> \x98\xBA |0 # +<UE98C> \x98\xBB |0 # +<UE98D> \x98\xBC |0 # +<UE98E> \x98\xBD |0 # +<UE98F> \x98\xBE |0 # +<UE990> \x98\xBF |0 # +<UE991> \x98\xC0 |0 # +<UE992> \x98\xC1 |0 # +<UE993> \x98\xC2 |0 # +<UE994> \x98\xC3 |0 # +<UE995> \x98\xC4 |0 # +<UE996> \x98\xC5 |0 # +<UE997> \x98\xC6 |0 # +<UE998> \x98\xC7 |0 # +<UE999> \x98\xC8 |0 # +<UE99A> \x98\xC9 |0 # +<UE99B> \x98\xCA |0 # +<UE99C> \x98\xCB |0 # +<UE99D> \x98\xCC |0 # +<UE99E> \x98\xCD |0 # +<UE99F> \x98\xCE |0 # +<UE9A0> \x98\xCF |0 # +<UE9A1> \x98\xD0 |0 # +<UE9A2> \x98\xD1 |0 # +<UE9A3> \x98\xD2 |0 # +<UE9A4> \x98\xD3 |0 # +<UE9A5> \x98\xD4 |0 # +<UE9A6> \x98\xD5 |0 # +<UE9A7> \x98\xD6 |0 # +<UE9A8> \x98\xD7 |0 # +<UE9A9> \x98\xD8 |0 # +<UE9AA> \x98\xD9 |0 # +<UE9AB> \x98\xDA |0 # +<UE9AC> \x98\xDB |0 # +<UE9AD> \x98\xDC |0 # +<UE9AE> \x98\xDD |0 # +<UE9AF> \x98\xDE |0 # +<UE9B0> \x98\xDF |0 # +<UE9B1> \x98\xE0 |0 # +<UE9B2> \x98\xE1 |0 # +<UE9B3> \x98\xE2 |0 # +<UE9B4> \x98\xE3 |0 # +<UE9B5> \x98\xE4 |0 # +<UE9B6> \x98\xE5 |0 # +<UE9B7> \x98\xE6 |0 # +<UE9B8> \x98\xE7 |0 # +<UE9B9> \x98\xE8 |0 # +<UE9BA> \x98\xE9 |0 # +<UE9BB> \x98\xEA |0 # +<UE9BC> \x98\xEB |0 # +<UE9BD> \x98\xEC |0 # +<UE9BE> \x98\xED |0 # +<UE9BF> \x98\xEE |0 # +<UE9C0> \x98\xEF |0 # +<UE9C1> \x98\xF0 |0 # +<UE9C2> \x98\xF1 |0 # +<UE9C3> \x98\xF2 |0 # +<UE9C4> \x98\xF3 |0 # +<UE9C5> \x98\xF4 |0 # +<UE9C6> \x98\xF5 |0 # +<UE9C7> \x98\xF6 |0 # +<UE9C8> \x98\xF7 |0 # +<UE9C9> \x98\xF8 |0 # +<UE9CA> \x98\xF9 |0 # +<UE9CB> \x98\xFA |0 # +<UE9CC> \x98\xFB |0 # +<UE9CD> \x98\xFC |0 # +<UE9CE> \x98\xFD |0 # +<UE9CF> \x98\xFE |0 # +<UE9D0> \x99\x40 |0 # +<UE9D1> \x99\x41 |0 # +<UE9D2> \x99\x42 |0 # +<UE9D3> \x99\x43 |0 # +<UE9D4> \x99\x44 |0 # +<UE9D5> \x99\x45 |0 # +<UE9D6> \x99\x46 |0 # +<UE9D7> \x99\x47 |0 # +<UE9D8> \x99\x48 |0 # +<UE9D9> \x99\x49 |0 # +<UE9DA> \x99\x4A |0 # +<UE9DB> \x99\x4B |0 # +<UE9DC> \x99\x4C |0 # +<UE9DD> \x99\x4D |0 # +<UE9DE> \x99\x4E |0 # +<UE9DF> \x99\x4F |0 # +<UE9E0> \x99\x50 |0 # +<UE9E1> \x99\x51 |0 # +<UE9E2> \x99\x52 |0 # +<UE9E3> \x99\x53 |0 # +<UE9E4> \x99\x54 |0 # +<UE9E5> \x99\x55 |0 # +<UE9E6> \x99\x56 |0 # +<UE9E7> \x99\x57 |0 # +<UE9E8> \x99\x58 |0 # +<UE9E9> \x99\x59 |0 # +<UE9EA> \x99\x5A |0 # +<UE9EB> \x99\x5B |0 # +<UE9EC> \x99\x5C |0 # +<UE9ED> \x99\x5D |0 # +<UE9EE> \x99\x5E |0 # +<UE9EF> \x99\x5F |0 # +<UE9F0> \x99\x60 |0 # +<UE9F1> \x99\x61 |0 # +<UE9F2> \x99\x62 |0 # +<UE9F3> \x99\x63 |0 # +<UE9F4> \x99\x64 |0 # +<UE9F5> \x99\x65 |0 # +<UE9F6> \x99\x66 |0 # +<UE9F7> \x99\x67 |0 # +<UE9F8> \x99\x68 |0 # +<UE9F9> \x99\x69 |0 # +<UE9FA> \x99\x6A |0 # +<UE9FB> \x99\x6B |0 # +<UE9FC> \x99\x6C |0 # +<UE9FD> \x99\x6D |0 # +<UE9FE> \x99\x6E |0 # +<UE9FF> \x99\x6F |0 # +<UEA00> \x99\x70 |0 # +<UEA01> \x99\x71 |0 # +<UEA02> \x99\x72 |0 # +<UEA03> \x99\x73 |0 # +<UEA04> \x99\x74 |0 # +<UEA05> \x99\x75 |0 # +<UEA06> \x99\x76 |0 # +<UEA07> \x99\x77 |0 # +<UEA08> \x99\x78 |0 # +<UEA09> \x99\x79 |0 # +<UEA0A> \x99\x7A |0 # +<UEA0B> \x99\x7B |0 # +<UEA0C> \x99\x7C |0 # +<UEA0D> \x99\x7D |0 # +<UEA0E> \x99\x7E |0 # +<UEA0F> \x99\xA1 |0 # +<UEA10> \x99\xA2 |0 # +<UEA11> \x99\xA3 |0 # +<UEA12> \x99\xA4 |0 # +<UEA13> \x99\xA5 |0 # +<UEA14> \x99\xA6 |0 # +<UEA15> \x99\xA7 |0 # +<UEA16> \x99\xA8 |0 # +<UEA17> \x99\xA9 |0 # +<UEA18> \x99\xAA |0 # +<UEA19> \x99\xAB |0 # +<UEA1A> \x99\xAC |0 # +<UEA1B> \x99\xAD |0 # +<UEA1C> \x99\xAE |0 # +<UEA1D> \x99\xAF |0 # +<UEA1E> \x99\xB0 |0 # +<UEA1F> \x99\xB1 |0 # +<UEA20> \x99\xB2 |0 # +<UEA21> \x99\xB3 |0 # +<UEA22> \x99\xB4 |0 # +<UEA23> \x99\xB5 |0 # +<UEA24> \x99\xB6 |0 # +<UEA25> \x99\xB7 |0 # +<UEA26> \x99\xB8 |0 # +<UEA27> \x99\xB9 |0 # +<UEA28> \x99\xBA |0 # +<UEA29> \x99\xBB |0 # +<UEA2A> \x99\xBC |0 # +<UEA2B> \x99\xBD |0 # +<UEA2C> \x99\xBE |0 # +<UEA2D> \x99\xBF |0 # +<UEA2E> \x99\xC0 |0 # +<UEA2F> \x99\xC1 |0 # +<UEA30> \x99\xC2 |0 # +<UEA31> \x99\xC3 |0 # +<UEA32> \x99\xC4 |0 # +<UEA33> \x99\xC5 |0 # +<UEA34> \x99\xC6 |0 # +<UEA35> \x99\xC7 |0 # +<UEA36> \x99\xC8 |0 # +<UEA37> \x99\xC9 |0 # +<UEA38> \x99\xCA |0 # +<UEA39> \x99\xCB |0 # +<UEA3A> \x99\xCC |0 # +<UEA3B> \x99\xCD |0 # +<UEA3C> \x99\xCE |0 # +<UEA3D> \x99\xCF |0 # +<UEA3E> \x99\xD0 |0 # +<UEA3F> \x99\xD1 |0 # +<UEA40> \x99\xD2 |0 # +<UEA41> \x99\xD3 |0 # +<UEA42> \x99\xD4 |0 # +<UEA43> \x99\xD5 |0 # +<UEA44> \x99\xD6 |0 # +<UEA45> \x99\xD7 |0 # +<UEA46> \x99\xD8 |0 # +<UEA47> \x99\xD9 |0 # +<UEA48> \x99\xDA |0 # +<UEA49> \x99\xDB |0 # +<UEA4A> \x99\xDC |0 # +<UEA4B> \x99\xDD |0 # +<UEA4C> \x99\xDE |0 # +<UEA4D> \x99\xDF |0 # +<UEA4E> \x99\xE0 |0 # +<UEA4F> \x99\xE1 |0 # +<UEA50> \x99\xE2 |0 # +<UEA51> \x99\xE3 |0 # +<UEA52> \x99\xE4 |0 # +<UEA53> \x99\xE5 |0 # +<UEA54> \x99\xE6 |0 # +<UEA55> \x99\xE7 |0 # +<UEA56> \x99\xE8 |0 # +<UEA57> \x99\xE9 |0 # +<UEA58> \x99\xEA |0 # +<UEA59> \x99\xEB |0 # +<UEA5A> \x99\xEC |0 # +<UEA5B> \x99\xED |0 # +<UEA5C> \x99\xEE |0 # +<UEA5D> \x99\xEF |0 # +<UEA5E> \x99\xF0 |0 # +<UEA5F> \x99\xF1 |0 # +<UEA60> \x99\xF2 |0 # +<UEA61> \x99\xF3 |0 # +<UEA62> \x99\xF4 |0 # +<UEA63> \x99\xF5 |0 # +<UEA64> \x99\xF6 |0 # +<UEA65> \x99\xF7 |0 # +<UEA66> \x99\xF8 |0 # +<UEA67> \x99\xF9 |0 # +<UEA68> \x99\xFA |0 # +<UEA69> \x99\xFB |0 # +<UEA6A> \x99\xFC |0 # +<UEA6B> \x99\xFD |0 # +<UEA6C> \x99\xFE |0 # +<UEA6D> \x9A\x40 |0 # +<UEA6E> \x9A\x41 |0 # +<UEA6F> \x9A\x42 |0 # +<UEA70> \x9A\x43 |0 # +<UEA71> \x9A\x44 |0 # +<UEA72> \x9A\x45 |0 # +<UEA73> \x9A\x46 |0 # +<UEA74> \x9A\x47 |0 # +<UEA75> \x9A\x48 |0 # +<UEA76> \x9A\x49 |0 # +<UEA77> \x9A\x4A |0 # +<UEA78> \x9A\x4B |0 # +<UEA79> \x9A\x4C |0 # +<UEA7A> \x9A\x4D |0 # +<UEA7B> \x9A\x4E |0 # +<UEA7C> \x9A\x4F |0 # +<UEA7D> \x9A\x50 |0 # +<UEA7E> \x9A\x51 |0 # +<UEA7F> \x9A\x52 |0 # +<UEA80> \x9A\x53 |0 # +<UEA81> \x9A\x54 |0 # +<UEA82> \x9A\x55 |0 # +<UEA83> \x9A\x56 |0 # +<UEA84> \x9A\x57 |0 # +<UEA85> \x9A\x58 |0 # +<UEA86> \x9A\x59 |0 # +<UEA87> \x9A\x5A |0 # +<UEA88> \x9A\x5B |0 # +<UEA89> \x9A\x5C |0 # +<UEA8A> \x9A\x5D |0 # +<UEA8B> \x9A\x5E |0 # +<UEA8C> \x9A\x5F |0 # +<UEA8D> \x9A\x60 |0 # +<UEA8E> \x9A\x61 |0 # +<UEA8F> \x9A\x62 |0 # +<UEA90> \x9A\x63 |0 # +<UEA91> \x9A\x64 |0 # +<UEA92> \x9A\x65 |0 # +<UEA93> \x9A\x66 |0 # +<UEA94> \x9A\x67 |0 # +<UEA95> \x9A\x68 |0 # +<UEA96> \x9A\x69 |0 # +<UEA97> \x9A\x6A |0 # +<UEA98> \x9A\x6B |0 # +<UEA99> \x9A\x6C |0 # +<UEA9A> \x9A\x6D |0 # +<UEA9B> \x9A\x6E |0 # +<UEA9C> \x9A\x6F |0 # +<UEA9D> \x9A\x70 |0 # +<UEA9E> \x9A\x71 |0 # +<UEA9F> \x9A\x72 |0 # +<UEAA0> \x9A\x73 |0 # +<UEAA1> \x9A\x74 |0 # +<UEAA2> \x9A\x75 |0 # +<UEAA3> \x9A\x76 |0 # +<UEAA4> \x9A\x77 |0 # +<UEAA5> \x9A\x78 |0 # +<UEAA6> \x9A\x79 |0 # +<UEAA7> \x9A\x7A |0 # +<UEAA8> \x9A\x7B |0 # +<UEAA9> \x9A\x7C |0 # +<UEAAA> \x9A\x7D |0 # +<UEAAB> \x9A\x7E |0 # +<UEAAC> \x9A\xA1 |0 # +<UEAAD> \x9A\xA2 |0 # +<UEAAE> \x9A\xA3 |0 # +<UEAAF> \x9A\xA4 |0 # +<UEAB0> \x9A\xA5 |0 # +<UEAB1> \x9A\xA6 |0 # +<UEAB2> \x9A\xA7 |0 # +<UEAB3> \x9A\xA8 |0 # +<UEAB4> \x9A\xA9 |0 # +<UEAB5> \x9A\xAA |0 # +<UEAB6> \x9A\xAB |0 # +<UEAB7> \x9A\xAC |0 # +<UEAB8> \x9A\xAD |0 # +<UEAB9> \x9A\xAE |0 # +<UEABA> \x9A\xAF |0 # +<UEABB> \x9A\xB0 |0 # +<UEABC> \x9A\xB1 |0 # +<UEABD> \x9A\xB2 |0 # +<UEABE> \x9A\xB3 |0 # +<UEABF> \x9A\xB4 |0 # +<UEAC0> \x9A\xB5 |0 # +<UEAC1> \x9A\xB6 |0 # +<UEAC2> \x9A\xB7 |0 # +<UEAC3> \x9A\xB8 |0 # +<UEAC4> \x9A\xB9 |0 # +<UEAC5> \x9A\xBA |0 # +<UEAC6> \x9A\xBB |0 # +<UEAC7> \x9A\xBC |0 # +<UEAC8> \x9A\xBD |0 # +<UEAC9> \x9A\xBE |0 # +<UEACA> \x9A\xBF |0 # +<UEACB> \x9A\xC0 |0 # +<UEACC> \x9A\xC1 |0 # +<UEACD> \x9A\xC2 |0 # +<UEACE> \x9A\xC3 |0 # +<UEACF> \x9A\xC4 |0 # +<UEAD0> \x9A\xC5 |0 # +<UEAD1> \x9A\xC6 |0 # +<UEAD2> \x9A\xC7 |0 # +<UEAD3> \x9A\xC8 |0 # +<UEAD4> \x9A\xC9 |0 # +<UEAD5> \x9A\xCA |0 # +<UEAD6> \x9A\xCB |0 # +<UEAD7> \x9A\xCC |0 # +<UEAD8> \x9A\xCD |0 # +<UEAD9> \x9A\xCE |0 # +<UEADA> \x9A\xCF |0 # +<UEADB> \x9A\xD0 |0 # +<UEADC> \x9A\xD1 |0 # +<UEADD> \x9A\xD2 |0 # +<UEADE> \x9A\xD3 |0 # +<UEADF> \x9A\xD4 |0 # +<UEAE0> \x9A\xD5 |0 # +<UEAE1> \x9A\xD6 |0 # +<UEAE2> \x9A\xD7 |0 # +<UEAE3> \x9A\xD8 |0 # +<UEAE4> \x9A\xD9 |0 # +<UEAE5> \x9A\xDA |0 # +<UEAE6> \x9A\xDB |0 # +<UEAE7> \x9A\xDC |0 # +<UEAE8> \x9A\xDD |0 # +<UEAE9> \x9A\xDE |0 # +<UEAEA> \x9A\xDF |0 # +<UEAEB> \x9A\xE0 |0 # +<UEAEC> \x9A\xE1 |0 # +<UEAED> \x9A\xE2 |0 # +<UEAEE> \x9A\xE3 |0 # +<UEAEF> \x9A\xE4 |0 # +<UEAF0> \x9A\xE5 |0 # +<UEAF1> \x9A\xE6 |0 # +<UEAF2> \x9A\xE7 |0 # +<UEAF3> \x9A\xE8 |0 # +<UEAF4> \x9A\xE9 |0 # +<UEAF5> \x9A\xEA |0 # +<UEAF6> \x9A\xEB |0 # +<UEAF7> \x9A\xEC |0 # +<UEAF8> \x9A\xED |0 # +<UEAF9> \x9A\xEE |0 # +<UEAFA> \x9A\xEF |0 # +<UEAFB> \x9A\xF0 |0 # +<UEAFC> \x9A\xF1 |0 # +<UEAFD> \x9A\xF2 |0 # +<UEAFE> \x9A\xF3 |0 # +<UEAFF> \x9A\xF4 |0 # +<UEB00> \x9A\xF5 |0 # +<UEB01> \x9A\xF6 |0 # +<UEB02> \x9A\xF7 |0 # +<UEB03> \x9A\xF8 |0 # +<UEB04> \x9A\xF9 |0 # +<UEB05> \x9A\xFA |0 # +<UEB06> \x9A\xFB |0 # +<UEB07> \x9A\xFC |0 # +<UEB08> \x9A\xFD |0 # +<UEB09> \x9A\xFE |0 # +<UEB0A> \x9B\x40 |0 # +<UEB0B> \x9B\x41 |0 # +<UEB0C> \x9B\x42 |0 # +<UEB0D> \x9B\x43 |0 # +<UEB0E> \x9B\x44 |0 # +<UEB0F> \x9B\x45 |0 # +<UEB10> \x9B\x46 |0 # +<UEB11> \x9B\x47 |0 # +<UEB12> \x9B\x48 |0 # +<UEB13> \x9B\x49 |0 # +<UEB14> \x9B\x4A |0 # +<UEB15> \x9B\x4B |0 # +<UEB16> \x9B\x4C |0 # +<UEB17> \x9B\x4D |0 # +<UEB18> \x9B\x4E |0 # +<UEB19> \x9B\x4F |0 # +<UEB1A> \x9B\x50 |0 # +<UEB1B> \x9B\x51 |0 # +<UEB1C> \x9B\x52 |0 # +<UEB1D> \x9B\x53 |0 # +<UEB1E> \x9B\x54 |0 # +<UEB1F> \x9B\x55 |0 # +<UEB20> \x9B\x56 |0 # +<UEB21> \x9B\x57 |0 # +<UEB22> \x9B\x58 |0 # +<UEB23> \x9B\x59 |0 # +<UEB24> \x9B\x5A |0 # +<UEB25> \x9B\x5B |0 # +<UEB26> \x9B\x5C |0 # +<UEB27> \x9B\x5D |0 # +<UEB28> \x9B\x5E |0 # +<UEB29> \x9B\x5F |0 # +<UEB2A> \x9B\x60 |0 # +<UEB2B> \x9B\x61 |0 # +<UEB2C> \x9B\x62 |0 # +<UEB2D> \x9B\x63 |0 # +<UEB2E> \x9B\x64 |0 # +<UEB2F> \x9B\x65 |0 # +<UEB30> \x9B\x66 |0 # +<UEB31> \x9B\x67 |0 # +<UEB32> \x9B\x68 |0 # +<UEB33> \x9B\x69 |0 # +<UEB34> \x9B\x6A |0 # +<UEB35> \x9B\x6B |0 # +<UEB36> \x9B\x6C |0 # +<UEB37> \x9B\x6D |0 # +<UEB38> \x9B\x6E |0 # +<UEB39> \x9B\x6F |0 # +<UEB3A> \x9B\x70 |0 # +<UEB3B> \x9B\x71 |0 # +<UEB3C> \x9B\x72 |0 # +<UEB3D> \x9B\x73 |0 # +<UEB3E> \x9B\x74 |0 # +<UEB3F> \x9B\x75 |0 # +<UEB40> \x9B\x76 |0 # +<UEB41> \x9B\x77 |0 # +<UEB42> \x9B\x78 |0 # +<UEB43> \x9B\x79 |0 # +<UEB44> \x9B\x7A |0 # +<UEB45> \x9B\x7B |0 # +<UEB46> \x9B\x7C |0 # +<UEB47> \x9B\x7D |0 # +<UEB48> \x9B\x7E |0 # +<UEB49> \x9B\xA1 |0 # +<UEB4A> \x9B\xA2 |0 # +<UEB4B> \x9B\xA3 |0 # +<UEB4C> \x9B\xA4 |0 # +<UEB4D> \x9B\xA5 |0 # +<UEB4E> \x9B\xA6 |0 # +<UEB4F> \x9B\xA7 |0 # +<UEB50> \x9B\xA8 |0 # +<UEB51> \x9B\xA9 |0 # +<UEB52> \x9B\xAA |0 # +<UEB53> \x9B\xAB |0 # +<UEB54> \x9B\xAC |0 # +<UEB55> \x9B\xAD |0 # +<UEB56> \x9B\xAE |0 # +<UEB57> \x9B\xAF |0 # +<UEB58> \x9B\xB0 |0 # +<UEB59> \x9B\xB1 |0 # +<UEB5A> \x9B\xB2 |0 # +<UEB5B> \x9B\xB3 |0 # +<UEB5C> \x9B\xB4 |0 # +<UEB5D> \x9B\xB5 |0 # +<UEB5E> \x9B\xB6 |0 # +<UEB5F> \x9B\xB7 |0 # +<UEB60> \x9B\xB8 |0 # +<UEB61> \x9B\xB9 |0 # +<UEB62> \x9B\xBA |0 # +<UEB63> \x9B\xBB |0 # +<UEB64> \x9B\xBC |0 # +<UEB65> \x9B\xBD |0 # +<UEB66> \x9B\xBE |0 # +<UEB67> \x9B\xBF |0 # +<UEB68> \x9B\xC0 |0 # +<UEB69> \x9B\xC1 |0 # +<UEB6A> \x9B\xC2 |0 # +<UEB6B> \x9B\xC3 |0 # +<UEB6C> \x9B\xC4 |0 # +<UEB6D> \x9B\xC5 |0 # +<UEB6E> \x9B\xC6 |0 # +<UEB6F> \x9B\xC7 |0 # +<UEB70> \x9B\xC8 |0 # +<UEB71> \x9B\xC9 |0 # +<UEB72> \x9B\xCA |0 # +<UEB73> \x9B\xCB |0 # +<UEB74> \x9B\xCC |0 # +<UEB75> \x9B\xCD |0 # +<UEB76> \x9B\xCE |0 # +<UEB77> \x9B\xCF |0 # +<UEB78> \x9B\xD0 |0 # +<UEB79> \x9B\xD1 |0 # +<UEB7A> \x9B\xD2 |0 # +<UEB7B> \x9B\xD3 |0 # +<UEB7C> \x9B\xD4 |0 # +<UEB7D> \x9B\xD5 |0 # +<UEB7E> \x9B\xD6 |0 # +<UEB7F> \x9B\xD7 |0 # +<UEB80> \x9B\xD8 |0 # +<UEB81> \x9B\xD9 |0 # +<UEB82> \x9B\xDA |0 # +<UEB83> \x9B\xDB |0 # +<UEB84> \x9B\xDC |0 # +<UEB85> \x9B\xDD |0 # +<UEB86> \x9B\xDE |0 # +<UEB87> \x9B\xDF |0 # +<UEB88> \x9B\xE0 |0 # +<UEB89> \x9B\xE1 |0 # +<UEB8A> \x9B\xE2 |0 # +<UEB8B> \x9B\xE3 |0 # +<UEB8C> \x9B\xE4 |0 # +<UEB8D> \x9B\xE5 |0 # +<UEB8E> \x9B\xE6 |0 # +<UEB8F> \x9B\xE7 |0 # +<UEB90> \x9B\xE8 |0 # +<UEB91> \x9B\xE9 |0 # +<UEB92> \x9B\xEA |0 # +<UEB93> \x9B\xEB |0 # +<UEB94> \x9B\xEC |0 # +<UEB95> \x9B\xED |0 # +<UEB96> \x9B\xEE |0 # +<UEB97> \x9B\xEF |0 # +<UEB98> \x9B\xF0 |0 # +<UEB99> \x9B\xF1 |0 # +<UEB9A> \x9B\xF2 |0 # +<UEB9B> \x9B\xF3 |0 # +<UEB9C> \x9B\xF4 |0 # +<UEB9D> \x9B\xF5 |0 # +<UEB9E> \x9B\xF6 |0 # +<UEB9F> \x9B\xF7 |0 # +<UEBA0> \x9B\xF8 |0 # +<UEBA1> \x9B\xF9 |0 # +<UEBA2> \x9B\xFA |0 # +<UEBA3> \x9B\xFB |0 # +<UEBA4> \x9B\xFC |0 # +<UEBA5> \x9B\xFD |0 # +<UEBA6> \x9B\xFE |0 # +<UEBA7> \x9C\x40 |0 # +<UEBA8> \x9C\x41 |0 # +<UEBA9> \x9C\x42 |0 # +<UEBAA> \x9C\x43 |0 # +<UEBAB> \x9C\x44 |0 # +<UEBAC> \x9C\x45 |0 # +<UEBAD> \x9C\x46 |0 # +<UEBAE> \x9C\x47 |0 # +<UEBAF> \x9C\x48 |0 # +<UEBB0> \x9C\x49 |0 # +<UEBB1> \x9C\x4A |0 # +<UEBB2> \x9C\x4B |0 # +<UEBB3> \x9C\x4C |0 # +<UEBB4> \x9C\x4D |0 # +<UEBB5> \x9C\x4E |0 # +<UEBB6> \x9C\x4F |0 # +<UEBB7> \x9C\x50 |0 # +<UEBB8> \x9C\x51 |0 # +<UEBB9> \x9C\x52 |0 # +<UEBBA> \x9C\x53 |0 # +<UEBBB> \x9C\x54 |0 # +<UEBBC> \x9C\x55 |0 # +<UEBBD> \x9C\x56 |0 # +<UEBBE> \x9C\x57 |0 # +<UEBBF> \x9C\x58 |0 # +<UEBC0> \x9C\x59 |0 # +<UEBC1> \x9C\x5A |0 # +<UEBC2> \x9C\x5B |0 # +<UEBC3> \x9C\x5C |0 # +<UEBC4> \x9C\x5D |0 # +<UEBC5> \x9C\x5E |0 # +<UEBC6> \x9C\x5F |0 # +<UEBC7> \x9C\x60 |0 # +<UEBC8> \x9C\x61 |0 # +<UEBC9> \x9C\x62 |0 # +<UEBCA> \x9C\x63 |0 # +<UEBCB> \x9C\x64 |0 # +<UEBCC> \x9C\x65 |0 # +<UEBCD> \x9C\x66 |0 # +<UEBCE> \x9C\x67 |0 # +<UEBCF> \x9C\x68 |0 # +<UEBD0> \x9C\x69 |0 # +<UEBD1> \x9C\x6A |0 # +<UEBD2> \x9C\x6B |0 # +<UEBD3> \x9C\x6C |0 # +<UEBD4> \x9C\x6D |0 # +<UEBD5> \x9C\x6E |0 # +<UEBD6> \x9C\x6F |0 # +<UEBD7> \x9C\x70 |0 # +<UEBD8> \x9C\x71 |0 # +<UEBD9> \x9C\x72 |0 # +<UEBDA> \x9C\x73 |0 # +<UEBDB> \x9C\x74 |0 # +<UEBDC> \x9C\x75 |0 # +<UEBDD> \x9C\x76 |0 # +<UEBDE> \x9C\x77 |0 # +<UEBDF> \x9C\x78 |0 # +<UEBE0> \x9C\x79 |0 # +<UEBE1> \x9C\x7A |0 # +<UEBE2> \x9C\x7B |0 # +<UEBE3> \x9C\x7C |0 # +<UEBE4> \x9C\x7D |0 # +<UEBE5> \x9C\x7E |0 # +<UEBE6> \x9C\xA1 |0 # +<UEBE7> \x9C\xA2 |0 # +<UEBE8> \x9C\xA3 |0 # +<UEBE9> \x9C\xA4 |0 # +<UEBEA> \x9C\xA5 |0 # +<UEBEB> \x9C\xA6 |0 # +<UEBEC> \x9C\xA7 |0 # +<UEBED> \x9C\xA8 |0 # +<UEBEE> \x9C\xA9 |0 # +<UEBEF> \x9C\xAA |0 # +<UEBF0> \x9C\xAB |0 # +<UEBF1> \x9C\xAC |0 # +<UEBF2> \x9C\xAD |0 # +<UEBF3> \x9C\xAE |0 # +<UEBF4> \x9C\xAF |0 # +<UEBF5> \x9C\xB0 |0 # +<UEBF6> \x9C\xB1 |0 # +<UEBF7> \x9C\xB2 |0 # +<UEBF8> \x9C\xB3 |0 # +<UEBF9> \x9C\xB4 |0 # +<UEBFA> \x9C\xB5 |0 # +<UEBFB> \x9C\xB6 |0 # +<UEBFC> \x9C\xB7 |0 # +<UEBFD> \x9C\xB8 |0 # +<UEBFE> \x9C\xB9 |0 # +<UEBFF> \x9C\xBA |0 # +<UEC00> \x9C\xBB |0 # +<UEC01> \x9C\xBC |0 # +<UEC02> \x9C\xBD |0 # +<UEC03> \x9C\xBE |0 # +<UEC04> \x9C\xBF |0 # +<UEC05> \x9C\xC0 |0 # +<UEC06> \x9C\xC1 |0 # +<UEC07> \x9C\xC2 |0 # +<UEC08> \x9C\xC3 |0 # +<UEC09> \x9C\xC4 |0 # +<UEC0A> \x9C\xC5 |0 # +<UEC0B> \x9C\xC6 |0 # +<UEC0C> \x9C\xC7 |0 # +<UEC0D> \x9C\xC8 |0 # +<UEC0E> \x9C\xC9 |0 # +<UEC0F> \x9C\xCA |0 # +<UEC10> \x9C\xCB |0 # +<UEC11> \x9C\xCC |0 # +<UEC12> \x9C\xCD |0 # +<UEC13> \x9C\xCE |0 # +<UEC14> \x9C\xCF |0 # +<UEC15> \x9C\xD0 |0 # +<UEC16> \x9C\xD1 |0 # +<UEC17> \x9C\xD2 |0 # +<UEC18> \x9C\xD3 |0 # +<UEC19> \x9C\xD4 |0 # +<UEC1A> \x9C\xD5 |0 # +<UEC1B> \x9C\xD6 |0 # +<UEC1C> \x9C\xD7 |0 # +<UEC1D> \x9C\xD8 |0 # +<UEC1E> \x9C\xD9 |0 # +<UEC1F> \x9C\xDA |0 # +<UEC20> \x9C\xDB |0 # +<UEC21> \x9C\xDC |0 # +<UEC22> \x9C\xDD |0 # +<UEC23> \x9C\xDE |0 # +<UEC24> \x9C\xDF |0 # +<UEC25> \x9C\xE0 |0 # +<UEC26> \x9C\xE1 |0 # +<UEC27> \x9C\xE2 |0 # +<UEC28> \x9C\xE3 |0 # +<UEC29> \x9C\xE4 |0 # +<UEC2A> \x9C\xE5 |0 # +<UEC2B> \x9C\xE6 |0 # +<UEC2C> \x9C\xE7 |0 # +<UEC2D> \x9C\xE8 |0 # +<UEC2E> \x9C\xE9 |0 # +<UEC2F> \x9C\xEA |0 # +<UEC30> \x9C\xEB |0 # +<UEC31> \x9C\xEC |0 # +<UEC32> \x9C\xED |0 # +<UEC33> \x9C\xEE |0 # +<UEC34> \x9C\xEF |0 # +<UEC35> \x9C\xF0 |0 # +<UEC36> \x9C\xF1 |0 # +<UEC37> \x9C\xF2 |0 # +<UEC38> \x9C\xF3 |0 # +<UEC39> \x9C\xF4 |0 # +<UEC3A> \x9C\xF5 |0 # +<UEC3B> \x9C\xF6 |0 # +<UEC3C> \x9C\xF7 |0 # +<UEC3D> \x9C\xF8 |0 # +<UEC3E> \x9C\xF9 |0 # +<UEC3F> \x9C\xFA |0 # +<UEC40> \x9C\xFB |0 # +<UEC41> \x9C\xFC |0 # +<UEC42> \x9C\xFD |0 # +<UEC43> \x9C\xFE |0 # +<UEC44> \x9D\x40 |0 # +<UEC45> \x9D\x41 |0 # +<UEC46> \x9D\x42 |0 # +<UEC47> \x9D\x43 |0 # +<UEC48> \x9D\x44 |0 # +<UEC49> \x9D\x45 |0 # +<UEC4A> \x9D\x46 |0 # +<UEC4B> \x9D\x47 |0 # +<UEC4C> \x9D\x48 |0 # +<UEC4D> \x9D\x49 |0 # +<UEC4E> \x9D\x4A |0 # +<UEC4F> \x9D\x4B |0 # +<UEC50> \x9D\x4C |0 # +<UEC51> \x9D\x4D |0 # +<UEC52> \x9D\x4E |0 # +<UEC53> \x9D\x4F |0 # +<UEC54> \x9D\x50 |0 # +<UEC55> \x9D\x51 |0 # +<UEC56> \x9D\x52 |0 # +<UEC57> \x9D\x53 |0 # +<UEC58> \x9D\x54 |0 # +<UEC59> \x9D\x55 |0 # +<UEC5A> \x9D\x56 |0 # +<UEC5B> \x9D\x57 |0 # +<UEC5C> \x9D\x58 |0 # +<UEC5D> \x9D\x59 |0 # +<UEC5E> \x9D\x5A |0 # +<UEC5F> \x9D\x5B |0 # +<UEC60> \x9D\x5C |0 # +<UEC61> \x9D\x5D |0 # +<UEC62> \x9D\x5E |0 # +<UEC63> \x9D\x5F |0 # +<UEC64> \x9D\x60 |0 # +<UEC65> \x9D\x61 |0 # +<UEC66> \x9D\x62 |0 # +<UEC67> \x9D\x63 |0 # +<UEC68> \x9D\x64 |0 # +<UEC69> \x9D\x65 |0 # +<UEC6A> \x9D\x66 |0 # +<UEC6B> \x9D\x67 |0 # +<UEC6C> \x9D\x68 |0 # +<UEC6D> \x9D\x69 |0 # +<UEC6E> \x9D\x6A |0 # +<UEC6F> \x9D\x6B |0 # +<UEC70> \x9D\x6C |0 # +<UEC71> \x9D\x6D |0 # +<UEC72> \x9D\x6E |0 # +<UEC73> \x9D\x6F |0 # +<UEC74> \x9D\x70 |0 # +<UEC75> \x9D\x71 |0 # +<UEC76> \x9D\x72 |0 # +<UEC77> \x9D\x73 |0 # +<UEC78> \x9D\x74 |0 # +<UEC79> \x9D\x75 |0 # +<UEC7A> \x9D\x76 |0 # +<UEC7B> \x9D\x77 |0 # +<UEC7C> \x9D\x78 |0 # +<UEC7D> \x9D\x79 |0 # +<UEC7E> \x9D\x7A |0 # +<UEC7F> \x9D\x7B |0 # +<UEC80> \x9D\x7C |0 # +<UEC81> \x9D\x7D |0 # +<UEC82> \x9D\x7E |0 # +<UEC83> \x9D\xA1 |0 # +<UEC84> \x9D\xA2 |0 # +<UEC85> \x9D\xA3 |0 # +<UEC86> \x9D\xA4 |0 # +<UEC87> \x9D\xA5 |0 # +<UEC88> \x9D\xA6 |0 # +<UEC89> \x9D\xA7 |0 # +<UEC8A> \x9D\xA8 |0 # +<UEC8B> \x9D\xA9 |0 # +<UEC8C> \x9D\xAA |0 # +<UEC8D> \x9D\xAB |0 # +<UEC8E> \x9D\xAC |0 # +<UEC8F> \x9D\xAD |0 # +<UEC90> \x9D\xAE |0 # +<UEC91> \x9D\xAF |0 # +<UEC92> \x9D\xB0 |0 # +<UEC93> \x9D\xB1 |0 # +<UEC94> \x9D\xB2 |0 # +<UEC95> \x9D\xB3 |0 # +<UEC96> \x9D\xB4 |0 # +<UEC97> \x9D\xB5 |0 # +<UEC98> \x9D\xB6 |0 # +<UEC99> \x9D\xB7 |0 # +<UEC9A> \x9D\xB8 |0 # +<UEC9B> \x9D\xB9 |0 # +<UEC9C> \x9D\xBA |0 # +<UEC9D> \x9D\xBB |0 # +<UEC9E> \x9D\xBC |0 # +<UEC9F> \x9D\xBD |0 # +<UECA0> \x9D\xBE |0 # +<UECA1> \x9D\xBF |0 # +<UECA2> \x9D\xC0 |0 # +<UECA3> \x9D\xC1 |0 # +<UECA4> \x9D\xC2 |0 # +<UECA5> \x9D\xC3 |0 # +<UECA6> \x9D\xC4 |0 # +<UECA7> \x9D\xC5 |0 # +<UECA8> \x9D\xC6 |0 # +<UECA9> \x9D\xC7 |0 # +<UECAA> \x9D\xC8 |0 # +<UECAB> \x9D\xC9 |0 # +<UECAC> \x9D\xCA |0 # +<UECAD> \x9D\xCB |0 # +<UECAE> \x9D\xCC |0 # +<UECAF> \x9D\xCD |0 # +<UECB0> \x9D\xCE |0 # +<UECB1> \x9D\xCF |0 # +<UECB2> \x9D\xD0 |0 # +<UECB3> \x9D\xD1 |0 # +<UECB4> \x9D\xD2 |0 # +<UECB5> \x9D\xD3 |0 # +<UECB6> \x9D\xD4 |0 # +<UECB7> \x9D\xD5 |0 # +<UECB8> \x9D\xD6 |0 # +<UECB9> \x9D\xD7 |0 # +<UECBA> \x9D\xD8 |0 # +<UECBB> \x9D\xD9 |0 # +<UECBC> \x9D\xDA |0 # +<UECBD> \x9D\xDB |0 # +<UECBE> \x9D\xDC |0 # +<UECBF> \x9D\xDD |0 # +<UECC0> \x9D\xDE |0 # +<UECC1> \x9D\xDF |0 # +<UECC2> \x9D\xE0 |0 # +<UECC3> \x9D\xE1 |0 # +<UECC4> \x9D\xE2 |0 # +<UECC5> \x9D\xE3 |0 # +<UECC6> \x9D\xE4 |0 # +<UECC7> \x9D\xE5 |0 # +<UECC8> \x9D\xE6 |0 # +<UECC9> \x9D\xE7 |0 # +<UECCA> \x9D\xE8 |0 # +<UECCB> \x9D\xE9 |0 # +<UECCC> \x9D\xEA |0 # +<UECCD> \x9D\xEB |0 # +<UECCE> \x9D\xEC |0 # +<UECCF> \x9D\xED |0 # +<UECD0> \x9D\xEE |0 # +<UECD1> \x9D\xEF |0 # +<UECD2> \x9D\xF0 |0 # +<UECD3> \x9D\xF1 |0 # +<UECD4> \x9D\xF2 |0 # +<UECD5> \x9D\xF3 |0 # +<UECD6> \x9D\xF4 |0 # +<UECD7> \x9D\xF5 |0 # +<UECD8> \x9D\xF6 |0 # +<UECD9> \x9D\xF7 |0 # +<UECDA> \x9D\xF8 |0 # +<UECDB> \x9D\xF9 |0 # +<UECDC> \x9D\xFA |0 # +<UECDD> \x9D\xFB |0 # +<UECDE> \x9D\xFC |0 # +<UECDF> \x9D\xFD |0 # +<UECE0> \x9D\xFE |0 # +<UECE1> \x9E\x40 |0 # +<UECE2> \x9E\x41 |0 # +<UECE3> \x9E\x42 |0 # +<UECE4> \x9E\x43 |0 # +<UECE5> \x9E\x44 |0 # +<UECE6> \x9E\x45 |0 # +<UECE7> \x9E\x46 |0 # +<UECE8> \x9E\x47 |0 # +<UECE9> \x9E\x48 |0 # +<UECEA> \x9E\x49 |0 # +<UECEB> \x9E\x4A |0 # +<UECEC> \x9E\x4B |0 # +<UECED> \x9E\x4C |0 # +<UECEE> \x9E\x4D |0 # +<UECEF> \x9E\x4E |0 # +<UECF0> \x9E\x4F |0 # +<UECF1> \x9E\x50 |0 # +<UECF2> \x9E\x51 |0 # +<UECF3> \x9E\x52 |0 # +<UECF4> \x9E\x53 |0 # +<UECF5> \x9E\x54 |0 # +<UECF6> \x9E\x55 |0 # +<UECF7> \x9E\x56 |0 # +<UECF8> \x9E\x57 |0 # +<UECF9> \x9E\x58 |0 # +<UECFA> \x9E\x59 |0 # +<UECFB> \x9E\x5A |0 # +<UECFC> \x9E\x5B |0 # +<UECFD> \x9E\x5C |0 # +<UECFE> \x9E\x5D |0 # +<UECFF> \x9E\x5E |0 # +<UED00> \x9E\x5F |0 # +<UED01> \x9E\x60 |0 # +<UED02> \x9E\x61 |0 # +<UED03> \x9E\x62 |0 # +<UED04> \x9E\x63 |0 # +<UED05> \x9E\x64 |0 # +<UED06> \x9E\x65 |0 # +<UED07> \x9E\x66 |0 # +<UED08> \x9E\x67 |0 # +<UED09> \x9E\x68 |0 # +<UED0A> \x9E\x69 |0 # +<UED0B> \x9E\x6A |0 # +<UED0C> \x9E\x6B |0 # +<UED0D> \x9E\x6C |0 # +<UED0E> \x9E\x6D |0 # +<UED0F> \x9E\x6E |0 # +<UED10> \x9E\x6F |0 # +<UED11> \x9E\x70 |0 # +<UED12> \x9E\x71 |0 # +<UED13> \x9E\x72 |0 # +<UED14> \x9E\x73 |0 # +<UED15> \x9E\x74 |0 # +<UED16> \x9E\x75 |0 # +<UED17> \x9E\x76 |0 # +<UED18> \x9E\x77 |0 # +<UED19> \x9E\x78 |0 # +<UED1A> \x9E\x79 |0 # +<UED1B> \x9E\x7A |0 # +<UED1C> \x9E\x7B |0 # +<UED1D> \x9E\x7C |0 # +<UED1E> \x9E\x7D |0 # +<UED1F> \x9E\x7E |0 # +<UED20> \x9E\xA1 |0 # +<UED21> \x9E\xA2 |0 # +<UED22> \x9E\xA3 |0 # +<UED23> \x9E\xA4 |0 # +<UED24> \x9E\xA5 |0 # +<UED25> \x9E\xA6 |0 # +<UED26> \x9E\xA7 |0 # +<UED27> \x9E\xA8 |0 # +<UED28> \x9E\xA9 |0 # +<UED29> \x9E\xAA |0 # +<UED2A> \x9E\xAB |0 # +<UED2B> \x9E\xAC |0 # +<UED2C> \x9E\xAD |0 # +<UED2D> \x9E\xAE |0 # +<UED2E> \x9E\xAF |0 # +<UED2F> \x9E\xB0 |0 # +<UED30> \x9E\xB1 |0 # +<UED31> \x9E\xB2 |0 # +<UED32> \x9E\xB3 |0 # +<UED33> \x9E\xB4 |0 # +<UED34> \x9E\xB5 |0 # +<UED35> \x9E\xB6 |0 # +<UED36> \x9E\xB7 |0 # +<UED37> \x9E\xB8 |0 # +<UED38> \x9E\xB9 |0 # +<UED39> \x9E\xBA |0 # +<UED3A> \x9E\xBB |0 # +<UED3B> \x9E\xBC |0 # +<UED3C> \x9E\xBD |0 # +<UED3D> \x9E\xBE |0 # +<UED3E> \x9E\xBF |0 # +<UED3F> \x9E\xC0 |0 # +<UED40> \x9E\xC1 |0 # +<UED41> \x9E\xC2 |0 # +<UED42> \x9E\xC3 |0 # +<UED43> \x9E\xC4 |0 # +<UED44> \x9E\xC5 |0 # +<UED45> \x9E\xC6 |0 # +<UED46> \x9E\xC7 |0 # +<UED47> \x9E\xC8 |0 # +<UED48> \x9E\xC9 |0 # +<UED49> \x9E\xCA |0 # +<UED4A> \x9E\xCB |0 # +<UED4B> \x9E\xCC |0 # +<UED4C> \x9E\xCD |0 # +<UED4D> \x9E\xCE |0 # +<UED4E> \x9E\xCF |0 # +<UED4F> \x9E\xD0 |0 # +<UED50> \x9E\xD1 |0 # +<UED51> \x9E\xD2 |0 # +<UED52> \x9E\xD3 |0 # +<UED53> \x9E\xD4 |0 # +<UED54> \x9E\xD5 |0 # +<UED55> \x9E\xD6 |0 # +<UED56> \x9E\xD7 |0 # +<UED57> \x9E\xD8 |0 # +<UED58> \x9E\xD9 |0 # +<UED59> \x9E\xDA |0 # +<UED5A> \x9E\xDB |0 # +<UED5B> \x9E\xDC |0 # +<UED5C> \x9E\xDD |0 # +<UED5D> \x9E\xDE |0 # +<UED5E> \x9E\xDF |0 # +<UED5F> \x9E\xE0 |0 # +<UED60> \x9E\xE1 |0 # +<UED61> \x9E\xE2 |0 # +<UED62> \x9E\xE3 |0 # +<UED63> \x9E\xE4 |0 # +<UED64> \x9E\xE5 |0 # +<UED65> \x9E\xE6 |0 # +<UED66> \x9E\xE7 |0 # +<UED67> \x9E\xE8 |0 # +<UED68> \x9E\xE9 |0 # +<UED69> \x9E\xEA |0 # +<UED6A> \x9E\xEB |0 # +<UED6B> \x9E\xEC |0 # +<UED6C> \x9E\xED |0 # +<UED6D> \x9E\xEE |0 # +<UED6E> \x9E\xEF |0 # +<UED6F> \x9E\xF0 |0 # +<UED70> \x9E\xF1 |0 # +<UED71> \x9E\xF2 |0 # +<UED72> \x9E\xF3 |0 # +<UED73> \x9E\xF4 |0 # +<UED74> \x9E\xF5 |0 # +<UED75> \x9E\xF6 |0 # +<UED76> \x9E\xF7 |0 # +<UED77> \x9E\xF8 |0 # +<UED78> \x9E\xF9 |0 # +<UED79> \x9E\xFA |0 # +<UED7A> \x9E\xFB |0 # +<UED7B> \x9E\xFC |0 # +<UED7C> \x9E\xFD |0 # +<UED7D> \x9E\xFE |0 # +<UED7E> \x9F\x40 |0 # +<UED7F> \x9F\x41 |0 # +<UED80> \x9F\x42 |0 # +<UED81> \x9F\x43 |0 # +<UED82> \x9F\x44 |0 # +<UED83> \x9F\x45 |0 # +<UED84> \x9F\x46 |0 # +<UED85> \x9F\x47 |0 # +<UED86> \x9F\x48 |0 # +<UED87> \x9F\x49 |0 # +<UED88> \x9F\x4A |0 # +<UED89> \x9F\x4B |0 # +<UED8A> \x9F\x4C |0 # +<UED8B> \x9F\x4D |0 # +<UED8C> \x9F\x4E |0 # +<UED8D> \x9F\x4F |0 # +<UED8E> \x9F\x50 |0 # +<UED8F> \x9F\x51 |0 # +<UED90> \x9F\x52 |0 # +<UED91> \x9F\x53 |0 # +<UED92> \x9F\x54 |0 # +<UED93> \x9F\x55 |0 # +<UED94> \x9F\x56 |0 # +<UED95> \x9F\x57 |0 # +<UED96> \x9F\x58 |0 # +<UED97> \x9F\x59 |0 # +<UED98> \x9F\x5A |0 # +<UED99> \x9F\x5B |0 # +<UED9A> \x9F\x5C |0 # +<UED9B> \x9F\x5D |0 # +<UED9C> \x9F\x5E |0 # +<UED9D> \x9F\x5F |0 # +<UED9E> \x9F\x60 |0 # +<UED9F> \x9F\x61 |0 # +<UEDA0> \x9F\x62 |0 # +<UEDA1> \x9F\x63 |0 # +<UEDA2> \x9F\x64 |0 # +<UEDA3> \x9F\x65 |0 # +<UEDA4> \x9F\x66 |0 # +<UEDA5> \x9F\x67 |0 # +<UEDA6> \x9F\x68 |0 # +<UEDA7> \x9F\x69 |0 # +<UEDA8> \x9F\x6A |0 # +<UEDA9> \x9F\x6B |0 # +<UEDAA> \x9F\x6C |0 # +<UEDAB> \x9F\x6D |0 # +<UEDAC> \x9F\x6E |0 # +<UEDAD> \x9F\x6F |0 # +<UEDAE> \x9F\x70 |0 # +<UEDAF> \x9F\x71 |0 # +<UEDB0> \x9F\x72 |0 # +<UEDB1> \x9F\x73 |0 # +<UEDB2> \x9F\x74 |0 # +<UEDB3> \x9F\x75 |0 # +<UEDB4> \x9F\x76 |0 # +<UEDB5> \x9F\x77 |0 # +<UEDB6> \x9F\x78 |0 # +<UEDB7> \x9F\x79 |0 # +<UEDB8> \x9F\x7A |0 # +<UEDB9> \x9F\x7B |0 # +<UEDBA> \x9F\x7C |0 # +<UEDBB> \x9F\x7D |0 # +<UEDBC> \x9F\x7E |0 # +<UEDBD> \x9F\xA1 |0 # +<UEDBE> \x9F\xA2 |0 # +<UEDBF> \x9F\xA3 |0 # +<UEDC0> \x9F\xA4 |0 # +<UEDC1> \x9F\xA5 |0 # +<UEDC2> \x9F\xA6 |0 # +<UEDC3> \x9F\xA7 |0 # +<UEDC4> \x9F\xA8 |0 # +<UEDC5> \x9F\xA9 |0 # +<UEDC6> \x9F\xAA |0 # +<UEDC7> \x9F\xAB |0 # +<UEDC8> \x9F\xAC |0 # +<UEDC9> \x9F\xAD |0 # +<UEDCA> \x9F\xAE |0 # +<UEDCB> \x9F\xAF |0 # +<UEDCC> \x9F\xB0 |0 # +<UEDCD> \x9F\xB1 |0 # +<UEDCE> \x9F\xB2 |0 # +<UEDCF> \x9F\xB3 |0 # +<UEDD0> \x9F\xB4 |0 # +<UEDD1> \x9F\xB5 |0 # +<UEDD2> \x9F\xB6 |0 # +<UEDD3> \x9F\xB7 |0 # +<UEDD4> \x9F\xB8 |0 # +<UEDD5> \x9F\xB9 |0 # +<UEDD6> \x9F\xBA |0 # +<UEDD7> \x9F\xBB |0 # +<UEDD8> \x9F\xBC |0 # +<UEDD9> \x9F\xBD |0 # +<UEDDA> \x9F\xBE |0 # +<UEDDB> \x9F\xBF |0 # +<UEDDC> \x9F\xC0 |0 # +<UEDDD> \x9F\xC1 |0 # +<UEDDE> \x9F\xC2 |0 # +<UEDDF> \x9F\xC3 |0 # +<UEDE0> \x9F\xC4 |0 # +<UEDE1> \x9F\xC5 |0 # +<UEDE2> \x9F\xC6 |0 # +<UEDE3> \x9F\xC7 |0 # +<UEDE4> \x9F\xC8 |0 # +<UEDE5> \x9F\xC9 |0 # +<UEDE6> \x9F\xCA |0 # +<UEDE7> \x9F\xCB |0 # +<UEDE8> \x9F\xCC |0 # +<UEDE9> \x9F\xCD |0 # +<UEDEA> \x9F\xCE |0 # +<UEDEB> \x9F\xCF |0 # +<UEDEC> \x9F\xD0 |0 # +<UEDED> \x9F\xD1 |0 # +<UEDEE> \x9F\xD2 |0 # +<UEDEF> \x9F\xD3 |0 # +<UEDF0> \x9F\xD4 |0 # +<UEDF1> \x9F\xD5 |0 # +<UEDF2> \x9F\xD6 |0 # +<UEDF3> \x9F\xD7 |0 # +<UEDF4> \x9F\xD8 |0 # +<UEDF5> \x9F\xD9 |0 # +<UEDF6> \x9F\xDA |0 # +<UEDF7> \x9F\xDB |0 # +<UEDF8> \x9F\xDC |0 # +<UEDF9> \x9F\xDD |0 # +<UEDFA> \x9F\xDE |0 # +<UEDFB> \x9F\xDF |0 # +<UEDFC> \x9F\xE0 |0 # +<UEDFD> \x9F\xE1 |0 # +<UEDFE> \x9F\xE2 |0 # +<UEDFF> \x9F\xE3 |0 # +<UEE00> \x9F\xE4 |0 # +<UEE01> \x9F\xE5 |0 # +<UEE02> \x9F\xE6 |0 # +<UEE03> \x9F\xE7 |0 # +<UEE04> \x9F\xE8 |0 # +<UEE05> \x9F\xE9 |0 # +<UEE06> \x9F\xEA |0 # +<UEE07> \x9F\xEB |0 # +<UEE08> \x9F\xEC |0 # +<UEE09> \x9F\xED |0 # +<UEE0A> \x9F\xEE |0 # +<UEE0B> \x9F\xEF |0 # +<UEE0C> \x9F\xF0 |0 # +<UEE0D> \x9F\xF1 |0 # +<UEE0E> \x9F\xF2 |0 # +<UEE0F> \x9F\xF3 |0 # +<UEE10> \x9F\xF4 |0 # +<UEE11> \x9F\xF5 |0 # +<UEE12> \x9F\xF6 |0 # +<UEE13> \x9F\xF7 |0 # +<UEE14> \x9F\xF8 |0 # +<UEE15> \x9F\xF9 |0 # +<UEE16> \x9F\xFA |0 # +<UEE17> \x9F\xFB |0 # +<UEE18> \x9F\xFC |0 # +<UEE19> \x9F\xFD |0 # +<UEE1A> \x9F\xFE |0 # +<UEE1B> \xA0\x40 |0 # +<UEE1C> \xA0\x41 |0 # +<UEE1D> \xA0\x42 |0 # +<UEE1E> \xA0\x43 |0 # +<UEE1F> \xA0\x44 |0 # +<UEE20> \xA0\x45 |0 # +<UEE21> \xA0\x46 |0 # +<UEE22> \xA0\x47 |0 # +<UEE23> \xA0\x48 |0 # +<UEE24> \xA0\x49 |0 # +<UEE25> \xA0\x4A |0 # +<UEE26> \xA0\x4B |0 # +<UEE27> \xA0\x4C |0 # +<UEE28> \xA0\x4D |0 # +<UEE29> \xA0\x4E |0 # +<UEE2A> \xA0\x4F |0 # +<UEE2B> \xA0\x50 |0 # +<UEE2C> \xA0\x51 |0 # +<UEE2D> \xA0\x52 |0 # +<UEE2E> \xA0\x53 |0 # +<UEE2F> \xA0\x54 |0 # +<UEE30> \xA0\x55 |0 # +<UEE31> \xA0\x56 |0 # +<UEE32> \xA0\x57 |0 # +<UEE33> \xA0\x58 |0 # +<UEE34> \xA0\x59 |0 # +<UEE35> \xA0\x5A |0 # +<UEE36> \xA0\x5B |0 # +<UEE37> \xA0\x5C |0 # +<UEE38> \xA0\x5D |0 # +<UEE39> \xA0\x5E |0 # +<UEE3A> \xA0\x5F |0 # +<UEE3B> \xA0\x60 |0 # +<UEE3C> \xA0\x61 |0 # +<UEE3D> \xA0\x62 |0 # +<UEE3E> \xA0\x63 |0 # +<UEE3F> \xA0\x64 |0 # +<UEE40> \xA0\x65 |0 # +<UEE41> \xA0\x66 |0 # +<UEE42> \xA0\x67 |0 # +<UEE43> \xA0\x68 |0 # +<UEE44> \xA0\x69 |0 # +<UEE45> \xA0\x6A |0 # +<UEE46> \xA0\x6B |0 # +<UEE47> \xA0\x6C |0 # +<UEE48> \xA0\x6D |0 # +<UEE49> \xA0\x6E |0 # +<UEE4A> \xA0\x6F |0 # +<UEE4B> \xA0\x70 |0 # +<UEE4C> \xA0\x71 |0 # +<UEE4D> \xA0\x72 |0 # +<UEE4E> \xA0\x73 |0 # +<UEE4F> \xA0\x74 |0 # +<UEE50> \xA0\x75 |0 # +<UEE51> \xA0\x76 |0 # +<UEE52> \xA0\x77 |0 # +<UEE53> \xA0\x78 |0 # +<UEE54> \xA0\x79 |0 # +<UEE55> \xA0\x7A |0 # +<UEE56> \xA0\x7B |0 # +<UEE57> \xA0\x7C |0 # +<UEE58> \xA0\x7D |0 # +<UEE59> \xA0\x7E |0 # +<UEE5A> \xA0\xA1 |0 # +<UEE5B> \xA0\xA2 |0 # +<UEE5C> \xA0\xA3 |0 # +<UEE5D> \xA0\xA4 |0 # +<UEE5E> \xA0\xA5 |0 # +<UEE5F> \xA0\xA6 |0 # +<UEE60> \xA0\xA7 |0 # +<UEE61> \xA0\xA8 |0 # +<UEE62> \xA0\xA9 |0 # +<UEE63> \xA0\xAA |0 # +<UEE64> \xA0\xAB |0 # +<UEE65> \xA0\xAC |0 # +<UEE66> \xA0\xAD |0 # +<UEE67> \xA0\xAE |0 # +<UEE68> \xA0\xAF |0 # +<UEE69> \xA0\xB0 |0 # +<UEE6A> \xA0\xB1 |0 # +<UEE6B> \xA0\xB2 |0 # +<UEE6C> \xA0\xB3 |0 # +<UEE6D> \xA0\xB4 |0 # +<UEE6E> \xA0\xB5 |0 # +<UEE6F> \xA0\xB6 |0 # +<UEE70> \xA0\xB7 |0 # +<UEE71> \xA0\xB8 |0 # +<UEE72> \xA0\xB9 |0 # +<UEE73> \xA0\xBA |0 # +<UEE74> \xA0\xBB |0 # +<UEE75> \xA0\xBC |0 # +<UEE76> \xA0\xBD |0 # +<UEE77> \xA0\xBE |0 # +<UEE78> \xA0\xBF |0 # +<UEE79> \xA0\xC0 |0 # +<UEE7A> \xA0\xC1 |0 # +<UEE7B> \xA0\xC2 |0 # +<UEE7C> \xA0\xC3 |0 # +<UEE7D> \xA0\xC4 |0 # +<UEE7E> \xA0\xC5 |0 # +<UEE7F> \xA0\xC6 |0 # +<UEE80> \xA0\xC7 |0 # +<UEE81> \xA0\xC8 |0 # +<UEE82> \xA0\xC9 |0 # +<UEE83> \xA0\xCA |0 # +<UEE84> \xA0\xCB |0 # +<UEE85> \xA0\xCC |0 # +<UEE86> \xA0\xCD |0 # +<UEE87> \xA0\xCE |0 # +<UEE88> \xA0\xCF |0 # +<UEE89> \xA0\xD0 |0 # +<UEE8A> \xA0\xD1 |0 # +<UEE8B> \xA0\xD2 |0 # +<UEE8C> \xA0\xD3 |0 # +<UEE8D> \xA0\xD4 |0 # +<UEE8E> \xA0\xD5 |0 # +<UEE8F> \xA0\xD6 |0 # +<UEE90> \xA0\xD7 |0 # +<UEE91> \xA0\xD8 |0 # +<UEE92> \xA0\xD9 |0 # +<UEE93> \xA0\xDA |0 # +<UEE94> \xA0\xDB |0 # +<UEE95> \xA0\xDC |0 # +<UEE96> \xA0\xDD |0 # +<UEE97> \xA0\xDE |0 # +<UEE98> \xA0\xDF |0 # +<UEE99> \xA0\xE0 |0 # +<UEE9A> \xA0\xE1 |0 # +<UEE9B> \xA0\xE2 |0 # +<UEE9C> \xA0\xE3 |0 # +<UEE9D> \xA0\xE4 |0 # +<UEE9E> \xA0\xE5 |0 # +<UEE9F> \xA0\xE6 |0 # +<UEEA0> \xA0\xE7 |0 # +<UEEA1> \xA0\xE8 |0 # +<UEEA2> \xA0\xE9 |0 # +<UEEA3> \xA0\xEA |0 # +<UEEA4> \xA0\xEB |0 # +<UEEA5> \xA0\xEC |0 # +<UEEA6> \xA0\xED |0 # +<UEEA7> \xA0\xEE |0 # +<UEEA8> \xA0\xEF |0 # +<UEEA9> \xA0\xF0 |0 # +<UEEAA> \xA0\xF1 |0 # +<UEEAB> \xA0\xF2 |0 # +<UEEAC> \xA0\xF3 |0 # +<UEEAD> \xA0\xF4 |0 # +<UEEAE> \xA0\xF5 |0 # +<UEEAF> \xA0\xF6 |0 # +<UEEB0> \xA0\xF7 |0 # +<UEEB1> \xA0\xF8 |0 # +<UEEB2> \xA0\xF9 |0 # +<UEEB3> \xA0\xFA |0 # +<UEEB4> \xA0\xFB |0 # +<UEEB5> \xA0\xFC |0 # +<UEEB6> \xA0\xFD |0 # +<UEEB7> \xA0\xFE |0 # +<UEEB8> \x81\x40 |0 # +<UEEB9> \x81\x41 |0 # +<UEEBA> \x81\x42 |0 # +<UEEBB> \x81\x43 |0 # +<UEEBC> \x81\x44 |0 # +<UEEBD> \x81\x45 |0 # +<UEEBE> \x81\x46 |0 # +<UEEBF> \x81\x47 |0 # +<UEEC0> \x81\x48 |0 # +<UEEC1> \x81\x49 |0 # +<UEEC2> \x81\x4A |0 # +<UEEC3> \x81\x4B |0 # +<UEEC4> \x81\x4C |0 # +<UEEC5> \x81\x4D |0 # +<UEEC6> \x81\x4E |0 # +<UEEC7> \x81\x4F |0 # +<UEEC8> \x81\x50 |0 # +<UEEC9> \x81\x51 |0 # +<UEECA> \x81\x52 |0 # +<UEECB> \x81\x53 |0 # +<UEECC> \x81\x54 |0 # +<UEECD> \x81\x55 |0 # +<UEECE> \x81\x56 |0 # +<UEECF> \x81\x57 |0 # +<UEED0> \x81\x58 |0 # +<UEED1> \x81\x59 |0 # +<UEED2> \x81\x5A |0 # +<UEED3> \x81\x5B |0 # +<UEED4> \x81\x5C |0 # +<UEED5> \x81\x5D |0 # +<UEED6> \x81\x5E |0 # +<UEED7> \x81\x5F |0 # +<UEED8> \x81\x60 |0 # +<UEED9> \x81\x61 |0 # +<UEEDA> \x81\x62 |0 # +<UEEDB> \x81\x63 |0 # +<UEEDC> \x81\x64 |0 # +<UEEDD> \x81\x65 |0 # +<UEEDE> \x81\x66 |0 # +<UEEDF> \x81\x67 |0 # +<UEEE0> \x81\x68 |0 # +<UEEE1> \x81\x69 |0 # +<UEEE2> \x81\x6A |0 # +<UEEE3> \x81\x6B |0 # +<UEEE4> \x81\x6C |0 # +<UEEE5> \x81\x6D |0 # +<UEEE6> \x81\x6E |0 # +<UEEE7> \x81\x6F |0 # +<UEEE8> \x81\x70 |0 # +<UEEE9> \x81\x71 |0 # +<UEEEA> \x81\x72 |0 # +<UEEEB> \x81\x73 |0 # +<UEEEC> \x81\x74 |0 # +<UEEED> \x81\x75 |0 # +<UEEEE> \x81\x76 |0 # +<UEEEF> \x81\x77 |0 # +<UEEF0> \x81\x78 |0 # +<UEEF1> \x81\x79 |0 # +<UEEF2> \x81\x7A |0 # +<UEEF3> \x81\x7B |0 # +<UEEF4> \x81\x7C |0 # +<UEEF5> \x81\x7D |0 # +<UEEF6> \x81\x7E |0 # +<UEEF7> \x81\xA1 |0 # +<UEEF8> \x81\xA2 |0 # +<UEEF9> \x81\xA3 |0 # +<UEEFA> \x81\xA4 |0 # +<UEEFB> \x81\xA5 |0 # +<UEEFC> \x81\xA6 |0 # +<UEEFD> \x81\xA7 |0 # +<UEEFE> \x81\xA8 |0 # +<UEEFF> \x81\xA9 |0 # +<UEF00> \x81\xAA |0 # +<UEF01> \x81\xAB |0 # +<UEF02> \x81\xAC |0 # +<UEF03> \x81\xAD |0 # +<UEF04> \x81\xAE |0 # +<UEF05> \x81\xAF |0 # +<UEF06> \x81\xB0 |0 # +<UEF07> \x81\xB1 |0 # +<UEF08> \x81\xB2 |0 # +<UEF09> \x81\xB3 |0 # +<UEF0A> \x81\xB4 |0 # +<UEF0B> \x81\xB5 |0 # +<UEF0C> \x81\xB6 |0 # +<UEF0D> \x81\xB7 |0 # +<UEF0E> \x81\xB8 |0 # +<UEF0F> \x81\xB9 |0 # +<UEF10> \x81\xBA |0 # +<UEF11> \x81\xBB |0 # +<UEF12> \x81\xBC |0 # +<UEF13> \x81\xBD |0 # +<UEF14> \x81\xBE |0 # +<UEF15> \x81\xBF |0 # +<UEF16> \x81\xC0 |0 # +<UEF17> \x81\xC1 |0 # +<UEF18> \x81\xC2 |0 # +<UEF19> \x81\xC3 |0 # +<UEF1A> \x81\xC4 |0 # +<UEF1B> \x81\xC5 |0 # +<UEF1C> \x81\xC6 |0 # +<UEF1D> \x81\xC7 |0 # +<UEF1E> \x81\xC8 |0 # +<UEF1F> \x81\xC9 |0 # +<UEF20> \x81\xCA |0 # +<UEF21> \x81\xCB |0 # +<UEF22> \x81\xCC |0 # +<UEF23> \x81\xCD |0 # +<UEF24> \x81\xCE |0 # +<UEF25> \x81\xCF |0 # +<UEF26> \x81\xD0 |0 # +<UEF27> \x81\xD1 |0 # +<UEF28> \x81\xD2 |0 # +<UEF29> \x81\xD3 |0 # +<UEF2A> \x81\xD4 |0 # +<UEF2B> \x81\xD5 |0 # +<UEF2C> \x81\xD6 |0 # +<UEF2D> \x81\xD7 |0 # +<UEF2E> \x81\xD8 |0 # +<UEF2F> \x81\xD9 |0 # +<UEF30> \x81\xDA |0 # +<UEF31> \x81\xDB |0 # +<UEF32> \x81\xDC |0 # +<UEF33> \x81\xDD |0 # +<UEF34> \x81\xDE |0 # +<UEF35> \x81\xDF |0 # +<UEF36> \x81\xE0 |0 # +<UEF37> \x81\xE1 |0 # +<UEF38> \x81\xE2 |0 # +<UEF39> \x81\xE3 |0 # +<UEF3A> \x81\xE4 |0 # +<UEF3B> \x81\xE5 |0 # +<UEF3C> \x81\xE6 |0 # +<UEF3D> \x81\xE7 |0 # +<UEF3E> \x81\xE8 |0 # +<UEF3F> \x81\xE9 |0 # +<UEF40> \x81\xEA |0 # +<UEF41> \x81\xEB |0 # +<UEF42> \x81\xEC |0 # +<UEF43> \x81\xED |0 # +<UEF44> \x81\xEE |0 # +<UEF45> \x81\xEF |0 # +<UEF46> \x81\xF0 |0 # +<UEF47> \x81\xF1 |0 # +<UEF48> \x81\xF2 |0 # +<UEF49> \x81\xF3 |0 # +<UEF4A> \x81\xF4 |0 # +<UEF4B> \x81\xF5 |0 # +<UEF4C> \x81\xF6 |0 # +<UEF4D> \x81\xF7 |0 # +<UEF4E> \x81\xF8 |0 # +<UEF4F> \x81\xF9 |0 # +<UEF50> \x81\xFA |0 # +<UEF51> \x81\xFB |0 # +<UEF52> \x81\xFC |0 # +<UEF53> \x81\xFD |0 # +<UEF54> \x81\xFE |0 # +<UEF55> \x82\x40 |0 # +<UEF56> \x82\x41 |0 # +<UEF57> \x82\x42 |0 # +<UEF58> \x82\x43 |0 # +<UEF59> \x82\x44 |0 # +<UEF5A> \x82\x45 |0 # +<UEF5B> \x82\x46 |0 # +<UEF5C> \x82\x47 |0 # +<UEF5D> \x82\x48 |0 # +<UEF5E> \x82\x49 |0 # +<UEF5F> \x82\x4A |0 # +<UEF60> \x82\x4B |0 # +<UEF61> \x82\x4C |0 # +<UEF62> \x82\x4D |0 # +<UEF63> \x82\x4E |0 # +<UEF64> \x82\x4F |0 # +<UEF65> \x82\x50 |0 # +<UEF66> \x82\x51 |0 # +<UEF67> \x82\x52 |0 # +<UEF68> \x82\x53 |0 # +<UEF69> \x82\x54 |0 # +<UEF6A> \x82\x55 |0 # +<UEF6B> \x82\x56 |0 # +<UEF6C> \x82\x57 |0 # +<UEF6D> \x82\x58 |0 # +<UEF6E> \x82\x59 |0 # +<UEF6F> \x82\x5A |0 # +<UEF70> \x82\x5B |0 # +<UEF71> \x82\x5C |0 # +<UEF72> \x82\x5D |0 # +<UEF73> \x82\x5E |0 # +<UEF74> \x82\x5F |0 # +<UEF75> \x82\x60 |0 # +<UEF76> \x82\x61 |0 # +<UEF77> \x82\x62 |0 # +<UEF78> \x82\x63 |0 # +<UEF79> \x82\x64 |0 # +<UEF7A> \x82\x65 |0 # +<UEF7B> \x82\x66 |0 # +<UEF7C> \x82\x67 |0 # +<UEF7D> \x82\x68 |0 # +<UEF7E> \x82\x69 |0 # +<UEF7F> \x82\x6A |0 # +<UEF80> \x82\x6B |0 # +<UEF81> \x82\x6C |0 # +<UEF82> \x82\x6D |0 # +<UEF83> \x82\x6E |0 # +<UEF84> \x82\x6F |0 # +<UEF85> \x82\x70 |0 # +<UEF86> \x82\x71 |0 # +<UEF87> \x82\x72 |0 # +<UEF88> \x82\x73 |0 # +<UEF89> \x82\x74 |0 # +<UEF8A> \x82\x75 |0 # +<UEF8B> \x82\x76 |0 # +<UEF8C> \x82\x77 |0 # +<UEF8D> \x82\x78 |0 # +<UEF8E> \x82\x79 |0 # +<UEF8F> \x82\x7A |0 # +<UEF90> \x82\x7B |0 # +<UEF91> \x82\x7C |0 # +<UEF92> \x82\x7D |0 # +<UEF93> \x82\x7E |0 # +<UEF94> \x82\xA1 |0 # +<UEF95> \x82\xA2 |0 # +<UEF96> \x82\xA3 |0 # +<UEF97> \x82\xA4 |0 # +<UEF98> \x82\xA5 |0 # +<UEF99> \x82\xA6 |0 # +<UEF9A> \x82\xA7 |0 # +<UEF9B> \x82\xA8 |0 # +<UEF9C> \x82\xA9 |0 # +<UEF9D> \x82\xAA |0 # +<UEF9E> \x82\xAB |0 # +<UEF9F> \x82\xAC |0 # +<UEFA0> \x82\xAD |0 # +<UEFA1> \x82\xAE |0 # +<UEFA2> \x82\xAF |0 # +<UEFA3> \x82\xB0 |0 # +<UEFA4> \x82\xB1 |0 # +<UEFA5> \x82\xB2 |0 # +<UEFA6> \x82\xB3 |0 # +<UEFA7> \x82\xB4 |0 # +<UEFA8> \x82\xB5 |0 # +<UEFA9> \x82\xB6 |0 # +<UEFAA> \x82\xB7 |0 # +<UEFAB> \x82\xB8 |0 # +<UEFAC> \x82\xB9 |0 # +<UEFAD> \x82\xBA |0 # +<UEFAE> \x82\xBB |0 # +<UEFAF> \x82\xBC |0 # +<UEFB0> \x82\xBD |0 # +<UEFB1> \x82\xBE |0 # +<UEFB2> \x82\xBF |0 # +<UEFB3> \x82\xC0 |0 # +<UEFB4> \x82\xC1 |0 # +<UEFB5> \x82\xC2 |0 # +<UEFB6> \x82\xC3 |0 # +<UEFB7> \x82\xC4 |0 # +<UEFB8> \x82\xC5 |0 # +<UEFB9> \x82\xC6 |0 # +<UEFBA> \x82\xC7 |0 # +<UEFBB> \x82\xC8 |0 # +<UEFBC> \x82\xC9 |0 # +<UEFBD> \x82\xCA |0 # +<UEFBE> \x82\xCB |0 # +<UEFBF> \x82\xCC |0 # +<UEFC0> \x82\xCD |0 # +<UEFC1> \x82\xCE |0 # +<UEFC2> \x82\xCF |0 # +<UEFC3> \x82\xD0 |0 # +<UEFC4> \x82\xD1 |0 # +<UEFC5> \x82\xD2 |0 # +<UEFC6> \x82\xD3 |0 # +<UEFC7> \x82\xD4 |0 # +<UEFC8> \x82\xD5 |0 # +<UEFC9> \x82\xD6 |0 # +<UEFCA> \x82\xD7 |0 # +<UEFCB> \x82\xD8 |0 # +<UEFCC> \x82\xD9 |0 # +<UEFCD> \x82\xDA |0 # +<UEFCE> \x82\xDB |0 # +<UEFCF> \x82\xDC |0 # +<UEFD0> \x82\xDD |0 # +<UEFD1> \x82\xDE |0 # +<UEFD2> \x82\xDF |0 # +<UEFD3> \x82\xE0 |0 # +<UEFD4> \x82\xE1 |0 # +<UEFD5> \x82\xE2 |0 # +<UEFD6> \x82\xE3 |0 # +<UEFD7> \x82\xE4 |0 # +<UEFD8> \x82\xE5 |0 # +<UEFD9> \x82\xE6 |0 # +<UEFDA> \x82\xE7 |0 # +<UEFDB> \x82\xE8 |0 # +<UEFDC> \x82\xE9 |0 # +<UEFDD> \x82\xEA |0 # +<UEFDE> \x82\xEB |0 # +<UEFDF> \x82\xEC |0 # +<UEFE0> \x82\xED |0 # +<UEFE1> \x82\xEE |0 # +<UEFE2> \x82\xEF |0 # +<UEFE3> \x82\xF0 |0 # +<UEFE4> \x82\xF1 |0 # +<UEFE5> \x82\xF2 |0 # +<UEFE6> \x82\xF3 |0 # +<UEFE7> \x82\xF4 |0 # +<UEFE8> \x82\xF5 |0 # +<UEFE9> \x82\xF6 |0 # +<UEFEA> \x82\xF7 |0 # +<UEFEB> \x82\xF8 |0 # +<UEFEC> \x82\xF9 |0 # +<UEFED> \x82\xFA |0 # +<UEFEE> \x82\xFB |0 # +<UEFEF> \x82\xFC |0 # +<UEFF0> \x82\xFD |0 # +<UEFF1> \x82\xFE |0 # +<UEFF2> \x83\x40 |0 # +<UEFF3> \x83\x41 |0 # +<UEFF4> \x83\x42 |0 # +<UEFF5> \x83\x43 |0 # +<UEFF6> \x83\x44 |0 # +<UEFF7> \x83\x45 |0 # +<UEFF8> \x83\x46 |0 # +<UEFF9> \x83\x47 |0 # +<UEFFA> \x83\x48 |0 # +<UEFFB> \x83\x49 |0 # +<UEFFC> \x83\x4A |0 # +<UEFFD> \x83\x4B |0 # +<UEFFE> \x83\x4C |0 # +<UEFFF> \x83\x4D |0 # +<UF000> \x83\x4E |0 # +<UF001> \x83\x4F |0 # +<UF002> \x83\x50 |0 # +<UF003> \x83\x51 |0 # +<UF004> \x83\x52 |0 # +<UF005> \x83\x53 |0 # +<UF006> \x83\x54 |0 # +<UF007> \x83\x55 |0 # +<UF008> \x83\x56 |0 # +<UF009> \x83\x57 |0 # +<UF00A> \x83\x58 |0 # +<UF00B> \x83\x59 |0 # +<UF00C> \x83\x5A |0 # +<UF00D> \x83\x5B |0 # +<UF00E> \x83\x5C |0 # +<UF00F> \x83\x5D |0 # +<UF010> \x83\x5E |0 # +<UF011> \x83\x5F |0 # +<UF012> \x83\x60 |0 # +<UF013> \x83\x61 |0 # +<UF014> \x83\x62 |0 # +<UF015> \x83\x63 |0 # +<UF016> \x83\x64 |0 # +<UF017> \x83\x65 |0 # +<UF018> \x83\x66 |0 # +<UF019> \x83\x67 |0 # +<UF01A> \x83\x68 |0 # +<UF01B> \x83\x69 |0 # +<UF01C> \x83\x6A |0 # +<UF01D> \x83\x6B |0 # +<UF01E> \x83\x6C |0 # +<UF01F> \x83\x6D |0 # +<UF020> \x83\x6E |0 # +<UF021> \x83\x6F |0 # +<UF022> \x83\x70 |0 # +<UF023> \x83\x71 |0 # +<UF024> \x83\x72 |0 # +<UF025> \x83\x73 |0 # +<UF026> \x83\x74 |0 # +<UF027> \x83\x75 |0 # +<UF028> \x83\x76 |0 # +<UF029> \x83\x77 |0 # +<UF02A> \x83\x78 |0 # +<UF02B> \x83\x79 |0 # +<UF02C> \x83\x7A |0 # +<UF02D> \x83\x7B |0 # +<UF02E> \x83\x7C |0 # +<UF02F> \x83\x7D |0 # +<UF030> \x83\x7E |0 # +<UF031> \x83\xA1 |0 # +<UF032> \x83\xA2 |0 # +<UF033> \x83\xA3 |0 # +<UF034> \x83\xA4 |0 # +<UF035> \x83\xA5 |0 # +<UF036> \x83\xA6 |0 # +<UF037> \x83\xA7 |0 # +<UF038> \x83\xA8 |0 # +<UF039> \x83\xA9 |0 # +<UF03A> \x83\xAA |0 # +<UF03B> \x83\xAB |0 # +<UF03C> \x83\xAC |0 # +<UF03D> \x83\xAD |0 # +<UF03E> \x83\xAE |0 # +<UF03F> \x83\xAF |0 # +<UF040> \x83\xB0 |0 # +<UF041> \x83\xB1 |0 # +<UF042> \x83\xB2 |0 # +<UF043> \x83\xB3 |0 # +<UF044> \x83\xB4 |0 # +<UF045> \x83\xB5 |0 # +<UF046> \x83\xB6 |0 # +<UF047> \x83\xB7 |0 # +<UF048> \x83\xB8 |0 # +<UF049> \x83\xB9 |0 # +<UF04A> \x83\xBA |0 # +<UF04B> \x83\xBB |0 # +<UF04C> \x83\xBC |0 # +<UF04D> \x83\xBD |0 # +<UF04E> \x83\xBE |0 # +<UF04F> \x83\xBF |0 # +<UF050> \x83\xC0 |0 # +<UF051> \x83\xC1 |0 # +<UF052> \x83\xC2 |0 # +<UF053> \x83\xC3 |0 # +<UF054> \x83\xC4 |0 # +<UF055> \x83\xC5 |0 # +<UF056> \x83\xC6 |0 # +<UF057> \x83\xC7 |0 # +<UF058> \x83\xC8 |0 # +<UF059> \x83\xC9 |0 # +<UF05A> \x83\xCA |0 # +<UF05B> \x83\xCB |0 # +<UF05C> \x83\xCC |0 # +<UF05D> \x83\xCD |0 # +<UF05E> \x83\xCE |0 # +<UF05F> \x83\xCF |0 # +<UF060> \x83\xD0 |0 # +<UF061> \x83\xD1 |0 # +<UF062> \x83\xD2 |0 # +<UF063> \x83\xD3 |0 # +<UF064> \x83\xD4 |0 # +<UF065> \x83\xD5 |0 # +<UF066> \x83\xD6 |0 # +<UF067> \x83\xD7 |0 # +<UF068> \x83\xD8 |0 # +<UF069> \x83\xD9 |0 # +<UF06A> \x83\xDA |0 # +<UF06B> \x83\xDB |0 # +<UF06C> \x83\xDC |0 # +<UF06D> \x83\xDD |0 # +<UF06E> \x83\xDE |0 # +<UF06F> \x83\xDF |0 # +<UF070> \x83\xE0 |0 # +<UF071> \x83\xE1 |0 # +<UF072> \x83\xE2 |0 # +<UF073> \x83\xE3 |0 # +<UF074> \x83\xE4 |0 # +<UF075> \x83\xE5 |0 # +<UF076> \x83\xE6 |0 # +<UF077> \x83\xE7 |0 # +<UF078> \x83\xE8 |0 # +<UF079> \x83\xE9 |0 # +<UF07A> \x83\xEA |0 # +<UF07B> \x83\xEB |0 # +<UF07C> \x83\xEC |0 # +<UF07D> \x83\xED |0 # +<UF07E> \x83\xEE |0 # +<UF07F> \x83\xEF |0 # +<UF080> \x83\xF0 |0 # +<UF081> \x83\xF1 |0 # +<UF082> \x83\xF2 |0 # +<UF083> \x83\xF3 |0 # +<UF084> \x83\xF4 |0 # +<UF085> \x83\xF5 |0 # +<UF086> \x83\xF6 |0 # +<UF087> \x83\xF7 |0 # +<UF088> \x83\xF8 |0 # +<UF089> \x83\xF9 |0 # +<UF08A> \x83\xFA |0 # +<UF08B> \x83\xFB |0 # +<UF08C> \x83\xFC |0 # +<UF08D> \x83\xFD |0 # +<UF08E> \x83\xFE |0 # +<UF08F> \x84\x40 |0 # +<UF090> \x84\x41 |0 # +<UF091> \x84\x42 |0 # +<UF092> \x84\x43 |0 # +<UF093> \x84\x44 |0 # +<UF094> \x84\x45 |0 # +<UF095> \x84\x46 |0 # +<UF096> \x84\x47 |0 # +<UF097> \x84\x48 |0 # +<UF098> \x84\x49 |0 # +<UF099> \x84\x4A |0 # +<UF09A> \x84\x4B |0 # +<UF09B> \x84\x4C |0 # +<UF09C> \x84\x4D |0 # +<UF09D> \x84\x4E |0 # +<UF09E> \x84\x4F |0 # +<UF09F> \x84\x50 |0 # +<UF0A0> \x84\x51 |0 # +<UF0A1> \x84\x52 |0 # +<UF0A2> \x84\x53 |0 # +<UF0A3> \x84\x54 |0 # +<UF0A4> \x84\x55 |0 # +<UF0A5> \x84\x56 |0 # +<UF0A6> \x84\x57 |0 # +<UF0A7> \x84\x58 |0 # +<UF0A8> \x84\x59 |0 # +<UF0A9> \x84\x5A |0 # +<UF0AA> \x84\x5B |0 # +<UF0AB> \x84\x5C |0 # +<UF0AC> \x84\x5D |0 # +<UF0AD> \x84\x5E |0 # +<UF0AE> \x84\x5F |0 # +<UF0AF> \x84\x60 |0 # +<UF0B0> \x84\x61 |0 # +<UF0B1> \x84\x62 |0 # +<UF0B2> \x84\x63 |0 # +<UF0B3> \x84\x64 |0 # +<UF0B4> \x84\x65 |0 # +<UF0B5> \x84\x66 |0 # +<UF0B6> \x84\x67 |0 # +<UF0B7> \x84\x68 |0 # +<UF0B8> \x84\x69 |0 # +<UF0B9> \x84\x6A |0 # +<UF0BA> \x84\x6B |0 # +<UF0BB> \x84\x6C |0 # +<UF0BC> \x84\x6D |0 # +<UF0BD> \x84\x6E |0 # +<UF0BE> \x84\x6F |0 # +<UF0BF> \x84\x70 |0 # +<UF0C0> \x84\x71 |0 # +<UF0C1> \x84\x72 |0 # +<UF0C2> \x84\x73 |0 # +<UF0C3> \x84\x74 |0 # +<UF0C4> \x84\x75 |0 # +<UF0C5> \x84\x76 |0 # +<UF0C6> \x84\x77 |0 # +<UF0C7> \x84\x78 |0 # +<UF0C8> \x84\x79 |0 # +<UF0C9> \x84\x7A |0 # +<UF0CA> \x84\x7B |0 # +<UF0CB> \x84\x7C |0 # +<UF0CC> \x84\x7D |0 # +<UF0CD> \x84\x7E |0 # +<UF0CE> \x84\xA1 |0 # +<UF0CF> \x84\xA2 |0 # +<UF0D0> \x84\xA3 |0 # +<UF0D1> \x84\xA4 |0 # +<UF0D2> \x84\xA5 |0 # +<UF0D3> \x84\xA6 |0 # +<UF0D4> \x84\xA7 |0 # +<UF0D5> \x84\xA8 |0 # +<UF0D6> \x84\xA9 |0 # +<UF0D7> \x84\xAA |0 # +<UF0D8> \x84\xAB |0 # +<UF0D9> \x84\xAC |0 # +<UF0DA> \x84\xAD |0 # +<UF0DB> \x84\xAE |0 # +<UF0DC> \x84\xAF |0 # +<UF0DD> \x84\xB0 |0 # +<UF0DE> \x84\xB1 |0 # +<UF0DF> \x84\xB2 |0 # +<UF0E0> \x84\xB3 |0 # +<UF0E1> \x84\xB4 |0 # +<UF0E2> \x84\xB5 |0 # +<UF0E3> \x84\xB6 |0 # +<UF0E4> \x84\xB7 |0 # +<UF0E5> \x84\xB8 |0 # +<UF0E6> \x84\xB9 |0 # +<UF0E7> \x84\xBA |0 # +<UF0E8> \x84\xBB |0 # +<UF0E9> \x84\xBC |0 # +<UF0EA> \x84\xBD |0 # +<UF0EB> \x84\xBE |0 # +<UF0EC> \x84\xBF |0 # +<UF0ED> \x84\xC0 |0 # +<UF0EE> \x84\xC1 |0 # +<UF0EF> \x84\xC2 |0 # +<UF0F0> \x84\xC3 |0 # +<UF0F1> \x84\xC4 |0 # +<UF0F2> \x84\xC5 |0 # +<UF0F3> \x84\xC6 |0 # +<UF0F4> \x84\xC7 |0 # +<UF0F5> \x84\xC8 |0 # +<UF0F6> \x84\xC9 |0 # +<UF0F7> \x84\xCA |0 # +<UF0F8> \x84\xCB |0 # +<UF0F9> \x84\xCC |0 # +<UF0FA> \x84\xCD |0 # +<UF0FB> \x84\xCE |0 # +<UF0FC> \x84\xCF |0 # +<UF0FD> \x84\xD0 |0 # +<UF0FE> \x84\xD1 |0 # +<UF0FF> \x84\xD2 |0 # +<UF100> \x84\xD3 |0 # +<UF101> \x84\xD4 |0 # +<UF102> \x84\xD5 |0 # +<UF103> \x84\xD6 |0 # +<UF104> \x84\xD7 |0 # +<UF105> \x84\xD8 |0 # +<UF106> \x84\xD9 |0 # +<UF107> \x84\xDA |0 # +<UF108> \x84\xDB |0 # +<UF109> \x84\xDC |0 # +<UF10A> \x84\xDD |0 # +<UF10B> \x84\xDE |0 # +<UF10C> \x84\xDF |0 # +<UF10D> \x84\xE0 |0 # +<UF10E> \x84\xE1 |0 # +<UF10F> \x84\xE2 |0 # +<UF110> \x84\xE3 |0 # +<UF111> \x84\xE4 |0 # +<UF112> \x84\xE5 |0 # +<UF113> \x84\xE6 |0 # +<UF114> \x84\xE7 |0 # +<UF115> \x84\xE8 |0 # +<UF116> \x84\xE9 |0 # +<UF117> \x84\xEA |0 # +<UF118> \x84\xEB |0 # +<UF119> \x84\xEC |0 # +<UF11A> \x84\xED |0 # +<UF11B> \x84\xEE |0 # +<UF11C> \x84\xEF |0 # +<UF11D> \x84\xF0 |0 # +<UF11E> \x84\xF1 |0 # +<UF11F> \x84\xF2 |0 # +<UF120> \x84\xF3 |0 # +<UF121> \x84\xF4 |0 # +<UF122> \x84\xF5 |0 # +<UF123> \x84\xF6 |0 # +<UF124> \x84\xF7 |0 # +<UF125> \x84\xF8 |0 # +<UF126> \x84\xF9 |0 # +<UF127> \x84\xFA |0 # +<UF128> \x84\xFB |0 # +<UF129> \x84\xFC |0 # +<UF12A> \x84\xFD |0 # +<UF12B> \x84\xFE |0 # +<UF12C> \x85\x40 |0 # +<UF12D> \x85\x41 |0 # +<UF12E> \x85\x42 |0 # +<UF12F> \x85\x43 |0 # +<UF130> \x85\x44 |0 # +<UF131> \x85\x45 |0 # +<UF132> \x85\x46 |0 # +<UF133> \x85\x47 |0 # +<UF134> \x85\x48 |0 # +<UF135> \x85\x49 |0 # +<UF136> \x85\x4A |0 # +<UF137> \x85\x4B |0 # +<UF138> \x85\x4C |0 # +<UF139> \x85\x4D |0 # +<UF13A> \x85\x4E |0 # +<UF13B> \x85\x4F |0 # +<UF13C> \x85\x50 |0 # +<UF13D> \x85\x51 |0 # +<UF13E> \x85\x52 |0 # +<UF13F> \x85\x53 |0 # +<UF140> \x85\x54 |0 # +<UF141> \x85\x55 |0 # +<UF142> \x85\x56 |0 # +<UF143> \x85\x57 |0 # +<UF144> \x85\x58 |0 # +<UF145> \x85\x59 |0 # +<UF146> \x85\x5A |0 # +<UF147> \x85\x5B |0 # +<UF148> \x85\x5C |0 # +<UF149> \x85\x5D |0 # +<UF14A> \x85\x5E |0 # +<UF14B> \x85\x5F |0 # +<UF14C> \x85\x60 |0 # +<UF14D> \x85\x61 |0 # +<UF14E> \x85\x62 |0 # +<UF14F> \x85\x63 |0 # +<UF150> \x85\x64 |0 # +<UF151> \x85\x65 |0 # +<UF152> \x85\x66 |0 # +<UF153> \x85\x67 |0 # +<UF154> \x85\x68 |0 # +<UF155> \x85\x69 |0 # +<UF156> \x85\x6A |0 # +<UF157> \x85\x6B |0 # +<UF158> \x85\x6C |0 # +<UF159> \x85\x6D |0 # +<UF15A> \x85\x6E |0 # +<UF15B> \x85\x6F |0 # +<UF15C> \x85\x70 |0 # +<UF15D> \x85\x71 |0 # +<UF15E> \x85\x72 |0 # +<UF15F> \x85\x73 |0 # +<UF160> \x85\x74 |0 # +<UF161> \x85\x75 |0 # +<UF162> \x85\x76 |0 # +<UF163> \x85\x77 |0 # +<UF164> \x85\x78 |0 # +<UF165> \x85\x79 |0 # +<UF166> \x85\x7A |0 # +<UF167> \x85\x7B |0 # +<UF168> \x85\x7C |0 # +<UF169> \x85\x7D |0 # +<UF16A> \x85\x7E |0 # +<UF16B> \x85\xA1 |0 # +<UF16C> \x85\xA2 |0 # +<UF16D> \x85\xA3 |0 # +<UF16E> \x85\xA4 |0 # +<UF16F> \x85\xA5 |0 # +<UF170> \x85\xA6 |0 # +<UF171> \x85\xA7 |0 # +<UF172> \x85\xA8 |0 # +<UF173> \x85\xA9 |0 # +<UF174> \x85\xAA |0 # +<UF175> \x85\xAB |0 # +<UF176> \x85\xAC |0 # +<UF177> \x85\xAD |0 # +<UF178> \x85\xAE |0 # +<UF179> \x85\xAF |0 # +<UF17A> \x85\xB0 |0 # +<UF17B> \x85\xB1 |0 # +<UF17C> \x85\xB2 |0 # +<UF17D> \x85\xB3 |0 # +<UF17E> \x85\xB4 |0 # +<UF17F> \x85\xB5 |0 # +<UF180> \x85\xB6 |0 # +<UF181> \x85\xB7 |0 # +<UF182> \x85\xB8 |0 # +<UF183> \x85\xB9 |0 # +<UF184> \x85\xBA |0 # +<UF185> \x85\xBB |0 # +<UF186> \x85\xBC |0 # +<UF187> \x85\xBD |0 # +<UF188> \x85\xBE |0 # +<UF189> \x85\xBF |0 # +<UF18A> \x85\xC0 |0 # +<UF18B> \x85\xC1 |0 # +<UF18C> \x85\xC2 |0 # +<UF18D> \x85\xC3 |0 # +<UF18E> \x85\xC4 |0 # +<UF18F> \x85\xC5 |0 # +<UF190> \x85\xC6 |0 # +<UF191> \x85\xC7 |0 # +<UF192> \x85\xC8 |0 # +<UF193> \x85\xC9 |0 # +<UF194> \x85\xCA |0 # +<UF195> \x85\xCB |0 # +<UF196> \x85\xCC |0 # +<UF197> \x85\xCD |0 # +<UF198> \x85\xCE |0 # +<UF199> \x85\xCF |0 # +<UF19A> \x85\xD0 |0 # +<UF19B> \x85\xD1 |0 # +<UF19C> \x85\xD2 |0 # +<UF19D> \x85\xD3 |0 # +<UF19E> \x85\xD4 |0 # +<UF19F> \x85\xD5 |0 # +<UF1A0> \x85\xD6 |0 # +<UF1A1> \x85\xD7 |0 # +<UF1A2> \x85\xD8 |0 # +<UF1A3> \x85\xD9 |0 # +<UF1A4> \x85\xDA |0 # +<UF1A5> \x85\xDB |0 # +<UF1A6> \x85\xDC |0 # +<UF1A7> \x85\xDD |0 # +<UF1A8> \x85\xDE |0 # +<UF1A9> \x85\xDF |0 # +<UF1AA> \x85\xE0 |0 # +<UF1AB> \x85\xE1 |0 # +<UF1AC> \x85\xE2 |0 # +<UF1AD> \x85\xE3 |0 # +<UF1AE> \x85\xE4 |0 # +<UF1AF> \x85\xE5 |0 # +<UF1B0> \x85\xE6 |0 # +<UF1B1> \x85\xE7 |0 # +<UF1B2> \x85\xE8 |0 # +<UF1B3> \x85\xE9 |0 # +<UF1B4> \x85\xEA |0 # +<UF1B5> \x85\xEB |0 # +<UF1B6> \x85\xEC |0 # +<UF1B7> \x85\xED |0 # +<UF1B8> \x85\xEE |0 # +<UF1B9> \x85\xEF |0 # +<UF1BA> \x85\xF0 |0 # +<UF1BB> \x85\xF1 |0 # +<UF1BC> \x85\xF2 |0 # +<UF1BD> \x85\xF3 |0 # +<UF1BE> \x85\xF4 |0 # +<UF1BF> \x85\xF5 |0 # +<UF1C0> \x85\xF6 |0 # +<UF1C1> \x85\xF7 |0 # +<UF1C2> \x85\xF8 |0 # +<UF1C3> \x85\xF9 |0 # +<UF1C4> \x85\xFA |0 # +<UF1C5> \x85\xFB |0 # +<UF1C6> \x85\xFC |0 # +<UF1C7> \x85\xFD |0 # +<UF1C8> \x85\xFE |0 # +<UF1C9> \x86\x40 |0 # +<UF1CA> \x86\x41 |0 # +<UF1CB> \x86\x42 |0 # +<UF1CC> \x86\x43 |0 # +<UF1CD> \x86\x44 |0 # +<UF1CE> \x86\x45 |0 # +<UF1CF> \x86\x46 |0 # +<UF1D0> \x86\x47 |0 # +<UF1D1> \x86\x48 |0 # +<UF1D2> \x86\x49 |0 # +<UF1D3> \x86\x4A |0 # +<UF1D4> \x86\x4B |0 # +<UF1D5> \x86\x4C |0 # +<UF1D6> \x86\x4D |0 # +<UF1D7> \x86\x4E |0 # +<UF1D8> \x86\x4F |0 # +<UF1D9> \x86\x50 |0 # +<UF1DA> \x86\x51 |0 # +<UF1DB> \x86\x52 |0 # +<UF1DC> \x86\x53 |0 # +<UF1DD> \x86\x54 |0 # +<UF1DE> \x86\x55 |0 # +<UF1DF> \x86\x56 |0 # +<UF1E0> \x86\x57 |0 # +<UF1E1> \x86\x58 |0 # +<UF1E2> \x86\x59 |0 # +<UF1E3> \x86\x5A |0 # +<UF1E4> \x86\x5B |0 # +<UF1E5> \x86\x5C |0 # +<UF1E6> \x86\x5D |0 # +<UF1E7> \x86\x5E |0 # +<UF1E8> \x86\x5F |0 # +<UF1E9> \x86\x60 |0 # +<UF1EA> \x86\x61 |0 # +<UF1EB> \x86\x62 |0 # +<UF1EC> \x86\x63 |0 # +<UF1ED> \x86\x64 |0 # +<UF1EE> \x86\x65 |0 # +<UF1EF> \x86\x66 |0 # +<UF1F0> \x86\x67 |0 # +<UF1F1> \x86\x68 |0 # +<UF1F2> \x86\x69 |0 # +<UF1F3> \x86\x6A |0 # +<UF1F4> \x86\x6B |0 # +<UF1F5> \x86\x6C |0 # +<UF1F6> \x86\x6D |0 # +<UF1F7> \x86\x6E |0 # +<UF1F8> \x86\x6F |0 # +<UF1F9> \x86\x70 |0 # +<UF1FA> \x86\x71 |0 # +<UF1FB> \x86\x72 |0 # +<UF1FC> \x86\x73 |0 # +<UF1FD> \x86\x74 |0 # +<UF1FE> \x86\x75 |0 # +<UF1FF> \x86\x76 |0 # +<UF200> \x86\x77 |0 # +<UF201> \x86\x78 |0 # +<UF202> \x86\x79 |0 # +<UF203> \x86\x7A |0 # +<UF204> \x86\x7B |0 # +<UF205> \x86\x7C |0 # +<UF206> \x86\x7D |0 # +<UF207> \x86\x7E |0 # +<UF208> \x86\xA1 |0 # +<UF209> \x86\xA2 |0 # +<UF20A> \x86\xA3 |0 # +<UF20B> \x86\xA4 |0 # +<UF20C> \x86\xA5 |0 # +<UF20D> \x86\xA6 |0 # +<UF20E> \x86\xA7 |0 # +<UF20F> \x86\xA8 |0 # +<UF210> \x86\xA9 |0 # +<UF211> \x86\xAA |0 # +<UF212> \x86\xAB |0 # +<UF213> \x86\xAC |0 # +<UF214> \x86\xAD |0 # +<UF215> \x86\xAE |0 # +<UF216> \x86\xAF |0 # +<UF217> \x86\xB0 |0 # +<UF218> \x86\xB1 |0 # +<UF219> \x86\xB2 |0 # +<UF21A> \x86\xB3 |0 # +<UF21B> \x86\xB4 |0 # +<UF21C> \x86\xB5 |0 # +<UF21D> \x86\xB6 |0 # +<UF21E> \x86\xB7 |0 # +<UF21F> \x86\xB8 |0 # +<UF220> \x86\xB9 |0 # +<UF221> \x86\xBA |0 # +<UF222> \x86\xBB |0 # +<UF223> \x86\xBC |0 # +<UF224> \x86\xBD |0 # +<UF225> \x86\xBE |0 # +<UF226> \x86\xBF |0 # +<UF227> \x86\xC0 |0 # +<UF228> \x86\xC1 |0 # +<UF229> \x86\xC2 |0 # +<UF22A> \x86\xC3 |0 # +<UF22B> \x86\xC4 |0 # +<UF22C> \x86\xC5 |0 # +<UF22D> \x86\xC6 |0 # +<UF22E> \x86\xC7 |0 # +<UF22F> \x86\xC8 |0 # +<UF230> \x86\xC9 |0 # +<UF231> \x86\xCA |0 # +<UF232> \x86\xCB |0 # +<UF233> \x86\xCC |0 # +<UF234> \x86\xCD |0 # +<UF235> \x86\xCE |0 # +<UF236> \x86\xCF |0 # +<UF237> \x86\xD0 |0 # +<UF238> \x86\xD1 |0 # +<UF239> \x86\xD2 |0 # +<UF23A> \x86\xD3 |0 # +<UF23B> \x86\xD4 |0 # +<UF23C> \x86\xD5 |0 # +<UF23D> \x86\xD6 |0 # +<UF23E> \x86\xD7 |0 # +<UF23F> \x86\xD8 |0 # +<UF240> \x86\xD9 |0 # +<UF241> \x86\xDA |0 # +<UF242> \x86\xDB |0 # +<UF243> \x86\xDC |0 # +<UF244> \x86\xDD |0 # +<UF245> \x86\xDE |0 # +<UF246> \x86\xDF |0 # +<UF247> \x86\xE0 |0 # +<UF248> \x86\xE1 |0 # +<UF249> \x86\xE2 |0 # +<UF24A> \x86\xE3 |0 # +<UF24B> \x86\xE4 |0 # +<UF24C> \x86\xE5 |0 # +<UF24D> \x86\xE6 |0 # +<UF24E> \x86\xE7 |0 # +<UF24F> \x86\xE8 |0 # +<UF250> \x86\xE9 |0 # +<UF251> \x86\xEA |0 # +<UF252> \x86\xEB |0 # +<UF253> \x86\xEC |0 # +<UF254> \x86\xED |0 # +<UF255> \x86\xEE |0 # +<UF256> \x86\xEF |0 # +<UF257> \x86\xF0 |0 # +<UF258> \x86\xF1 |0 # +<UF259> \x86\xF2 |0 # +<UF25A> \x86\xF3 |0 # +<UF25B> \x86\xF4 |0 # +<UF25C> \x86\xF5 |0 # +<UF25D> \x86\xF6 |0 # +<UF25E> \x86\xF7 |0 # +<UF25F> \x86\xF8 |0 # +<UF260> \x86\xF9 |0 # +<UF261> \x86\xFA |0 # +<UF262> \x86\xFB |0 # +<UF263> \x86\xFC |0 # +<UF264> \x86\xFD |0 # +<UF265> \x86\xFE |0 # +<UF266> \x87\x40 |0 # +<UF267> \x87\x41 |0 # +<UF268> \x87\x42 |0 # +<UF269> \x87\x43 |0 # +<UF26A> \x87\x44 |0 # +<UF26B> \x87\x45 |0 # +<UF26C> \x87\x46 |0 # +<UF26D> \x87\x47 |0 # +<UF26E> \x87\x48 |0 # +<UF26F> \x87\x49 |0 # +<UF270> \x87\x4A |0 # +<UF271> \x87\x4B |0 # +<UF272> \x87\x4C |0 # +<UF273> \x87\x4D |0 # +<UF274> \x87\x4E |0 # +<UF275> \x87\x4F |0 # +<UF276> \x87\x50 |0 # +<UF277> \x87\x51 |0 # +<UF278> \x87\x52 |0 # +<UF279> \x87\x53 |0 # +<UF27A> \x87\x54 |0 # +<UF27B> \x87\x55 |0 # +<UF27C> \x87\x56 |0 # +<UF27D> \x87\x57 |0 # +<UF27E> \x87\x58 |0 # +<UF27F> \x87\x59 |0 # +<UF280> \x87\x5A |0 # +<UF281> \x87\x5B |0 # +<UF282> \x87\x5C |0 # +<UF283> \x87\x5D |0 # +<UF284> \x87\x5E |0 # +<UF285> \x87\x5F |0 # +<UF286> \x87\x60 |0 # +<UF287> \x87\x61 |0 # +<UF288> \x87\x62 |0 # +<UF289> \x87\x63 |0 # +<UF28A> \x87\x64 |0 # +<UF28B> \x87\x65 |0 # +<UF28C> \x87\x66 |0 # +<UF28D> \x87\x67 |0 # +<UF28E> \x87\x68 |0 # +<UF28F> \x87\x69 |0 # +<UF290> \x87\x6A |0 # +<UF291> \x87\x6B |0 # +<UF292> \x87\x6C |0 # +<UF293> \x87\x6D |0 # +<UF294> \x87\x6E |0 # +<UF295> \x87\x6F |0 # +<UF296> \x87\x70 |0 # +<UF297> \x87\x71 |0 # +<UF298> \x87\x72 |0 # +<UF299> \x87\x73 |0 # +<UF29A> \x87\x74 |0 # +<UF29B> \x87\x75 |0 # +<UF29C> \x87\x76 |0 # +<UF29D> \x87\x77 |0 # +<UF29E> \x87\x78 |0 # +<UF29F> \x87\x79 |0 # +<UF2A0> \x87\x7A |0 # +<UF2A1> \x87\x7B |0 # +<UF2A2> \x87\x7C |0 # +<UF2A3> \x87\x7D |0 # +<UF2A4> \x87\x7E |0 # +<UF2A5> \x87\xA1 |0 # +<UF2A6> \x87\xA2 |0 # +<UF2A7> \x87\xA3 |0 # +<UF2A8> \x87\xA4 |0 # +<UF2A9> \x87\xA5 |0 # +<UF2AA> \x87\xA6 |0 # +<UF2AB> \x87\xA7 |0 # +<UF2AC> \x87\xA8 |0 # +<UF2AD> \x87\xA9 |0 # +<UF2AE> \x87\xAA |0 # +<UF2AF> \x87\xAB |0 # +<UF2B0> \x87\xAC |0 # +<UF2B1> \x87\xAD |0 # +<UF2B2> \x87\xAE |0 # +<UF2B3> \x87\xAF |0 # +<UF2B4> \x87\xB0 |0 # +<UF2B5> \x87\xB1 |0 # +<UF2B6> \x87\xB2 |0 # +<UF2B7> \x87\xB3 |0 # +<UF2B8> \x87\xB4 |0 # +<UF2B9> \x87\xB5 |0 # +<UF2BA> \x87\xB6 |0 # +<UF2BB> \x87\xB7 |0 # +<UF2BC> \x87\xB8 |0 # +<UF2BD> \x87\xB9 |0 # +<UF2BE> \x87\xBA |0 # +<UF2BF> \x87\xBB |0 # +<UF2C0> \x87\xBC |0 # +<UF2C1> \x87\xBD |0 # +<UF2C2> \x87\xBE |0 # +<UF2C3> \x87\xBF |0 # +<UF2C4> \x87\xC0 |0 # +<UF2C5> \x87\xC1 |0 # +<UF2C6> \x87\xC2 |0 # +<UF2C7> \x87\xC3 |0 # +<UF2C8> \x87\xC4 |0 # +<UF2C9> \x87\xC5 |0 # +<UF2CA> \x87\xC6 |0 # +<UF2CB> \x87\xC7 |0 # +<UF2CC> \x87\xC8 |0 # +<UF2CD> \x87\xC9 |0 # +<UF2CE> \x87\xCA |0 # +<UF2CF> \x87\xCB |0 # +<UF2D0> \x87\xCC |0 # +<UF2D1> \x87\xCD |0 # +<UF2D2> \x87\xCE |0 # +<UF2D3> \x87\xCF |0 # +<UF2D4> \x87\xD0 |0 # +<UF2D5> \x87\xD1 |0 # +<UF2D6> \x87\xD2 |0 # +<UF2D7> \x87\xD3 |0 # +<UF2D8> \x87\xD4 |0 # +<UF2D9> \x87\xD5 |0 # +<UF2DA> \x87\xD6 |0 # +<UF2DB> \x87\xD7 |0 # +<UF2DC> \x87\xD8 |0 # +<UF2DD> \x87\xD9 |0 # +<UF2DE> \x87\xDA |0 # +<UF2DF> \x87\xDB |0 # +<UF2E0> \x87\xDC |0 # +<UF2E1> \x87\xDD |0 # +<UF2E2> \x87\xDE |0 # +<UF2E3> \x87\xDF |0 # +<UF2E4> \x87\xE0 |0 # +<UF2E5> \x87\xE1 |0 # +<UF2E6> \x87\xE2 |0 # +<UF2E7> \x87\xE3 |0 # +<UF2E8> \x87\xE4 |0 # +<UF2E9> \x87\xE5 |0 # +<UF2EA> \x87\xE6 |0 # +<UF2EB> \x87\xE7 |0 # +<UF2EC> \x87\xE8 |0 # +<UF2ED> \x87\xE9 |0 # +<UF2EE> \x87\xEA |0 # +<UF2EF> \x87\xEB |0 # +<UF2F0> \x87\xEC |0 # +<UF2F1> \x87\xED |0 # +<UF2F2> \x87\xEE |0 # +<UF2F3> \x87\xEF |0 # +<UF2F4> \x87\xF0 |0 # +<UF2F5> \x87\xF1 |0 # +<UF2F6> \x87\xF2 |0 # +<UF2F7> \x87\xF3 |0 # +<UF2F8> \x87\xF4 |0 # +<UF2F9> \x87\xF5 |0 # +<UF2FA> \x87\xF6 |0 # +<UF2FB> \x87\xF7 |0 # +<UF2FC> \x87\xF8 |0 # +<UF2FD> \x87\xF9 |0 # +<UF2FE> \x87\xFA |0 # +<UF2FF> \x87\xFB |0 # +<UF300> \x87\xFC |0 # +<UF301> \x87\xFD |0 # +<UF302> \x87\xFE |0 # +<UF303> \x88\x40 |0 # +<UF304> \x88\x41 |0 # +<UF305> \x88\x42 |0 # +<UF306> \x88\x43 |0 # +<UF307> \x88\x44 |0 # +<UF308> \x88\x45 |0 # +<UF309> \x88\x46 |0 # +<UF30A> \x88\x47 |0 # +<UF30B> \x88\x48 |0 # +<UF30C> \x88\x49 |0 # +<UF30D> \x88\x4A |0 # +<UF30E> \x88\x4B |0 # +<UF30F> \x88\x4C |0 # +<UF310> \x88\x4D |0 # +<UF311> \x88\x4E |0 # +<UF312> \x88\x4F |0 # +<UF313> \x88\x50 |0 # +<UF314> \x88\x51 |0 # +<UF315> \x88\x52 |0 # +<UF316> \x88\x53 |0 # +<UF317> \x88\x54 |0 # +<UF318> \x88\x55 |0 # +<UF319> \x88\x56 |0 # +<UF31A> \x88\x57 |0 # +<UF31B> \x88\x58 |0 # +<UF31C> \x88\x59 |0 # +<UF31D> \x88\x5A |0 # +<UF31E> \x88\x5B |0 # +<UF31F> \x88\x5C |0 # +<UF320> \x88\x5D |0 # +<UF321> \x88\x5E |0 # +<UF322> \x88\x5F |0 # +<UF323> \x88\x60 |0 # +<UF324> \x88\x61 |0 # +<UF325> \x88\x62 |0 # +<UF326> \x88\x63 |0 # +<UF327> \x88\x64 |0 # +<UF328> \x88\x65 |0 # +<UF329> \x88\x66 |0 # +<UF32A> \x88\x67 |0 # +<UF32B> \x88\x68 |0 # +<UF32C> \x88\x69 |0 # +<UF32D> \x88\x6A |0 # +<UF32E> \x88\x6B |0 # +<UF32F> \x88\x6C |0 # +<UF330> \x88\x6D |0 # +<UF331> \x88\x6E |0 # +<UF332> \x88\x6F |0 # +<UF333> \x88\x70 |0 # +<UF334> \x88\x71 |0 # +<UF335> \x88\x72 |0 # +<UF336> \x88\x73 |0 # +<UF337> \x88\x74 |0 # +<UF338> \x88\x75 |0 # +<UF339> \x88\x76 |0 # +<UF33A> \x88\x77 |0 # +<UF33B> \x88\x78 |0 # +<UF33C> \x88\x79 |0 # +<UF33D> \x88\x7A |0 # +<UF33E> \x88\x7B |0 # +<UF33F> \x88\x7C |0 # +<UF340> \x88\x7D |0 # +<UF341> \x88\x7E |0 # +<UF342> \x88\xA1 |0 # +<UF343> \x88\xA2 |0 # +<UF344> \x88\xA3 |0 # +<UF345> \x88\xA4 |0 # +<UF346> \x88\xA5 |0 # +<UF347> \x88\xA6 |0 # +<UF348> \x88\xA7 |0 # +<UF349> \x88\xA8 |0 # +<UF34A> \x88\xA9 |0 # +<UF34B> \x88\xAA |0 # +<UF34C> \x88\xAB |0 # +<UF34D> \x88\xAC |0 # +<UF34E> \x88\xAD |0 # +<UF34F> \x88\xAE |0 # +<UF350> \x88\xAF |0 # +<UF351> \x88\xB0 |0 # +<UF352> \x88\xB1 |0 # +<UF353> \x88\xB2 |0 # +<UF354> \x88\xB3 |0 # +<UF355> \x88\xB4 |0 # +<UF356> \x88\xB5 |0 # +<UF357> \x88\xB6 |0 # +<UF358> \x88\xB7 |0 # +<UF359> \x88\xB8 |0 # +<UF35A> \x88\xB9 |0 # +<UF35B> \x88\xBA |0 # +<UF35C> \x88\xBB |0 # +<UF35D> \x88\xBC |0 # +<UF35E> \x88\xBD |0 # +<UF35F> \x88\xBE |0 # +<UF360> \x88\xBF |0 # +<UF361> \x88\xC0 |0 # +<UF362> \x88\xC1 |0 # +<UF363> \x88\xC2 |0 # +<UF364> \x88\xC3 |0 # +<UF365> \x88\xC4 |0 # +<UF366> \x88\xC5 |0 # +<UF367> \x88\xC6 |0 # +<UF368> \x88\xC7 |0 # +<UF369> \x88\xC8 |0 # +<UF36A> \x88\xC9 |0 # +<UF36B> \x88\xCA |0 # +<UF36C> \x88\xCB |0 # +<UF36D> \x88\xCC |0 # +<UF36E> \x88\xCD |0 # +<UF36F> \x88\xCE |0 # +<UF370> \x88\xCF |0 # +<UF371> \x88\xD0 |0 # +<UF372> \x88\xD1 |0 # +<UF373> \x88\xD2 |0 # +<UF374> \x88\xD3 |0 # +<UF375> \x88\xD4 |0 # +<UF376> \x88\xD5 |0 # +<UF377> \x88\xD6 |0 # +<UF378> \x88\xD7 |0 # +<UF379> \x88\xD8 |0 # +<UF37A> \x88\xD9 |0 # +<UF37B> \x88\xDA |0 # +<UF37C> \x88\xDB |0 # +<UF37D> \x88\xDC |0 # +<UF37E> \x88\xDD |0 # +<UF37F> \x88\xDE |0 # +<UF380> \x88\xDF |0 # +<UF381> \x88\xE0 |0 # +<UF382> \x88\xE1 |0 # +<UF383> \x88\xE2 |0 # +<UF384> \x88\xE3 |0 # +<UF385> \x88\xE4 |0 # +<UF386> \x88\xE5 |0 # +<UF387> \x88\xE6 |0 # +<UF388> \x88\xE7 |0 # +<UF389> \x88\xE8 |0 # +<UF38A> \x88\xE9 |0 # +<UF38B> \x88\xEA |0 # +<UF38C> \x88\xEB |0 # +<UF38D> \x88\xEC |0 # +<UF38E> \x88\xED |0 # +<UF38F> \x88\xEE |0 # +<UF390> \x88\xEF |0 # +<UF391> \x88\xF0 |0 # +<UF392> \x88\xF1 |0 # +<UF393> \x88\xF2 |0 # +<UF394> \x88\xF3 |0 # +<UF395> \x88\xF4 |0 # +<UF396> \x88\xF5 |0 # +<UF397> \x88\xF6 |0 # +<UF398> \x88\xF7 |0 # +<UF399> \x88\xF8 |0 # +<UF39A> \x88\xF9 |0 # +<UF39B> \x88\xFA |0 # +<UF39C> \x88\xFB |0 # +<UF39D> \x88\xFC |0 # +<UF39E> \x88\xFD |0 # +<UF39F> \x88\xFE |0 # +<UF3A0> \x89\x40 |0 # +<UF3A1> \x89\x41 |0 # +<UF3A2> \x89\x42 |0 # +<UF3A3> \x89\x43 |0 # +<UF3A4> \x89\x44 |0 # +<UF3A5> \x89\x45 |0 # +<UF3A6> \x89\x46 |0 # +<UF3A7> \x89\x47 |0 # +<UF3A8> \x89\x48 |0 # +<UF3A9> \x89\x49 |0 # +<UF3AA> \x89\x4A |0 # +<UF3AB> \x89\x4B |0 # +<UF3AC> \x89\x4C |0 # +<UF3AD> \x89\x4D |0 # +<UF3AE> \x89\x4E |0 # +<UF3AF> \x89\x4F |0 # +<UF3B0> \x89\x50 |0 # +<UF3B1> \x89\x51 |0 # +<UF3B2> \x89\x52 |0 # +<UF3B3> \x89\x53 |0 # +<UF3B4> \x89\x54 |0 # +<UF3B5> \x89\x55 |0 # +<UF3B6> \x89\x56 |0 # +<UF3B7> \x89\x57 |0 # +<UF3B8> \x89\x58 |0 # +<UF3B9> \x89\x59 |0 # +<UF3BA> \x89\x5A |0 # +<UF3BB> \x89\x5B |0 # +<UF3BC> \x89\x5C |0 # +<UF3BD> \x89\x5D |0 # +<UF3BE> \x89\x5E |0 # +<UF3BF> \x89\x5F |0 # +<UF3C0> \x89\x60 |0 # +<UF3C1> \x89\x61 |0 # +<UF3C2> \x89\x62 |0 # +<UF3C3> \x89\x63 |0 # +<UF3C4> \x89\x64 |0 # +<UF3C5> \x89\x65 |0 # +<UF3C6> \x89\x66 |0 # +<UF3C7> \x89\x67 |0 # +<UF3C8> \x89\x68 |0 # +<UF3C9> \x89\x69 |0 # +<UF3CA> \x89\x6A |0 # +<UF3CB> \x89\x6B |0 # +<UF3CC> \x89\x6C |0 # +<UF3CD> \x89\x6D |0 # +<UF3CE> \x89\x6E |0 # +<UF3CF> \x89\x6F |0 # +<UF3D0> \x89\x70 |0 # +<UF3D1> \x89\x71 |0 # +<UF3D2> \x89\x72 |0 # +<UF3D3> \x89\x73 |0 # +<UF3D4> \x89\x74 |0 # +<UF3D5> \x89\x75 |0 # +<UF3D6> \x89\x76 |0 # +<UF3D7> \x89\x77 |0 # +<UF3D8> \x89\x78 |0 # +<UF3D9> \x89\x79 |0 # +<UF3DA> \x89\x7A |0 # +<UF3DB> \x89\x7B |0 # +<UF3DC> \x89\x7C |0 # +<UF3DD> \x89\x7D |0 # +<UF3DE> \x89\x7E |0 # +<UF3DF> \x89\xA1 |0 # +<UF3E0> \x89\xA2 |0 # +<UF3E1> \x89\xA3 |0 # +<UF3E2> \x89\xA4 |0 # +<UF3E3> \x89\xA5 |0 # +<UF3E4> \x89\xA6 |0 # +<UF3E5> \x89\xA7 |0 # +<UF3E6> \x89\xA8 |0 # +<UF3E7> \x89\xA9 |0 # +<UF3E8> \x89\xAA |0 # +<UF3E9> \x89\xAB |0 # +<UF3EA> \x89\xAC |0 # +<UF3EB> \x89\xAD |0 # +<UF3EC> \x89\xAE |0 # +<UF3ED> \x89\xAF |0 # +<UF3EE> \x89\xB0 |0 # +<UF3EF> \x89\xB1 |0 # +<UF3F0> \x89\xB2 |0 # +<UF3F1> \x89\xB3 |0 # +<UF3F2> \x89\xB4 |0 # +<UF3F3> \x89\xB5 |0 # +<UF3F4> \x89\xB6 |0 # +<UF3F5> \x89\xB7 |0 # +<UF3F6> \x89\xB8 |0 # +<UF3F7> \x89\xB9 |0 # +<UF3F8> \x89\xBA |0 # +<UF3F9> \x89\xBB |0 # +<UF3FA> \x89\xBC |0 # +<UF3FB> \x89\xBD |0 # +<UF3FC> \x89\xBE |0 # +<UF3FD> \x89\xBF |0 # +<UF3FE> \x89\xC0 |0 # +<UF3FF> \x89\xC1 |0 # +<UF400> \x89\xC2 |0 # +<UF401> \x89\xC3 |0 # +<UF402> \x89\xC4 |0 # +<UF403> \x89\xC5 |0 # +<UF404> \x89\xC6 |0 # +<UF405> \x89\xC7 |0 # +<UF406> \x89\xC8 |0 # +<UF407> \x89\xC9 |0 # +<UF408> \x89\xCA |0 # +<UF409> \x89\xCB |0 # +<UF40A> \x89\xCC |0 # +<UF40B> \x89\xCD |0 # +<UF40C> \x89\xCE |0 # +<UF40D> \x89\xCF |0 # +<UF40E> \x89\xD0 |0 # +<UF40F> \x89\xD1 |0 # +<UF410> \x89\xD2 |0 # +<UF411> \x89\xD3 |0 # +<UF412> \x89\xD4 |0 # +<UF413> \x89\xD5 |0 # +<UF414> \x89\xD6 |0 # +<UF415> \x89\xD7 |0 # +<UF416> \x89\xD8 |0 # +<UF417> \x89\xD9 |0 # +<UF418> \x89\xDA |0 # +<UF419> \x89\xDB |0 # +<UF41A> \x89\xDC |0 # +<UF41B> \x89\xDD |0 # +<UF41C> \x89\xDE |0 # +<UF41D> \x89\xDF |0 # +<UF41E> \x89\xE0 |0 # +<UF41F> \x89\xE1 |0 # +<UF420> \x89\xE2 |0 # +<UF421> \x89\xE3 |0 # +<UF422> \x89\xE4 |0 # +<UF423> \x89\xE5 |0 # +<UF424> \x89\xE6 |0 # +<UF425> \x89\xE7 |0 # +<UF426> \x89\xE8 |0 # +<UF427> \x89\xE9 |0 # +<UF428> \x89\xEA |0 # +<UF429> \x89\xEB |0 # +<UF42A> \x89\xEC |0 # +<UF42B> \x89\xED |0 # +<UF42C> \x89\xEE |0 # +<UF42D> \x89\xEF |0 # +<UF42E> \x89\xF0 |0 # +<UF42F> \x89\xF1 |0 # +<UF430> \x89\xF2 |0 # +<UF431> \x89\xF3 |0 # +<UF432> \x89\xF4 |0 # +<UF433> \x89\xF5 |0 # +<UF434> \x89\xF6 |0 # +<UF435> \x89\xF7 |0 # +<UF436> \x89\xF8 |0 # +<UF437> \x89\xF9 |0 # +<UF438> \x89\xFA |0 # +<UF439> \x89\xFB |0 # +<UF43A> \x89\xFC |0 # +<UF43B> \x89\xFD |0 # +<UF43C> \x89\xFE |0 # +<UF43D> \x8A\x40 |0 # +<UF43E> \x8A\x41 |0 # +<UF43F> \x8A\x42 |0 # +<UF440> \x8A\x43 |0 # +<UF441> \x8A\x44 |0 # +<UF442> \x8A\x45 |0 # +<UF443> \x8A\x46 |0 # +<UF444> \x8A\x47 |0 # +<UF445> \x8A\x48 |0 # +<UF446> \x8A\x49 |0 # +<UF447> \x8A\x4A |0 # +<UF448> \x8A\x4B |0 # +<UF449> \x8A\x4C |0 # +<UF44A> \x8A\x4D |0 # +<UF44B> \x8A\x4E |0 # +<UF44C> \x8A\x4F |0 # +<UF44D> \x8A\x50 |0 # +<UF44E> \x8A\x51 |0 # +<UF44F> \x8A\x52 |0 # +<UF450> \x8A\x53 |0 # +<UF451> \x8A\x54 |0 # +<UF452> \x8A\x55 |0 # +<UF453> \x8A\x56 |0 # +<UF454> \x8A\x57 |0 # +<UF455> \x8A\x58 |0 # +<UF456> \x8A\x59 |0 # +<UF457> \x8A\x5A |0 # +<UF458> \x8A\x5B |0 # +<UF459> \x8A\x5C |0 # +<UF45A> \x8A\x5D |0 # +<UF45B> \x8A\x5E |0 # +<UF45C> \x8A\x5F |0 # +<UF45D> \x8A\x60 |0 # +<UF45E> \x8A\x61 |0 # +<UF45F> \x8A\x62 |0 # +<UF460> \x8A\x63 |0 # +<UF461> \x8A\x64 |0 # +<UF462> \x8A\x65 |0 # +<UF463> \x8A\x66 |0 # +<UF464> \x8A\x67 |0 # +<UF465> \x8A\x68 |0 # +<UF466> \x8A\x69 |0 # +<UF467> \x8A\x6A |0 # +<UF468> \x8A\x6B |0 # +<UF469> \x8A\x6C |0 # +<UF46A> \x8A\x6D |0 # +<UF46B> \x8A\x6E |0 # +<UF46C> \x8A\x6F |0 # +<UF46D> \x8A\x70 |0 # +<UF46E> \x8A\x71 |0 # +<UF46F> \x8A\x72 |0 # +<UF470> \x8A\x73 |0 # +<UF471> \x8A\x74 |0 # +<UF472> \x8A\x75 |0 # +<UF473> \x8A\x76 |0 # +<UF474> \x8A\x77 |0 # +<UF475> \x8A\x78 |0 # +<UF476> \x8A\x79 |0 # +<UF477> \x8A\x7A |0 # +<UF478> \x8A\x7B |0 # +<UF479> \x8A\x7C |0 # +<UF47A> \x8A\x7D |0 # +<UF47B> \x8A\x7E |0 # +<UF47C> \x8A\xA1 |0 # +<UF47D> \x8A\xA2 |0 # +<UF47E> \x8A\xA3 |0 # +<UF47F> \x8A\xA4 |0 # +<UF480> \x8A\xA5 |0 # +<UF481> \x8A\xA6 |0 # +<UF482> \x8A\xA7 |0 # +<UF483> \x8A\xA8 |0 # +<UF484> \x8A\xA9 |0 # +<UF485> \x8A\xAA |0 # +<UF486> \x8A\xAB |0 # +<UF487> \x8A\xAC |0 # +<UF488> \x8A\xAD |0 # +<UF489> \x8A\xAE |0 # +<UF48A> \x8A\xAF |0 # +<UF48B> \x8A\xB0 |0 # +<UF48C> \x8A\xB1 |0 # +<UF48D> \x8A\xB2 |0 # +<UF48E> \x8A\xB3 |0 # +<UF48F> \x8A\xB4 |0 # +<UF490> \x8A\xB5 |0 # +<UF491> \x8A\xB6 |0 # +<UF492> \x8A\xB7 |0 # +<UF493> \x8A\xB8 |0 # +<UF494> \x8A\xB9 |0 # +<UF495> \x8A\xBA |0 # +<UF496> \x8A\xBB |0 # +<UF497> \x8A\xBC |0 # +<UF498> \x8A\xBD |0 # +<UF499> \x8A\xBE |0 # +<UF49A> \x8A\xBF |0 # +<UF49B> \x8A\xC0 |0 # +<UF49C> \x8A\xC1 |0 # +<UF49D> \x8A\xC2 |0 # +<UF49E> \x8A\xC3 |0 # +<UF49F> \x8A\xC4 |0 # +<UF4A0> \x8A\xC5 |0 # +<UF4A1> \x8A\xC6 |0 # +<UF4A2> \x8A\xC7 |0 # +<UF4A3> \x8A\xC8 |0 # +<UF4A4> \x8A\xC9 |0 # +<UF4A5> \x8A\xCA |0 # +<UF4A6> \x8A\xCB |0 # +<UF4A7> \x8A\xCC |0 # +<UF4A8> \x8A\xCD |0 # +<UF4A9> \x8A\xCE |0 # +<UF4AA> \x8A\xCF |0 # +<UF4AB> \x8A\xD0 |0 # +<UF4AC> \x8A\xD1 |0 # +<UF4AD> \x8A\xD2 |0 # +<UF4AE> \x8A\xD3 |0 # +<UF4AF> \x8A\xD4 |0 # +<UF4B0> \x8A\xD5 |0 # +<UF4B1> \x8A\xD6 |0 # +<UF4B2> \x8A\xD7 |0 # +<UF4B3> \x8A\xD8 |0 # +<UF4B4> \x8A\xD9 |0 # +<UF4B5> \x8A\xDA |0 # +<UF4B6> \x8A\xDB |0 # +<UF4B7> \x8A\xDC |0 # +<UF4B8> \x8A\xDD |0 # +<UF4B9> \x8A\xDE |0 # +<UF4BA> \x8A\xDF |0 # +<UF4BB> \x8A\xE0 |0 # +<UF4BC> \x8A\xE1 |0 # +<UF4BD> \x8A\xE2 |0 # +<UF4BE> \x8A\xE3 |0 # +<UF4BF> \x8A\xE4 |0 # +<UF4C0> \x8A\xE5 |0 # +<UF4C1> \x8A\xE6 |0 # +<UF4C2> \x8A\xE7 |0 # +<UF4C3> \x8A\xE8 |0 # +<UF4C4> \x8A\xE9 |0 # +<UF4C5> \x8A\xEA |0 # +<UF4C6> \x8A\xEB |0 # +<UF4C7> \x8A\xEC |0 # +<UF4C8> \x8A\xED |0 # +<UF4C9> \x8A\xEE |0 # +<UF4CA> \x8A\xEF |0 # +<UF4CB> \x8A\xF0 |0 # +<UF4CC> \x8A\xF1 |0 # +<UF4CD> \x8A\xF2 |0 # +<UF4CE> \x8A\xF3 |0 # +<UF4CF> \x8A\xF4 |0 # +<UF4D0> \x8A\xF5 |0 # +<UF4D1> \x8A\xF6 |0 # +<UF4D2> \x8A\xF7 |0 # +<UF4D3> \x8A\xF8 |0 # +<UF4D4> \x8A\xF9 |0 # +<UF4D5> \x8A\xFA |0 # +<UF4D6> \x8A\xFB |0 # +<UF4D7> \x8A\xFC |0 # +<UF4D8> \x8A\xFD |0 # +<UF4D9> \x8A\xFE |0 # +<UF4DA> \x8B\x40 |0 # +<UF4DB> \x8B\x41 |0 # +<UF4DC> \x8B\x42 |0 # +<UF4DD> \x8B\x43 |0 # +<UF4DE> \x8B\x44 |0 # +<UF4DF> \x8B\x45 |0 # +<UF4E0> \x8B\x46 |0 # +<UF4E1> \x8B\x47 |0 # +<UF4E2> \x8B\x48 |0 # +<UF4E3> \x8B\x49 |0 # +<UF4E4> \x8B\x4A |0 # +<UF4E5> \x8B\x4B |0 # +<UF4E6> \x8B\x4C |0 # +<UF4E7> \x8B\x4D |0 # +<UF4E8> \x8B\x4E |0 # +<UF4E9> \x8B\x4F |0 # +<UF4EA> \x8B\x50 |0 # +<UF4EB> \x8B\x51 |0 # +<UF4EC> \x8B\x52 |0 # +<UF4ED> \x8B\x53 |0 # +<UF4EE> \x8B\x54 |0 # +<UF4EF> \x8B\x55 |0 # +<UF4F0> \x8B\x56 |0 # +<UF4F1> \x8B\x57 |0 # +<UF4F2> \x8B\x58 |0 # +<UF4F3> \x8B\x59 |0 # +<UF4F4> \x8B\x5A |0 # +<UF4F5> \x8B\x5B |0 # +<UF4F6> \x8B\x5C |0 # +<UF4F7> \x8B\x5D |0 # +<UF4F8> \x8B\x5E |0 # +<UF4F9> \x8B\x5F |0 # +<UF4FA> \x8B\x60 |0 # +<UF4FB> \x8B\x61 |0 # +<UF4FC> \x8B\x62 |0 # +<UF4FD> \x8B\x63 |0 # +<UF4FE> \x8B\x64 |0 # +<UF4FF> \x8B\x65 |0 # +<UF500> \x8B\x66 |0 # +<UF501> \x8B\x67 |0 # +<UF502> \x8B\x68 |0 # +<UF503> \x8B\x69 |0 # +<UF504> \x8B\x6A |0 # +<UF505> \x8B\x6B |0 # +<UF506> \x8B\x6C |0 # +<UF507> \x8B\x6D |0 # +<UF508> \x8B\x6E |0 # +<UF509> \x8B\x6F |0 # +<UF50A> \x8B\x70 |0 # +<UF50B> \x8B\x71 |0 # +<UF50C> \x8B\x72 |0 # +<UF50D> \x8B\x73 |0 # +<UF50E> \x8B\x74 |0 # +<UF50F> \x8B\x75 |0 # +<UF510> \x8B\x76 |0 # +<UF511> \x8B\x77 |0 # +<UF512> \x8B\x78 |0 # +<UF513> \x8B\x79 |0 # +<UF514> \x8B\x7A |0 # +<UF515> \x8B\x7B |0 # +<UF516> \x8B\x7C |0 # +<UF517> \x8B\x7D |0 # +<UF518> \x8B\x7E |0 # +<UF519> \x8B\xA1 |0 # +<UF51A> \x8B\xA2 |0 # +<UF51B> \x8B\xA3 |0 # +<UF51C> \x8B\xA4 |0 # +<UF51D> \x8B\xA5 |0 # +<UF51E> \x8B\xA6 |0 # +<UF51F> \x8B\xA7 |0 # +<UF520> \x8B\xA8 |0 # +<UF521> \x8B\xA9 |0 # +<UF522> \x8B\xAA |0 # +<UF523> \x8B\xAB |0 # +<UF524> \x8B\xAC |0 # +<UF525> \x8B\xAD |0 # +<UF526> \x8B\xAE |0 # +<UF527> \x8B\xAF |0 # +<UF528> \x8B\xB0 |0 # +<UF529> \x8B\xB1 |0 # +<UF52A> \x8B\xB2 |0 # +<UF52B> \x8B\xB3 |0 # +<UF52C> \x8B\xB4 |0 # +<UF52D> \x8B\xB5 |0 # +<UF52E> \x8B\xB6 |0 # +<UF52F> \x8B\xB7 |0 # +<UF530> \x8B\xB8 |0 # +<UF531> \x8B\xB9 |0 # +<UF532> \x8B\xBA |0 # +<UF533> \x8B\xBB |0 # +<UF534> \x8B\xBC |0 # +<UF535> \x8B\xBD |0 # +<UF536> \x8B\xBE |0 # +<UF537> \x8B\xBF |0 # +<UF538> \x8B\xC0 |0 # +<UF539> \x8B\xC1 |0 # +<UF53A> \x8B\xC2 |0 # +<UF53B> \x8B\xC3 |0 # +<UF53C> \x8B\xC4 |0 # +<UF53D> \x8B\xC5 |0 # +<UF53E> \x8B\xC6 |0 # +<UF53F> \x8B\xC7 |0 # +<UF540> \x8B\xC8 |0 # +<UF541> \x8B\xC9 |0 # +<UF542> \x8B\xCA |0 # +<UF543> \x8B\xCB |0 # +<UF544> \x8B\xCC |0 # +<UF545> \x8B\xCD |0 # +<UF546> \x8B\xCE |0 # +<UF547> \x8B\xCF |0 # +<UF548> \x8B\xD0 |0 # +<UF549> \x8B\xD1 |0 # +<UF54A> \x8B\xD2 |0 # +<UF54B> \x8B\xD3 |0 # +<UF54C> \x8B\xD4 |0 # +<UF54D> \x8B\xD5 |0 # +<UF54E> \x8B\xD6 |0 # +<UF54F> \x8B\xD7 |0 # +<UF550> \x8B\xD8 |0 # +<UF551> \x8B\xD9 |0 # +<UF552> \x8B\xDA |0 # +<UF553> \x8B\xDB |0 # +<UF554> \x8B\xDC |0 # +<UF555> \x8B\xDD |0 # +<UF556> \x8B\xDE |0 # +<UF557> \x8B\xDF |0 # +<UF558> \x8B\xE0 |0 # +<UF559> \x8B\xE1 |0 # +<UF55A> \x8B\xE2 |0 # +<UF55B> \x8B\xE3 |0 # +<UF55C> \x8B\xE4 |0 # +<UF55D> \x8B\xE5 |0 # +<UF55E> \x8B\xE6 |0 # +<UF55F> \x8B\xE7 |0 # +<UF560> \x8B\xE8 |0 # +<UF561> \x8B\xE9 |0 # +<UF562> \x8B\xEA |0 # +<UF563> \x8B\xEB |0 # +<UF564> \x8B\xEC |0 # +<UF565> \x8B\xED |0 # +<UF566> \x8B\xEE |0 # +<UF567> \x8B\xEF |0 # +<UF568> \x8B\xF0 |0 # +<UF569> \x8B\xF1 |0 # +<UF56A> \x8B\xF2 |0 # +<UF56B> \x8B\xF3 |0 # +<UF56C> \x8B\xF4 |0 # +<UF56D> \x8B\xF5 |0 # +<UF56E> \x8B\xF6 |0 # +<UF56F> \x8B\xF7 |0 # +<UF570> \x8B\xF8 |0 # +<UF571> \x8B\xF9 |0 # +<UF572> \x8B\xFA |0 # +<UF573> \x8B\xFB |0 # +<UF574> \x8B\xFC |0 # +<UF575> \x8B\xFD |0 # +<UF576> \x8B\xFE |0 # +<UF577> \x8C\x40 |0 # +<UF578> \x8C\x41 |0 # +<UF579> \x8C\x42 |0 # +<UF57A> \x8C\x43 |0 # +<UF57B> \x8C\x44 |0 # +<UF57C> \x8C\x45 |0 # +<UF57D> \x8C\x46 |0 # +<UF57E> \x8C\x47 |0 # +<UF57F> \x8C\x48 |0 # +<UF580> \x8C\x49 |0 # +<UF581> \x8C\x4A |0 # +<UF582> \x8C\x4B |0 # +<UF583> \x8C\x4C |0 # +<UF584> \x8C\x4D |0 # +<UF585> \x8C\x4E |0 # +<UF586> \x8C\x4F |0 # +<UF587> \x8C\x50 |0 # +<UF588> \x8C\x51 |0 # +<UF589> \x8C\x52 |0 # +<UF58A> \x8C\x53 |0 # +<UF58B> \x8C\x54 |0 # +<UF58C> \x8C\x55 |0 # +<UF58D> \x8C\x56 |0 # +<UF58E> \x8C\x57 |0 # +<UF58F> \x8C\x58 |0 # +<UF590> \x8C\x59 |0 # +<UF591> \x8C\x5A |0 # +<UF592> \x8C\x5B |0 # +<UF593> \x8C\x5C |0 # +<UF594> \x8C\x5D |0 # +<UF595> \x8C\x5E |0 # +<UF596> \x8C\x5F |0 # +<UF597> \x8C\x60 |0 # +<UF598> \x8C\x61 |0 # +<UF599> \x8C\x62 |0 # +<UF59A> \x8C\x63 |0 # +<UF59B> \x8C\x64 |0 # +<UF59C> \x8C\x65 |0 # +<UF59D> \x8C\x66 |0 # +<UF59E> \x8C\x67 |0 # +<UF59F> \x8C\x68 |0 # +<UF5A0> \x8C\x69 |0 # +<UF5A1> \x8C\x6A |0 # +<UF5A2> \x8C\x6B |0 # +<UF5A3> \x8C\x6C |0 # +<UF5A4> \x8C\x6D |0 # +<UF5A5> \x8C\x6E |0 # +<UF5A6> \x8C\x6F |0 # +<UF5A7> \x8C\x70 |0 # +<UF5A8> \x8C\x71 |0 # +<UF5A9> \x8C\x72 |0 # +<UF5AA> \x8C\x73 |0 # +<UF5AB> \x8C\x74 |0 # +<UF5AC> \x8C\x75 |0 # +<UF5AD> \x8C\x76 |0 # +<UF5AE> \x8C\x77 |0 # +<UF5AF> \x8C\x78 |0 # +<UF5B0> \x8C\x79 |0 # +<UF5B1> \x8C\x7A |0 # +<UF5B2> \x8C\x7B |0 # +<UF5B3> \x8C\x7C |0 # +<UF5B4> \x8C\x7D |0 # +<UF5B5> \x8C\x7E |0 # +<UF5B6> \x8C\xA1 |0 # +<UF5B7> \x8C\xA2 |0 # +<UF5B8> \x8C\xA3 |0 # +<UF5B9> \x8C\xA4 |0 # +<UF5BA> \x8C\xA5 |0 # +<UF5BB> \x8C\xA6 |0 # +<UF5BC> \x8C\xA7 |0 # +<UF5BD> \x8C\xA8 |0 # +<UF5BE> \x8C\xA9 |0 # +<UF5BF> \x8C\xAA |0 # +<UF5C0> \x8C\xAB |0 # +<UF5C1> \x8C\xAC |0 # +<UF5C2> \x8C\xAD |0 # +<UF5C3> \x8C\xAE |0 # +<UF5C4> \x8C\xAF |0 # +<UF5C5> \x8C\xB0 |0 # +<UF5C6> \x8C\xB1 |0 # +<UF5C7> \x8C\xB2 |0 # +<UF5C8> \x8C\xB3 |0 # +<UF5C9> \x8C\xB4 |0 # +<UF5CA> \x8C\xB5 |0 # +<UF5CB> \x8C\xB6 |0 # +<UF5CC> \x8C\xB7 |0 # +<UF5CD> \x8C\xB8 |0 # +<UF5CE> \x8C\xB9 |0 # +<UF5CF> \x8C\xBA |0 # +<UF5D0> \x8C\xBB |0 # +<UF5D1> \x8C\xBC |0 # +<UF5D2> \x8C\xBD |0 # +<UF5D3> \x8C\xBE |0 # +<UF5D4> \x8C\xBF |0 # +<UF5D5> \x8C\xC0 |0 # +<UF5D6> \x8C\xC1 |0 # +<UF5D7> \x8C\xC2 |0 # +<UF5D8> \x8C\xC3 |0 # +<UF5D9> \x8C\xC4 |0 # +<UF5DA> \x8C\xC5 |0 # +<UF5DB> \x8C\xC6 |0 # +<UF5DC> \x8C\xC7 |0 # +<UF5DD> \x8C\xC8 |0 # +<UF5DE> \x8C\xC9 |0 # +<UF5DF> \x8C\xCA |0 # +<UF5E0> \x8C\xCB |0 # +<UF5E1> \x8C\xCC |0 # +<UF5E2> \x8C\xCD |0 # +<UF5E3> \x8C\xCE |0 # +<UF5E4> \x8C\xCF |0 # +<UF5E5> \x8C\xD0 |0 # +<UF5E6> \x8C\xD1 |0 # +<UF5E7> \x8C\xD2 |0 # +<UF5E8> \x8C\xD3 |0 # +<UF5E9> \x8C\xD4 |0 # +<UF5EA> \x8C\xD5 |0 # +<UF5EB> \x8C\xD6 |0 # +<UF5EC> \x8C\xD7 |0 # +<UF5ED> \x8C\xD8 |0 # +<UF5EE> \x8C\xD9 |0 # +<UF5EF> \x8C\xDA |0 # +<UF5F0> \x8C\xDB |0 # +<UF5F1> \x8C\xDC |0 # +<UF5F2> \x8C\xDD |0 # +<UF5F3> \x8C\xDE |0 # +<UF5F4> \x8C\xDF |0 # +<UF5F5> \x8C\xE0 |0 # +<UF5F6> \x8C\xE1 |0 # +<UF5F7> \x8C\xE2 |0 # +<UF5F8> \x8C\xE3 |0 # +<UF5F9> \x8C\xE4 |0 # +<UF5FA> \x8C\xE5 |0 # +<UF5FB> \x8C\xE6 |0 # +<UF5FC> \x8C\xE7 |0 # +<UF5FD> \x8C\xE8 |0 # +<UF5FE> \x8C\xE9 |0 # +<UF5FF> \x8C\xEA |0 # +<UF600> \x8C\xEB |0 # +<UF601> \x8C\xEC |0 # +<UF602> \x8C\xED |0 # +<UF603> \x8C\xEE |0 # +<UF604> \x8C\xEF |0 # +<UF605> \x8C\xF0 |0 # +<UF606> \x8C\xF1 |0 # +<UF607> \x8C\xF2 |0 # +<UF608> \x8C\xF3 |0 # +<UF609> \x8C\xF4 |0 # +<UF60A> \x8C\xF5 |0 # +<UF60B> \x8C\xF6 |0 # +<UF60C> \x8C\xF7 |0 # +<UF60D> \x8C\xF8 |0 # +<UF60E> \x8C\xF9 |0 # +<UF60F> \x8C\xFA |0 # +<UF610> \x8C\xFB |0 # +<UF611> \x8C\xFC |0 # +<UF612> \x8C\xFD |0 # +<UF613> \x8C\xFE |0 # +<UF614> \x8D\x40 |0 # +<UF615> \x8D\x41 |0 # +<UF616> \x8D\x42 |0 # +<UF617> \x8D\x43 |0 # +<UF618> \x8D\x44 |0 # +<UF619> \x8D\x45 |0 # +<UF61A> \x8D\x46 |0 # +<UF61B> \x8D\x47 |0 # +<UF61C> \x8D\x48 |0 # +<UF61D> \x8D\x49 |0 # +<UF61E> \x8D\x4A |0 # +<UF61F> \x8D\x4B |0 # +<UF620> \x8D\x4C |0 # +<UF621> \x8D\x4D |0 # +<UF622> \x8D\x4E |0 # +<UF623> \x8D\x4F |0 # +<UF624> \x8D\x50 |0 # +<UF625> \x8D\x51 |0 # +<UF626> \x8D\x52 |0 # +<UF627> \x8D\x53 |0 # +<UF628> \x8D\x54 |0 # +<UF629> \x8D\x55 |0 # +<UF62A> \x8D\x56 |0 # +<UF62B> \x8D\x57 |0 # +<UF62C> \x8D\x58 |0 # +<UF62D> \x8D\x59 |0 # +<UF62E> \x8D\x5A |0 # +<UF62F> \x8D\x5B |0 # +<UF630> \x8D\x5C |0 # +<UF631> \x8D\x5D |0 # +<UF632> \x8D\x5E |0 # +<UF633> \x8D\x5F |0 # +<UF634> \x8D\x60 |0 # +<UF635> \x8D\x61 |0 # +<UF636> \x8D\x62 |0 # +<UF637> \x8D\x63 |0 # +<UF638> \x8D\x64 |0 # +<UF639> \x8D\x65 |0 # +<UF63A> \x8D\x66 |0 # +<UF63B> \x8D\x67 |0 # +<UF63C> \x8D\x68 |0 # +<UF63D> \x8D\x69 |0 # +<UF63E> \x8D\x6A |0 # +<UF63F> \x8D\x6B |0 # +<UF640> \x8D\x6C |0 # +<UF641> \x8D\x6D |0 # +<UF642> \x8D\x6E |0 # +<UF643> \x8D\x6F |0 # +<UF644> \x8D\x70 |0 # +<UF645> \x8D\x71 |0 # +<UF646> \x8D\x72 |0 # +<UF647> \x8D\x73 |0 # +<UF648> \x8D\x74 |0 # +<UF649> \x8D\x75 |0 # +<UF64A> \x8D\x76 |0 # +<UF64B> \x8D\x77 |0 # +<UF64C> \x8D\x78 |0 # +<UF64D> \x8D\x79 |0 # +<UF64E> \x8D\x7A |0 # +<UF64F> \x8D\x7B |0 # +<UF650> \x8D\x7C |0 # +<UF651> \x8D\x7D |0 # +<UF652> \x8D\x7E |0 # +<UF653> \x8D\xA1 |0 # +<UF654> \x8D\xA2 |0 # +<UF655> \x8D\xA3 |0 # +<UF656> \x8D\xA4 |0 # +<UF657> \x8D\xA5 |0 # +<UF658> \x8D\xA6 |0 # +<UF659> \x8D\xA7 |0 # +<UF65A> \x8D\xA8 |0 # +<UF65B> \x8D\xA9 |0 # +<UF65C> \x8D\xAA |0 # +<UF65D> \x8D\xAB |0 # +<UF65E> \x8D\xAC |0 # +<UF65F> \x8D\xAD |0 # +<UF660> \x8D\xAE |0 # +<UF661> \x8D\xAF |0 # +<UF662> \x8D\xB0 |0 # +<UF663> \x8D\xB1 |0 # +<UF664> \x8D\xB2 |0 # +<UF665> \x8D\xB3 |0 # +<UF666> \x8D\xB4 |0 # +<UF667> \x8D\xB5 |0 # +<UF668> \x8D\xB6 |0 # +<UF669> \x8D\xB7 |0 # +<UF66A> \x8D\xB8 |0 # +<UF66B> \x8D\xB9 |0 # +<UF66C> \x8D\xBA |0 # +<UF66D> \x8D\xBB |0 # +<UF66E> \x8D\xBC |0 # +<UF66F> \x8D\xBD |0 # +<UF670> \x8D\xBE |0 # +<UF671> \x8D\xBF |0 # +<UF672> \x8D\xC0 |0 # +<UF673> \x8D\xC1 |0 # +<UF674> \x8D\xC2 |0 # +<UF675> \x8D\xC3 |0 # +<UF676> \x8D\xC4 |0 # +<UF677> \x8D\xC5 |0 # +<UF678> \x8D\xC6 |0 # +<UF679> \x8D\xC7 |0 # +<UF67A> \x8D\xC8 |0 # +<UF67B> \x8D\xC9 |0 # +<UF67C> \x8D\xCA |0 # +<UF67D> \x8D\xCB |0 # +<UF67E> \x8D\xCC |0 # +<UF67F> \x8D\xCD |0 # +<UF680> \x8D\xCE |0 # +<UF681> \x8D\xCF |0 # +<UF682> \x8D\xD0 |0 # +<UF683> \x8D\xD1 |0 # +<UF684> \x8D\xD2 |0 # +<UF685> \x8D\xD3 |0 # +<UF686> \x8D\xD4 |0 # +<UF687> \x8D\xD5 |0 # +<UF688> \x8D\xD6 |0 # +<UF689> \x8D\xD7 |0 # +<UF68A> \x8D\xD8 |0 # +<UF68B> \x8D\xD9 |0 # +<UF68C> \x8D\xDA |0 # +<UF68D> \x8D\xDB |0 # +<UF68E> \x8D\xDC |0 # +<UF68F> \x8D\xDD |0 # +<UF690> \x8D\xDE |0 # +<UF691> \x8D\xDF |0 # +<UF692> \x8D\xE0 |0 # +<UF693> \x8D\xE1 |0 # +<UF694> \x8D\xE2 |0 # +<UF695> \x8D\xE3 |0 # +<UF696> \x8D\xE4 |0 # +<UF697> \x8D\xE5 |0 # +<UF698> \x8D\xE6 |0 # +<UF699> \x8D\xE7 |0 # +<UF69A> \x8D\xE8 |0 # +<UF69B> \x8D\xE9 |0 # +<UF69C> \x8D\xEA |0 # +<UF69D> \x8D\xEB |0 # +<UF69E> \x8D\xEC |0 # +<UF69F> \x8D\xED |0 # +<UF6A0> \x8D\xEE |0 # +<UF6A1> \x8D\xEF |0 # +<UF6A2> \x8D\xF0 |0 # +<UF6A3> \x8D\xF1 |0 # +<UF6A4> \x8D\xF2 |0 # +<UF6A5> \x8D\xF3 |0 # +<UF6A6> \x8D\xF4 |0 # +<UF6A7> \x8D\xF5 |0 # +<UF6A8> \x8D\xF6 |0 # +<UF6A9> \x8D\xF7 |0 # +<UF6AA> \x8D\xF8 |0 # +<UF6AB> \x8D\xF9 |0 # +<UF6AC> \x8D\xFA |0 # +<UF6AD> \x8D\xFB |0 # +<UF6AE> \x8D\xFC |0 # +<UF6AF> \x8D\xFD |0 # +<UF6B0> \x8D\xFE |0 # +<UF6B1> \xC6\xA1 |0 # +<UF6B2> \xC6\xA2 |0 # +<UF6B3> \xC6\xA3 |0 # +<UF6B4> \xC6\xA4 |0 # +<UF6B5> \xC6\xA5 |0 # +<UF6B6> \xC6\xA6 |0 # +<UF6B7> \xC6\xA7 |0 # +<UF6B8> \xC6\xA8 |0 # +<UF6B9> \xC6\xA9 |0 # +<UF6BA> \xC6\xAA |0 # +<UF6BB> \xC6\xAB |0 # +<UF6BC> \xC6\xAC |0 # +<UF6BD> \xC6\xAD |0 # +<UF6BE> \xC6\xAE |0 # +<UF6BF> \xC6\xAF |0 # +<UF6C0> \xC6\xB0 |0 # +<UF6C1> \xC6\xB1 |0 # +<UF6C2> \xC6\xB2 |0 # +<UF6C3> \xC6\xB3 |0 # +<UF6C4> \xC6\xB4 |0 # +<UF6C5> \xC6\xB5 |0 # +<UF6C6> \xC6\xB6 |0 # +<UF6C7> \xC6\xB7 |0 # +<UF6C8> \xC6\xB8 |0 # +<UF6C9> \xC6\xB9 |0 # +<UF6CA> \xC6\xBA |0 # +<UF6CB> \xC6\xBB |0 # +<UF6CC> \xC6\xBC |0 # +<UF6CD> \xC6\xBD |0 # +<UF6CE> \xC6\xBE |0 # +<UF6CF> \xC6\xBF |0 # +<UF6D0> \xC6\xC0 |0 # +<UF6D1> \xC6\xC1 |0 # +<UF6D2> \xC6\xC2 |0 # +<UF6D3> \xC6\xC3 |0 # +<UF6D4> \xC6\xC4 |0 # +<UF6D5> \xC6\xC5 |0 # +<UF6D6> \xC6\xC6 |0 # +<UF6D7> \xC6\xC7 |0 # +<UF6D8> \xC6\xC8 |0 # +<UF6D9> \xC6\xC9 |0 # +<UF6DA> \xC6\xCA |0 # +<UF6DB> \xC6\xCB |0 # +<UF6DC> \xC6\xCC |0 # +<UF6DD> \xC6\xCD |0 # +<UF6DE> \xC6\xCE |0 # +<UF6DF> \xC6\xCF |0 # +<UF6E0> \xC6\xD0 |0 # +<UF6E1> \xC6\xD1 |0 # +<UF6E2> \xC6\xD2 |0 # +<UF6E3> \xC6\xD3 |0 # +<UF6E4> \xC6\xD4 |0 # +<UF6E5> \xC6\xD5 |0 # +<UF6E6> \xC6\xD6 |0 # +<UF6E7> \xC6\xD7 |0 # +<UF6E8> \xC6\xD8 |0 # +<UF6E9> \xC6\xD9 |0 # +<UF6EA> \xC6\xDA |0 # +<UF6EB> \xC6\xDB |0 # +<UF6EC> \xC6\xDC |0 # +<UF6ED> \xC6\xDD |0 # +<UF6EE> \xC6\xDE |0 # +<UF6EF> \xC6\xDF |0 # +<UF6F0> \xC6\xE0 |0 # +<UF6F1> \xC6\xE1 |0 # +<UF6F2> \xC6\xE2 |0 # +<UF6F3> \xC6\xE3 |0 # +<UF6F4> \xC6\xE4 |0 # +<UF6F5> \xC6\xE5 |0 # +<UF6F6> \xC6\xE6 |0 # +<UF6F7> \xC6\xE7 |0 # +<UF6F8> \xC6\xE8 |0 # +<UF6F9> \xC6\xE9 |0 # +<UF6FA> \xC6\xEA |0 # +<UF6FB> \xC6\xEB |0 # +<UF6FC> \xC6\xEC |0 # +<UF6FD> \xC6\xED |0 # +<UF6FE> \xC6\xEE |0 # +<UF6FF> \xC6\xEF |0 # +<UF700> \xC6\xF0 |0 # +<UF701> \xC6\xF1 |0 # +<UF702> \xC6\xF2 |0 # +<UF703> \xC6\xF3 |0 # +<UF704> \xC6\xF4 |0 # +<UF705> \xC6\xF5 |0 # +<UF706> \xC6\xF6 |0 # +<UF707> \xC6\xF7 |0 # +<UF708> \xC6\xF8 |0 # +<UF709> \xC6\xF9 |0 # +<UF70A> \xC6\xFA |0 # +<UF70B> \xC6\xFB |0 # +<UF70C> \xC6\xFC |0 # +<UF70D> \xC6\xFD |0 # +<UF70E> \xC6\xFE |0 # +<UF70F> \xC7\x40 |0 # +<UF710> \xC7\x41 |0 # +<UF711> \xC7\x42 |0 # +<UF712> \xC7\x43 |0 # +<UF713> \xC7\x44 |0 # +<UF714> \xC7\x45 |0 # +<UF715> \xC7\x46 |0 # +<UF716> \xC7\x47 |0 # +<UF717> \xC7\x48 |0 # +<UF718> \xC7\x49 |0 # +<UF719> \xC7\x4A |0 # +<UF71A> \xC7\x4B |0 # +<UF71B> \xC7\x4C |0 # +<UF71C> \xC7\x4D |0 # +<UF71D> \xC7\x4E |0 # +<UF71E> \xC7\x4F |0 # +<UF71F> \xC7\x50 |0 # +<UF720> \xC7\x51 |0 # +<UF721> \xC7\x52 |0 # +<UF722> \xC7\x53 |0 # +<UF723> \xC7\x54 |0 # +<UF724> \xC7\x55 |0 # +<UF725> \xC7\x56 |0 # +<UF726> \xC7\x57 |0 # +<UF727> \xC7\x58 |0 # +<UF728> \xC7\x59 |0 # +<UF729> \xC7\x5A |0 # +<UF72A> \xC7\x5B |0 # +<UF72B> \xC7\x5C |0 # +<UF72C> \xC7\x5D |0 # +<UF72D> \xC7\x5E |0 # +<UF72E> \xC7\x5F |0 # +<UF72F> \xC7\x60 |0 # +<UF730> \xC7\x61 |0 # +<UF731> \xC7\x62 |0 # +<UF732> \xC7\x63 |0 # +<UF733> \xC7\x64 |0 # +<UF734> \xC7\x65 |0 # +<UF735> \xC7\x66 |0 # +<UF736> \xC7\x67 |0 # +<UF737> \xC7\x68 |0 # +<UF738> \xC7\x69 |0 # +<UF739> \xC7\x6A |0 # +<UF73A> \xC7\x6B |0 # +<UF73B> \xC7\x6C |0 # +<UF73C> \xC7\x6D |0 # +<UF73D> \xC7\x6E |0 # +<UF73E> \xC7\x6F |0 # +<UF73F> \xC7\x70 |0 # +<UF740> \xC7\x71 |0 # +<UF741> \xC7\x72 |0 # +<UF742> \xC7\x73 |0 # +<UF743> \xC7\x74 |0 # +<UF744> \xC7\x75 |0 # +<UF745> \xC7\x76 |0 # +<UF746> \xC7\x77 |0 # +<UF747> \xC7\x78 |0 # +<UF748> \xC7\x79 |0 # +<UF749> \xC7\x7A |0 # +<UF74A> \xC7\x7B |0 # +<UF74B> \xC7\x7C |0 # +<UF74C> \xC7\x7D |0 # +<UF74D> \xC7\x7E |0 # +<UF74E> \xC7\xA1 |0 # +<UF74F> \xC7\xA2 |0 # +<UF750> \xC7\xA3 |0 # +<UF751> \xC7\xA4 |0 # +<UF752> \xC7\xA5 |0 # +<UF753> \xC7\xA6 |0 # +<UF754> \xC7\xA7 |0 # +<UF755> \xC7\xA8 |0 # +<UF756> \xC7\xA9 |0 # +<UF757> \xC7\xAA |0 # +<UF758> \xC7\xAB |0 # +<UF759> \xC7\xAC |0 # +<UF75A> \xC7\xAD |0 # +<UF75B> \xC7\xAE |0 # +<UF75C> \xC7\xAF |0 # +<UF75D> \xC7\xB0 |0 # +<UF75E> \xC7\xB1 |0 # +<UF75F> \xC7\xB2 |0 # +<UF760> \xC7\xB3 |0 # +<UF761> \xC7\xB4 |0 # +<UF762> \xC7\xB5 |0 # +<UF763> \xC7\xB6 |0 # +<UF764> \xC7\xB7 |0 # +<UF765> \xC7\xB8 |0 # +<UF766> \xC7\xB9 |0 # +<UF767> \xC7\xBA |0 # +<UF768> \xC7\xBB |0 # +<UF769> \xC7\xBC |0 # +<UF76A> \xC7\xBD |0 # +<UF76B> \xC7\xBE |0 # +<UF76C> \xC7\xBF |0 # +<UF76D> \xC7\xC0 |0 # +<UF76E> \xC7\xC1 |0 # +<UF76F> \xC7\xC2 |0 # +<UF770> \xC7\xC3 |0 # +<UF771> \xC7\xC4 |0 # +<UF772> \xC7\xC5 |0 # +<UF773> \xC7\xC6 |0 # +<UF774> \xC7\xC7 |0 # +<UF775> \xC7\xC8 |0 # +<UF776> \xC7\xC9 |0 # +<UF777> \xC7\xCA |0 # +<UF778> \xC7\xCB |0 # +<UF779> \xC7\xCC |0 # +<UF77A> \xC7\xCD |0 # +<UF77B> \xC7\xCE |0 # +<UF77C> \xC7\xCF |0 # +<UF77D> \xC7\xD0 |0 # +<UF77E> \xC7\xD1 |0 # +<UF77F> \xC7\xD2 |0 # +<UF780> \xC7\xD3 |0 # +<UF781> \xC7\xD4 |0 # +<UF782> \xC7\xD5 |0 # +<UF783> \xC7\xD6 |0 # +<UF784> \xC7\xD7 |0 # +<UF785> \xC7\xD8 |0 # +<UF786> \xC7\xD9 |0 # +<UF787> \xC7\xDA |0 # +<UF788> \xC7\xDB |0 # +<UF789> \xC7\xDC |0 # +<UF78A> \xC7\xDD |0 # +<UF78B> \xC7\xDE |0 # +<UF78C> \xC7\xDF |0 # +<UF78D> \xC7\xE0 |0 # +<UF78E> \xC7\xE1 |0 # +<UF78F> \xC7\xE2 |0 # +<UF790> \xC7\xE3 |0 # +<UF791> \xC7\xE4 |0 # +<UF792> \xC7\xE5 |0 # +<UF793> \xC7\xE6 |0 # +<UF794> \xC7\xE7 |0 # +<UF795> \xC7\xE8 |0 # +<UF796> \xC7\xE9 |0 # +<UF797> \xC7\xEA |0 # +<UF798> \xC7\xEB |0 # +<UF799> \xC7\xEC |0 # +<UF79A> \xC7\xED |0 # +<UF79B> \xC7\xEE |0 # +<UF79C> \xC7\xEF |0 # +<UF79D> \xC7\xF0 |0 # +<UF79E> \xC7\xF1 |0 # +<UF79F> \xC7\xF2 |0 # +<UF7A0> \xC7\xF3 |0 # +<UF7A1> \xC7\xF4 |0 # +<UF7A2> \xC7\xF5 |0 # +<UF7A3> \xC7\xF6 |0 # +<UF7A4> \xC7\xF7 |0 # +<UF7A5> \xC7\xF8 |0 # +<UF7A6> \xC7\xF9 |0 # +<UF7A7> \xC7\xFA |0 # +<UF7A8> \xC7\xFB |0 # +<UF7A9> \xC7\xFC |0 # +<UF7AA> \xC7\xFD |0 # +<UF7AB> \xC7\xFE |0 # +<UF7AC> \xC8\x40 |0 # +<UF7AD> \xC8\x41 |0 # +<UF7AE> \xC8\x42 |0 # +<UF7AF> \xC8\x43 |0 # +<UF7B0> \xC8\x44 |0 # +<UF7B1> \xC8\x45 |0 # +<UF7B2> \xC8\x46 |0 # +<UF7B3> \xC8\x47 |0 # +<UF7B4> \xC8\x48 |0 # +<UF7B5> \xC8\x49 |0 # +<UF7B6> \xC8\x4A |0 # +<UF7B7> \xC8\x4B |0 # +<UF7B8> \xC8\x4C |0 # +<UF7B9> \xC8\x4D |0 # +<UF7BA> \xC8\x4E |0 # +<UF7BB> \xC8\x4F |0 # +<UF7BC> \xC8\x50 |0 # +<UF7BD> \xC8\x51 |0 # +<UF7BE> \xC8\x52 |0 # +<UF7BF> \xC8\x53 |0 # +<UF7C0> \xC8\x54 |0 # +<UF7C1> \xC8\x55 |0 # +<UF7C2> \xC8\x56 |0 # +<UF7C3> \xC8\x57 |0 # +<UF7C4> \xC8\x58 |0 # +<UF7C5> \xC8\x59 |0 # +<UF7C6> \xC8\x5A |0 # +<UF7C7> \xC8\x5B |0 # +<UF7C8> \xC8\x5C |0 # +<UF7C9> \xC8\x5D |0 # +<UF7CA> \xC8\x5E |0 # +<UF7CB> \xC8\x5F |0 # +<UF7CC> \xC8\x60 |0 # +<UF7CD> \xC8\x61 |0 # +<UF7CE> \xC8\x62 |0 # +<UF7CF> \xC8\x63 |0 # +<UF7D0> \xC8\x64 |0 # +<UF7D1> \xC8\x65 |0 # +<UF7D2> \xC8\x66 |0 # +<UF7D3> \xC8\x67 |0 # +<UF7D4> \xC8\x68 |0 # +<UF7D5> \xC8\x69 |0 # +<UF7D6> \xC8\x6A |0 # +<UF7D7> \xC8\x6B |0 # +<UF7D8> \xC8\x6C |0 # +<UF7D9> \xC8\x6D |0 # +<UF7DA> \xC8\x6E |0 # +<UF7DB> \xC8\x6F |0 # +<UF7DC> \xC8\x70 |0 # +<UF7DD> \xC8\x71 |0 # +<UF7DE> \xC8\x72 |0 # +<UF7DF> \xC8\x73 |0 # +<UF7E0> \xC8\x74 |0 # +<UF7E1> \xC8\x75 |0 # +<UF7E2> \xC8\x76 |0 # +<UF7E3> \xC8\x77 |0 # +<UF7E4> \xC8\x78 |0 # +<UF7E5> \xC8\x79 |0 # +<UF7E6> \xC8\x7A |0 # +<UF7E7> \xC8\x7B |0 # +<UF7E8> \xC8\x7C |0 # +<UF7E9> \xC8\x7D |0 # +<UF7EA> \xC8\x7E |0 # +<UF7EB> \xC8\xA1 |0 # +<UF7EC> \xC8\xA2 |0 # +<UF7ED> \xC8\xA3 |0 # +<UF7EE> \xC8\xA4 |0 # +<UF7EF> \xC8\xA5 |0 # +<UF7F0> \xC8\xA6 |0 # +<UF7F1> \xC8\xA7 |0 # +<UF7F2> \xC8\xA8 |0 # +<UF7F3> \xC8\xA9 |0 # +<UF7F4> \xC8\xAA |0 # +<UF7F5> \xC8\xAB |0 # +<UF7F6> \xC8\xAC |0 # +<UF7F7> \xC8\xAD |0 # +<UF7F8> \xC8\xAE |0 # +<UF7F9> \xC8\xAF |0 # +<UF7FA> \xC8\xB0 |0 # +<UF7FB> \xC8\xB1 |0 # +<UF7FC> \xC8\xB2 |0 # +<UF7FD> \xC8\xB3 |0 # +<UF7FE> \xC8\xB4 |0 # +<UF7FF> \xC8\xB5 |0 # +<UF800> \xC8\xB6 |0 # +<UF801> \xC8\xB7 |0 # +<UF802> \xC8\xB8 |0 # +<UF803> \xC8\xB9 |0 # +<UF804> \xC8\xBA |0 # +<UF805> \xC8\xBB |0 # +<UF806> \xC8\xBC |0 # +<UF807> \xC8\xBD |0 # +<UF808> \xC8\xBE |0 # +<UF809> \xC8\xBF |0 # +<UF80A> \xC8\xC0 |0 # +<UF80B> \xC8\xC1 |0 # +<UF80C> \xC8\xC2 |0 # +<UF80D> \xC8\xC3 |0 # +<UF80E> \xC8\xC4 |0 # +<UF80F> \xC8\xC5 |0 # +<UF810> \xC8\xC6 |0 # +<UF811> \xC8\xC7 |0 # +<UF812> \xC8\xC8 |0 # +<UF813> \xC8\xC9 |0 # +<UF814> \xC8\xCA |0 # +<UF815> \xC8\xCB |0 # +<UF816> \xC8\xCC |0 # +<UF817> \xC8\xCD |0 # +<UF818> \xC8\xCE |0 # +<UF819> \xC8\xCF |0 # +<UF81A> \xC8\xD0 |0 # +<UF81B> \xC8\xD1 |0 # +<UF81C> \xC8\xD2 |0 # +<UF81D> \xC8\xD3 |0 # +<UF81E> \xC8\xD4 |0 # +<UF81F> \xC8\xD5 |0 # +<UF820> \xC8\xD6 |0 # +<UF821> \xC8\xD7 |0 # +<UF822> \xC8\xD8 |0 # +<UF823> \xC8\xD9 |0 # +<UF824> \xC8\xDA |0 # +<UF825> \xC8\xDB |0 # +<UF826> \xC8\xDC |0 # +<UF827> \xC8\xDD |0 # +<UF828> \xC8\xDE |0 # +<UF829> \xC8\xDF |0 # +<UF82A> \xC8\xE0 |0 # +<UF82B> \xC8\xE1 |0 # +<UF82C> \xC8\xE2 |0 # +<UF82D> \xC8\xE3 |0 # +<UF82E> \xC8\xE4 |0 # +<UF82F> \xC8\xE5 |0 # +<UF830> \xC8\xE6 |0 # +<UF831> \xC8\xE7 |0 # +<UF832> \xC8\xE8 |0 # +<UF833> \xC8\xE9 |0 # +<UF834> \xC8\xEA |0 # +<UF835> \xC8\xEB |0 # +<UF836> \xC8\xEC |0 # +<UF837> \xC8\xED |0 # +<UF838> \xC8\xEE |0 # +<UF839> \xC8\xEF |0 # +<UF83A> \xC8\xF0 |0 # +<UF83B> \xC8\xF1 |0 # +<UF83C> \xC8\xF2 |0 # +<UF83D> \xC8\xF3 |0 # +<UF83E> \xC8\xF4 |0 # +<UF83F> \xC8\xF5 |0 # +<UF840> \xC8\xF6 |0 # +<UF841> \xC8\xF7 |0 # +<UF842> \xC8\xF8 |0 # +<UF843> \xC8\xF9 |0 # +<UF844> \xC8\xFA |0 # +<UF845> \xC8\xFB |0 # +<UF846> \xC8\xFC |0 # +<UF847> \xC8\xFD |0 # +<UF848> \xC8\xFE |0 # +<UF8F8> \xFF |0 # <UFA0C> \xC9\x4A |0 # CJK COMPATIBILITY IDEOGRAPH <UFA0D> \xDD\xFC |0 # CJK COMPATIBILITY IDEOGRAPH <UFE30> \xA1\x4A |0 # PRESENTATION FORM FOR VERTICAL TWO DOT LEADER diff --git a/ext/GDBM_File/GDBM_File.xs b/ext/GDBM_File/GDBM_File.xs index 5684a968e0..22350fd692 100644 --- a/ext/GDBM_File/GDBM_File.xs +++ b/ext/GDBM_File/GDBM_File.xs @@ -19,26 +19,6 @@ typedef datum datum_key ; typedef datum datum_value ; typedef datum datum_key_copy; -#define ckFilter(arg,type,name) \ - if (db->type) { \ - SV * save_defsv ; \ - /* printf("filtering %s\n", name) ;*/ \ - if (db->filtering) \ - croak("recursion detected in %s", name) ; \ - db->filtering = TRUE ; \ - save_defsv = newSVsv(DEFSV) ; \ - sv_setsv(DEFSV, arg) ; \ - PUSHMARK(sp) ; \ - (void) perl_call_sv(db->type, G_DISCARD|G_NOARGS); \ - sv_setsv(arg, DEFSV) ; \ - sv_setsv(DEFSV, save_defsv) ; \ - SvREFCNT_dec(save_defsv) ; \ - db->filtering = FALSE ; \ - /*printf("end of filtering %s\n", name) ;*/ \ - } - - - #define GDBM_BLOCKSIZE 0 /* gdbm defaults to stat blocksize */ typedef void (*FATALFUNC)(); @@ -183,32 +163,13 @@ gdbm_setopt (db, optflag, optval, optlen) int optlen -#define setFilter(type) \ - { \ - if (db->type) \ - RETVAL = sv_mortalcopy(db->type) ; \ - ST(0) = RETVAL ; \ - if (db->type && (code == &PL_sv_undef)) { \ - SvREFCNT_dec(db->type) ; \ - db->type = NULL ; \ - } \ - else if (code) { \ - if (db->type) \ - sv_setsv(db->type, code) ; \ - else \ - db->type = newSVsv(code) ; \ - } \ - } - - - SV * filter_fetch_key(db, code) GDBM_File db SV * code SV * RETVAL = &PL_sv_undef ; CODE: - setFilter(filter_fetch_key) ; + DBM_setFilter(db->filter_fetch_key, code) ; SV * filter_store_key(db, code) @@ -216,7 +177,7 @@ filter_store_key(db, code) SV * code SV * RETVAL = &PL_sv_undef ; CODE: - setFilter(filter_store_key) ; + DBM_setFilter(db->filter_store_key, code) ; SV * filter_fetch_value(db, code) @@ -224,7 +185,7 @@ filter_fetch_value(db, code) SV * code SV * RETVAL = &PL_sv_undef ; CODE: - setFilter(filter_fetch_value) ; + DBM_setFilter(db->filter_fetch_value, code) ; SV * filter_store_value(db, code) @@ -232,5 +193,5 @@ filter_store_value(db, code) SV * code SV * RETVAL = &PL_sv_undef ; CODE: - setFilter(filter_store_value) ; + DBM_setFilter(db->filter_store_value, code) ; diff --git a/ext/GDBM_File/gdbm.t b/ext/GDBM_File/gdbm.t index 7c268936f3..87e30d086b 100755 --- a/ext/GDBM_File/gdbm.t +++ b/ext/GDBM_File/gdbm.t @@ -18,7 +18,7 @@ use warnings; use GDBM_File; -print "1..74\n"; +print "1..80\n"; unlink <Op.dbmx*>; @@ -467,4 +467,47 @@ EOM unlink <Op.dbmx*>; } +{ + # Check that DBM Filter can cope with read-only $_ + + use warnings ; + use strict ; + my %h ; + unlink <Op.dbmx*>; + + ok(75, my $db = tie(%h, 'GDBM_File','Op.dbmx', &GDBM_WRCREAT, 0640)); + + $db->filter_fetch_key (sub { }) ; + $db->filter_store_key (sub { }) ; + $db->filter_fetch_value (sub { }) ; + $db->filter_store_value (sub { }) ; + + $_ = "original" ; + + $h{"fred"} = "joe" ; + ok(76, $h{"fred"} eq "joe"); + + eval { grep { $h{$_} } (1, 2, 3) }; + ok (77, ! $@); + + + # delete the filters + $db->filter_fetch_key (undef); + $db->filter_store_key (undef); + $db->filter_fetch_value (undef); + $db->filter_store_value (undef); + + $h{"fred"} = "joe" ; + + ok(78, $h{"fred"} eq "joe"); + + ok(79, $db->FIRSTKEY() eq "fred") ; + + eval { grep { $h{$_} } (1, 2, 3) }; + ok (80, ! $@); + + undef $db ; + untie %h; + unlink <Op.dbmx*>; +} exit ; diff --git a/ext/GDBM_File/typemap b/ext/GDBM_File/typemap index 8952938ccd..048f0dd11c 100644 --- a/ext/GDBM_File/typemap +++ b/ext/GDBM_File/typemap @@ -15,7 +15,7 @@ FATALFUNC T_OPAQUEPTR INPUT T_DATUM_K - ckFilter($arg, filter_store_key, \"filter_store_key\"); + DBM_ckFilter($arg, filter_store_key, \"filter_store_key\"); $var.dptr = SvPV($arg, PL_na); $var.dsize = (int)PL_na; T_DATUM_K_C @@ -23,7 +23,7 @@ T_DATUM_K_C SV * tmpSV; if (db->filter_store_key) { tmpSV = sv_2mortal(newSVsv($arg)); - ckFilter(tmpSV, filter_store_key, \"filter_store_key\"); + DBM_ckFilter(tmpSV, filter_store_key, \"filter_store_key\"); } else tmpSV = $arg; @@ -31,7 +31,7 @@ T_DATUM_K_C $var.dsize = (int)PL_na; } T_DATUM_V - ckFilter($arg, filter_store_value, \"filter_store_value\"); + DBM_ckFilter($arg, filter_store_value, \"filter_store_value\"); if (SvOK($arg)) { $var.dptr = SvPV($arg, PL_na); $var.dsize = (int)PL_na; @@ -43,9 +43,9 @@ T_DATUM_V OUTPUT T_DATUM_K output_datum(aTHX_ $arg, $var.dptr, $var.dsize); - ckFilter($arg, filter_fetch_key,\"filter_fetch_key\"); + DBM_ckFilter($arg, filter_fetch_key,\"filter_fetch_key\"); T_DATUM_V output_datum(aTHX_ $arg, $var.dptr, $var.dsize); - ckFilter($arg, filter_fetch_value,\"filter_fetch_value\"); + DBM_ckFilter($arg, filter_fetch_value,\"filter_fetch_value\"); T_PTROBJ sv_setref_pv($arg, dbtype, (void*)$var); diff --git a/ext/IO/IO.pm b/ext/IO/IO.pm index 0087530c7e..287671e797 100644 --- a/ext/IO/IO.pm +++ b/ext/IO/IO.pm @@ -4,12 +4,18 @@ package IO; use XSLoader (); use Carp; +use strict; +use warnings; -$VERSION = "1.20"; +our $VERSION = "1.20"; XSLoader::load 'IO', $VERSION; sub import { shift; + + warnings::warnif('deprecated', qq{parameterless "use IO" deprecated}) + if @_ == 0 ; + my @l = @_ ? @_ : qw(Handle Seekable File Pipe Socket Dir); eval join("", map { "require IO::" . (/(\w+)/)[0] . ";\n" } @l) @@ -26,12 +32,13 @@ IO - load various IO modules =head1 SYNOPSIS - use IO; + use IO qw(Handle File); # loads IO modules, here IO::Handle, IO::File + use IO; # DEPRECATED =head1 DESCRIPTION -C<IO> provides a simple mechanism to load some of the IO modules at one go. -Currently this includes: +C<IO> provides a simple mechanism to load several of the IO modules +in one go. The IO modules belonging to the core are: IO::Handle IO::Seekable @@ -39,9 +46,23 @@ Currently this includes: IO::Pipe IO::Socket IO::Dir + IO::Select + IO::Poll + +Some other IO modules don't belong to the perl core but can be loaded +as well if they have been installed from CPAN. You can discover which +ones exist by searching for "^IO::" on http://search.cpan.org. For more information on any of these modules, please see its respective documentation. +=head1 DEPRECATED + + use IO; # loads all the modules listed below + +The loaded modules are IO::Handle, IO::Seekable, IO::File, IO::Pipe, +IO::Socket, IO::Dir. You should instead explicitly import the IO +modules you want. + =cut diff --git a/ext/IO/lib/IO/t/IO.t b/ext/IO/lib/IO/t/IO.t new file mode 100644 index 0000000000..89226af71a --- /dev/null +++ b/ext/IO/lib/IO/t/IO.t @@ -0,0 +1,121 @@ +#!/usr/bin/perl -w + +BEGIN +{ + chdir 't' if -d 't'; + @INC = '../lib'; +} + +use strict; +use File::Path; +use File::Spec; +use Test::More tests => 18; + +{ + local $INC{'XSLoader.pm'} = 1; + local *XSLoader::load; + + my @load; + *XSLoader::load = sub { + push @load, \@_; + }; + + # use_ok() calls import, which we do not want to do + require_ok( 'IO' ); + ok( @load, 'IO should call XSLoader::load()' ); + is( $load[0][0], 'IO', '... loading the IO library' ); + is( $load[0][1], $IO::VERSION, '... with the current .pm version' ); +} + +my @default = map { "IO/$_.pm" } qw( Handle Seekable File Pipe Socket Dir ); +delete @INC{ @default }; + +my $warn = '' ; +local $SIG{__WARN__} = sub { $warn = "@_" } ; + +{ + no warnings ; + IO->import(); + is( $warn, '', "... import default, should not warn"); + $warn = '' ; +} + +{ + local $^W = 0; + IO->import(); + is( $warn, '', "... import default, should not warn"); + $warn = '' ; +} + +{ + local $^W = 1; + IO->import(); + like( $warn, qr/^parameterless "use IO" deprecated at/, + "... import default, should warn"); + $warn = '' ; +} + +{ + use warnings 'deprecated' ; + IO->import(); + like( $warn, qr/^parameterless "use IO" deprecated at/, + "... import default, should warn"); + $warn = '' ; +} + +{ + use warnings ; + IO->import(); + like( $warn, qr/^parameterless "use IO" deprecated at/, + "... import default, should warn"); + $warn = '' ; +} + +foreach my $default (@default) +{ + ok( exists $INC{ $default }, "... import should default load $default" ); +} + +eval { IO->import( 'nothere' ) }; +like( $@, qr/Can.t locate IO.nothere\.pm/, '... croaking on any error' ); + +my $fakedir = File::Spec->catdir( 'lib', 'IO' ); +my $fakemod = File::Spec->catfile( $fakedir, 'fakemod.pm' ); + +my $flag; +if ( -d $fakedir or mkpath( $fakedir )) +{ + if (open( OUT, ">$fakemod")) + { + (my $package = <<' END_HERE') =~ tr/\t//d; + package IO::fakemod; + + sub import { die "Do not import!\n" } + + sub exists { 1 } + + 1; + END_HERE + + print OUT $package; + } + + if (close OUT) + { + $flag = 1; + push @INC, 'lib'; + } +} + +SKIP: +{ + skip("Could not write to disk", 2 ) unless $flag; + eval { IO->import( 'fakemod' ) }; + ok( IO::fakemod::exists(), 'import() should import IO:: modules by name' ); + is( $@, '', '... and should not call import() on imported modules' ); +} + +END +{ + 1 while unlink $fakemod; +} diff --git a/ext/IPC/SysV/Semaphore.pm b/ext/IPC/SysV/Semaphore.pm index cdbfb77790..5816f9c1e9 100644 --- a/ext/IPC/SysV/Semaphore.pm +++ b/ext/IPC/SysV/Semaphore.pm @@ -111,7 +111,7 @@ sub set { else { croak 'Bad arg count' if @_ % 2; my %arg = @_; - my $ds = $self->stat + $ds = $self->stat or return undef; my($key,$val); $ds->$key($val) diff --git a/ext/List/Util/ChangeLog b/ext/List/Util/ChangeLog index 934643ace1..89e33e91d9 100644 --- a/ext/List/Util/ChangeLog +++ b/ext/List/Util/ChangeLog @@ -1,3 +1,39 @@ +Change 757 on 2002/11/03 by <gbarr@pobox.com> (Graham Barr) + + Add XS_VERSION + +Change 756 on 2002/11/03 by <gbarr@pobox.com> (Graham Barr) + + Use PAD_* macros in 5.9 + Reuse our own target when calling pp_rand in shuffle() so we dont need to create a fake pad + +Change 751 on 2002/10/18 by <gbarr@pobox.com> (Graham Barr) + + Fix context so that sub for reduce/first is always in a scalar context + Fix sum/min/max so that they dont upgrade thier argumetns to NVs + if they are IV or UV + +Change 750 on 2002/10/14 by <gbarr@pobox.com> (Graham Barr) + + Add isvstring() + +Change 745 on 2002/09/23 by <gbarr@pobox.com> (Graham Barr) + + Scalar::Util + - Add refaddr() + +Change 722 on 2002/04/29 by <gbarr@pobox.com> (Graham Barr) + + Release 1.0701 + +Change 721 on 2002/04/29 by <gbarr@pobox.com> (Graham Barr) + + Add comment to README about failing tests on perl5.6.0 + +Change 714 on 2002/03/18 by <gbarr@pobox.com> (Graham Barr) + + Release 1.07 + Change 713 on 2002/03/18 by <gbarr@pobox.com> (Graham Barr) Add Scalar::Util::openhandle() diff --git a/ext/List/Util/README b/ext/List/Util/README index 2e5aba9095..e384354d40 100644 --- a/ext/List/Util/README +++ b/ext/List/Util/README @@ -27,6 +27,12 @@ This distribution provides dualvar shuffle -Copyright (c) 1997-2001 Graham Barr <gbarr@pobox.com>. All rights reserved. +KNOWN BUGS + +There is a bug in perl5.6.0 with UV's that are >= 1<<31. This will +show up as tests 8 and 9 of dualvar.t failing + + +Copyright (c) 1997-2002 Graham Barr <gbarr@pobox.com>. 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/ext/List/Util/Util.xs b/ext/List/Util/Util.xs index 92ee08499e..6f6d2531f4 100644 --- a/ext/List/Util/Util.xs +++ b/ext/List/Util/Util.xs @@ -43,6 +43,12 @@ my_cxinc(pTHX) # define NV double #endif +#ifdef SVf_IVisUV +# define slu_sv_value(sv) (NV)(SvIOK(sv) ? SvIOK_UV(sv) ? SvUVX(sv) : SvIVX(sv) : SvNV(sv)) +#else +# define slu_sv_value(sv) (NV)(SvIOK(sv) ? SvIVX(sv) : SvNV(sv)) +#endif + #ifndef Drand01 # define Drand01() ((rand() & 0x7FFF) / (double) ((unsigned long)1 << 15)) #endif @@ -90,6 +96,10 @@ sv_tainted(SV *sv) # endif #endif +#ifndef PTR2IV +# define PTR2IV(ptr) (IV)(ptr) +#endif + MODULE=List::Util PACKAGE=List::Util void @@ -107,10 +117,10 @@ CODE: XSRETURN_UNDEF; } retsv = ST(0); - retval = SvNV(retsv); + retval = slu_sv_value(retsv); for(index = 1 ; index < items ; index++) { SV *stacksv = ST(index); - NV val = SvNV(stacksv); + NV val = slu_sv_value(stacksv); if(val < retval ? !ix : ix) { retsv = stacksv; retval = val; @@ -127,13 +137,16 @@ sum(...) PROTOTYPE: @ CODE: { + SV *sv; int index; if(!items) { XSRETURN_UNDEF; } - RETVAL = SvNV(ST(0)); + sv = ST(0); + RETVAL = slu_sv_value(sv); for(index = 1 ; index < items ; index++) { - RETVAL += SvNV(ST(index)); + sv = ST(index); + RETVAL += slu_sv_value(sv); } } OUTPUT: @@ -199,6 +212,7 @@ CODE: PERL_CONTEXT *cx; SV** newsp; I32 gimme = G_SCALAR; + I32 hasargs = 0; bool oldcatch = CATCH_GET; if(items <= 1) { @@ -218,7 +232,10 @@ CODE: SAVESPTR(PL_op); ret = ST(1); CATCH_SET(TRUE); - PUSHBLOCK(cx, CXt_NULL, SP); + PUSHBLOCK(cx, CXt_SUB, SP); + PUSHSUB(cx); + if (!CvDEPTH(cv)) + (void)SvREFCNT_inc(cv); for(index = 2 ; index < items ; index++) { GvSV(agv) = ret; GvSV(bgv) = ST(index); @@ -246,6 +263,7 @@ CODE: PERL_CONTEXT *cx; SV** newsp; I32 gimme = G_SCALAR; + I32 hasargs = 0; bool oldcatch = CATCH_GET; if(items <= 1) { @@ -261,7 +279,11 @@ CODE: SAVETMPS; SAVESPTR(PL_op); CATCH_SET(TRUE); - PUSHBLOCK(cx, CXt_NULL, SP); + PUSHBLOCK(cx, CXt_SUB, SP); + PUSHSUB(cx); + if (!CvDEPTH(cv)) + (void)SvREFCNT_inc(cv); + for(index = 1 ; index < items ; index++) { GvSV(PL_defgv) = ST(index); PL_op = reducecop; @@ -376,6 +398,20 @@ CODE: OUTPUT: RETVAL +IV +refaddr(sv) + SV * sv +PROTOTYPE: $ +CODE: +{ + if(!SvROK(sv)) { + XSRETURN_UNDEF; + } + RETVAL = PTR2IV(SvRV(sv)); +} +OUTPUT: + RETVAL + void weaken(sv) SV *sv @@ -417,16 +453,34 @@ CODE: OUTPUT: RETVAL +void +isvstring(sv) + SV *sv +PROTOTYPE: $ +CODE: +#ifdef SvVOK + ST(0) = boolSV(SvVOK(sv)); + XSRETURN(1); +#else + croak("vstrings are not implemented in this release of perl"); +#endif + + BOOT: { -#ifndef SvWEAKREF +#if !defined(SvWEAKREF) || !defined(SvVOK) HV *stash = gv_stashpvn("Scalar::Util", 12, TRUE); GV *vargv = *(GV**)hv_fetch(stash, "EXPORT_FAIL", 11, TRUE); AV *varav; if (SvTYPE(vargv) != SVt_PVGV) gv_init(vargv, stash, "Scalar::Util", 12, TRUE); varav = GvAVn(vargv); +#endif +#ifndef SvWEAKREF av_push(varav, newSVpv("weaken",6)); av_push(varav, newSVpv("isweak",6)); #endif +#ifndef SvVOK + av_push(varav, newSVpv("isvstring",9)); +#endif } diff --git a/ext/List/Util/lib/List/Util.pm b/ext/List/Util/lib/List/Util.pm index 7686ffe82c..8975b10094 100644 --- a/ext/List/Util/lib/List/Util.pm +++ b/ext/List/Util/lib/List/Util.pm @@ -9,11 +9,11 @@ package List::Util; require Exporter; require DynaLoader; -our @ISA = qw(Exporter DynaLoader); -our @EXPORT_OK = qw(first min max minstr maxstr reduce sum shuffle); -our $VERSION = "1.07_00"; +our @ISA = qw(Exporter DynaLoader); +our @EXPORT_OK = qw(first min max minstr maxstr reduce sum shuffle); +our $VERSION = "1.08_00"; our $XS_VERSION = $VERSION; -$VERSION = eval $VERSION; +$VERSION = eval $VERSION; bootstrap List::Util $XS_VERSION; diff --git a/ext/List/Util/lib/Scalar/Util.pm b/ext/List/Util/lib/Scalar/Util.pm index e518a4c445..fd881ad587 100644 --- a/ext/List/Util/lib/Scalar/Util.pm +++ b/ext/List/Util/lib/Scalar/Util.pm @@ -10,7 +10,7 @@ require Exporter; require List::Util; # List::Util loads the XS our @ISA = qw(Exporter); -our @EXPORT_OK = qw(blessed dualvar reftype weaken isweak tainted readonly openhandle); +our @EXPORT_OK = qw(blessed dualvar reftype weaken isweak tainted readonly openhandle refaddr isvstring); our $VERSION = $List::Util::VERSION; sub openhandle ($) { @@ -41,7 +41,7 @@ Scalar::Util - A selection of general-utility scalar subroutines =head1 SYNOPSIS - use Scalar::Util qw(blessed dualvar isweak readonly reftype tainted weaken); + use Scalar::Util qw(blessed dualvar isweak readonly refaddr reftype tainted weaken); =head1 DESCRIPTION @@ -78,6 +78,14 @@ value STRING in a string context. $num = $foo + 2; # 12 $str = $foo . " world"; # Hello world +=item isvstring EXPR + +If EXPR is a scalar which was coded as a vstring the result is true. + + $vs = v49.46.48; + $fmt = isvstring($vs) ? "%vd" : "%s"; #true + printf($fmt,$vs); + =item isweak EXPR If EXPR is a scalar which is a weak reference the result is true. @@ -106,6 +114,18 @@ Returns true if SCALAR is readonly. $readonly = foo($bar); # false $readonly = foo(0); # true +=item refaddr EXPR + +If EXPR evaluates to a reference the internal memory address of +the referenced value is returned. Otherwise C<undef> is returned. + + $addr = refaddr "string"; # undef + $addr = refaddr \$var; # eg 12345678 + $addr = refaddr []; # eg 23456784 + + $obj = bless {}, "Foo"; + $addr = refaddr $obj; # eg 88123488 + =item reftype EXPR If EXPR evaluates to a reference the type of the variable referenced diff --git a/ext/List/Util/t/first.t b/ext/List/Util/t/first.t index ee227807c8..d6a919d028 100755 --- a/ext/List/Util/t/first.t +++ b/ext/List/Util/t/first.t @@ -15,7 +15,7 @@ BEGIN { use List::Util qw(first); -print "1..7\n"; +print "1..8\n"; print "not " unless defined &first; print "ok 1\n"; @@ -41,3 +41,10 @@ print "ok 6\n"; print "not " if defined eval { first { die if $_ } 0,0,1 }; print "ok 7\n"; + +($x) = foobar(); +$x = '' unless defined $x; +print "${x}ok 8\n"; + +sub foobar { first { !defined(wantarray) || wantarray } "not ","not ","not " } + diff --git a/ext/List/Util/t/isvstring.t b/ext/List/Util/t/isvstring.t new file mode 100644 index 0000000000..bd70b63ebf --- /dev/null +++ b/ext/List/Util/t/isvstring.t @@ -0,0 +1,41 @@ +#!./perl + +BEGIN { + unless (-d 'blib') { + chdir 't' if -d 't'; + @INC = '../lib'; + require Config; import Config; + keys %Config; # Silence warning + if ($Config{extensions} !~ /\bList\/Util\b/) { + print "1..0 # Skip: List::Util was not built\n"; + exit 0; + } + } + $|=1; + require Scalar::Util; + if (grep { /isvstring/ } @Scalar::Util::EXPORT_FAIL) { + print("1..0\n"); + exit 0; + } +} + +use Scalar::Util qw(isvstring); + +print "1..4\n"; + +print "ok 1\n"; + +$vs = 49.46.48; + +print "not " unless $vs == "1.0"; +print "ok 2\n"; + +print "not " unless isvstring($vs); +print "ok 3\n"; + +$sv = "1.0"; +print "not " if isvstring($sv); +print "ok 4\n"; + + + diff --git a/ext/List/Util/t/reduce.t b/ext/List/Util/t/reduce.t index 2721d15fb0..4af711de9d 100755 --- a/ext/List/Util/t/reduce.t +++ b/ext/List/Util/t/reduce.t @@ -16,7 +16,7 @@ BEGIN { use List::Util qw(reduce min); -print "1..8\n"; +print "1..9\n"; print "not " if defined reduce {}; print "ok 1\n"; @@ -50,3 +50,9 @@ print "ok 7\n"; print "not " if defined eval { reduce { die if $b > 2; $a + $b } 0,1,2,3,4 }; print "ok 8\n"; + +($x) = foobar(); +print "${x}ok 9\n"; + +sub foobar { reduce { (defined(wantarray) && !wantarray) ? '' : 'not ' } 0,1,2,3 } + diff --git a/ext/List/Util/t/refaddr.t b/ext/List/Util/t/refaddr.t new file mode 100755 index 0000000000..efb962ccc1 --- /dev/null +++ b/ext/List/Util/t/refaddr.t @@ -0,0 +1,54 @@ +#!./perl + +BEGIN { + unless (-d 'blib') { + chdir 't' if -d 't'; + @INC = '../lib'; + require Config; import Config; + keys %Config; # Silence warning + if ($Config{extensions} !~ /\bList\/Util\b/) { + print "1..0 # Skip: List::Util was not built\n"; + exit 0; + } + } +} + + +use Scalar::Util qw(refaddr); +use vars qw($t $y $x *F $v $r); +use Symbol qw(gensym); + +# Ensure we do not trigger and tied methods +tie *F, 'MyTie'; + +print "1..13\n"; + +my $i = 1; +foreach $v (undef, 10, 'string') { + print "not " if defined refaddr($v); + print "ok ",$i++,"\n"; +} + +foreach $r ({}, \$t, [], \*F, sub {}) { + my $addr = $r + 0; + print "not " unless refaddr($r) == $addr; + print "ok ",$i++,"\n"; + my $obj = bless $r, 'FooBar'; + print "not " unless refaddr($r) == $addr; + print "ok ",$i++,"\n"; +} + +package FooBar; + +use overload '0+' => sub { 10 }, + '+' => sub { 10 + $_[1] }; + +package MyTie; + +sub TIEHANDLE { bless {} } +sub DESTROY {} + +sub AUTOLOAD { + warn "$AUTOLOAD called"; + exit 1; # May be in an eval +} diff --git a/ext/NDBM_File/NDBM_File.xs b/ext/NDBM_File/NDBM_File.xs index 78a56cb7cc..5e02af7657 100644 --- a/ext/NDBM_File/NDBM_File.xs +++ b/ext/NDBM_File/NDBM_File.xs @@ -1,11 +1,6 @@ #include "EXTERN.h" #include "perl.h" #include "XSUB.h" -/* If using the DB3 emulation, ENTER is defined both - * by DB3 and Perl. We drop the Perl definition now. - * See also INSTALL section on DB3. - * -- Stanislav Brabec <utx@penguin.cz> */ -#undef ENTER #include <ndbm.h> typedef struct { @@ -21,25 +16,6 @@ typedef NDBM_File_type * NDBM_File ; typedef datum datum_key ; typedef datum datum_value ; -#define ckFilter(arg,type,name) \ - if (db->type) { \ - SV * save_defsv ; \ - /* printf("filtering %s\n", name) ;*/ \ - if (db->filtering) \ - croak("recursion detected in %s", name) ; \ - db->filtering = TRUE ; \ - save_defsv = newSVsv(DEFSV) ; \ - sv_setsv(DEFSV, arg) ; \ - PUSHMARK(sp) ; \ - (void) perl_call_sv(db->type, G_DISCARD|G_NOARGS); \ - sv_setsv(arg, DEFSV) ; \ - sv_setsv(DEFSV, save_defsv) ; \ - SvREFCNT_dec(save_defsv) ; \ - db->filtering = FALSE ; \ - /*printf("end of filtering %s\n", name) ;*/ \ - } - - MODULE = NDBM_File PACKAGE = NDBM_File PREFIX = ndbm_ NDBM_File @@ -120,32 +96,13 @@ ndbm_clearerr(db) NDBM_File db -#define setFilter(type) \ - { \ - if (db->type) \ - RETVAL = sv_mortalcopy(db->type) ; \ - ST(0) = RETVAL ; \ - if (db->type && (code == &PL_sv_undef)) { \ - SvREFCNT_dec(db->type) ; \ - db->type = NULL ; \ - } \ - else if (code) { \ - if (db->type) \ - sv_setsv(db->type, code) ; \ - else \ - db->type = newSVsv(code) ; \ - } \ - } - - - SV * filter_fetch_key(db, code) NDBM_File db SV * code SV * RETVAL = &PL_sv_undef ; CODE: - setFilter(filter_fetch_key) ; + DBM_setFilter(db->filter_fetch_key, code) ; SV * filter_store_key(db, code) @@ -153,7 +110,7 @@ filter_store_key(db, code) SV * code SV * RETVAL = &PL_sv_undef ; CODE: - setFilter(filter_store_key) ; + DBM_setFilter(db->filter_store_key, code) ; SV * filter_fetch_value(db, code) @@ -161,7 +118,7 @@ filter_fetch_value(db, code) SV * code SV * RETVAL = &PL_sv_undef ; CODE: - setFilter(filter_fetch_value) ; + DBM_setFilter(db->filter_fetch_value, code) ; SV * filter_store_value(db, code) @@ -169,5 +126,5 @@ filter_store_value(db, code) SV * code SV * RETVAL = &PL_sv_undef ; CODE: - setFilter(filter_store_value) ; + DBM_setFilter(db->filter_store_value, code) ; diff --git a/ext/NDBM_File/ndbm.t b/ext/NDBM_File/ndbm.t index a340e33214..a7e49b8860 100755 --- a/ext/NDBM_File/ndbm.t +++ b/ext/NDBM_File/ndbm.t @@ -28,7 +28,7 @@ require NDBM_File; #If Fcntl is not available, try 0x202 or 0x102 for O_RDWR|O_CREAT use Fcntl; -print "1..71\n"; +print "1..77\n"; unlink <Op.dbmx*>; @@ -460,4 +460,48 @@ EOM unlink <Op.dbmx*>; } + +{ + # Check that DBM Filter can cope with read-only $_ + + use warnings ; + use strict ; + my %h ; + unlink <Op.dbmx*>; + + ok(72, my $db = tie(%h, 'NDBM_File','Op.dbmx', O_RDWR|O_CREAT, 0640)) ; + + $db->filter_fetch_key (sub { }) ; + $db->filter_store_key (sub { }) ; + $db->filter_fetch_value (sub { }) ; + $db->filter_store_value (sub { }) ; + + $_ = "original" ; + + $h{"fred"} = "joe" ; + ok(73, $h{"fred"} eq "joe"); + + eval { grep { $h{$_} } (1, 2, 3) }; + ok (74, ! $@); + + + # delete the filters + $db->filter_fetch_key (undef); + $db->filter_store_key (undef); + $db->filter_fetch_value (undef); + $db->filter_store_value (undef); + + $h{"fred"} = "joe" ; + + ok(75, $h{"fred"} eq "joe"); + + ok(76, $db->FIRSTKEY() eq "fred") ; + + eval { grep { $h{$_} } (1, 2, 3) }; + ok (77, ! $@); + + undef $db ; + untie %h; + unlink <Op.dbmx*>; +} exit ; diff --git a/ext/NDBM_File/typemap b/ext/NDBM_File/typemap index 40b95f22c0..093c426409 100644 --- a/ext/NDBM_File/typemap +++ b/ext/NDBM_File/typemap @@ -15,11 +15,11 @@ FATALFUNC T_OPAQUEPTR INPUT T_DATUM_K - ckFilter($arg, filter_store_key, \"filter_store_key\"); + DBM_ckFilter($arg, filter_store_key, \"filter_store_key\"); $var.dptr = SvPV($arg, PL_na); $var.dsize = (int)PL_na; T_DATUM_V - ckFilter($arg, filter_store_value, \"filter_store_value\"); + DBM_ckFilter($arg, filter_store_value, \"filter_store_value\"); if (SvOK($arg)) { $var.dptr = SvPV($arg, PL_na); $var.dsize = (int)PL_na; @@ -33,10 +33,10 @@ T_GDATUM OUTPUT T_DATUM_K sv_setpvn($arg, $var.dptr, $var.dsize); - ckFilter($arg, filter_fetch_key,\"filter_fetch_key\"); + DBM_ckFilter($arg, filter_fetch_key,\"filter_fetch_key\"); T_DATUM_V sv_setpvn($arg, $var.dptr, $var.dsize); - ckFilter($arg, filter_fetch_value,\"filter_fetch_value\"); + DBM_ckFilter($arg, filter_fetch_value,\"filter_fetch_value\"); T_GDATUM sv_usepvn($arg, $var.dptr, $var.dsize); T_PTROBJ diff --git a/ext/ODBM_File/ODBM_File.xs b/ext/ODBM_File/ODBM_File.xs index 3bc94fe073..fb3b5740ec 100644 --- a/ext/ODBM_File/ODBM_File.xs +++ b/ext/ODBM_File/ODBM_File.xs @@ -3,11 +3,6 @@ #include "XSUB.h" #ifdef I_DBM -/* If using the DB3 emulation, ENTER is defined both - * by DB3 and Perl. We drop the Perl definition now. - * See also INSTALL section on DB3. - * -- Stanislav Brabec <utx@penguin.cz> */ -# undef ENTER # include <dbm.h> #else # ifdef I_RPCSVC_DBM @@ -56,25 +51,6 @@ typedef datum datum_key ; typedef datum datum_key_copy ; typedef datum datum_value ; -#define ckFilter(arg,type,name) \ - if (db->type) { \ - SV * save_defsv ; \ - /* printf("filtering %s\n", name) ;*/ \ - if (db->filtering) \ - croak("recursion detected in %s", name) ; \ - db->filtering = TRUE ; \ - save_defsv = newSVsv(DEFSV) ; \ - sv_setsv(DEFSV, arg) ; \ - PUSHMARK(sp) ; \ - (void) perl_call_sv(db->type, G_DISCARD|G_NOARGS); \ - sv_setsv(arg, DEFSV) ; \ - sv_setsv(DEFSV, save_defsv) ; \ - SvREFCNT_dec(save_defsv) ; \ - db->filtering = FALSE ; \ - /*printf("end of filtering %s\n", name) ;*/ \ - } - - #define odbm_FETCH(db,key) fetch(key) #define odbm_STORE(db,key,value,flags) store(key,value) #define odbm_DELETE(db,key) delete(key) @@ -207,7 +183,7 @@ filter_fetch_key(db, code) SV * code SV * RETVAL = &PL_sv_undef ; CODE: - setFilter(filter_fetch_key) ; + DBM_setFilter(db->filter_fetch_key, code) ; SV * filter_store_key(db, code) @@ -215,7 +191,7 @@ filter_store_key(db, code) SV * code SV * RETVAL = &PL_sv_undef ; CODE: - setFilter(filter_store_key) ; + DBM_setFilter(db->filter_store_key, code) ; SV * filter_fetch_value(db, code) @@ -223,7 +199,7 @@ filter_fetch_value(db, code) SV * code SV * RETVAL = &PL_sv_undef ; CODE: - setFilter(filter_fetch_value) ; + DBM_setFilter(db->filter_fetch_value, code) ; SV * filter_store_value(db, code) @@ -231,5 +207,5 @@ filter_store_value(db, code) SV * code SV * RETVAL = &PL_sv_undef ; CODE: - setFilter(filter_store_value) ; + DBM_setFilter(db->filter_store_value, code) ; diff --git a/ext/ODBM_File/odbm.t b/ext/ODBM_File/odbm.t index ecffffd81a..c4df3d8a1b 100755 --- a/ext/ODBM_File/odbm.t +++ b/ext/ODBM_File/odbm.t @@ -28,7 +28,7 @@ require ODBM_File; #If Fcntl is not available, try 0x202 or 0x102 for O_RDWR|O_CREAT use Fcntl; -print "1..72\n"; +print "1..78\n"; unlink <Op.dbmx*>; @@ -466,6 +466,50 @@ EOM unlink <Op.dbmx*>; } + +{ + # Check that DBM Filter can cope with read-only $_ + + use warnings ; + use strict ; + my %h ; + unlink <Op.dbmx*>; + + ok(73, my $db = tie(%h, 'ODBM_File','Op.dbmx', O_RDWR|O_CREAT, 0640)) ; + + $db->filter_fetch_key (sub { }) ; + $db->filter_store_key (sub { }) ; + $db->filter_fetch_value (sub { }) ; + $db->filter_store_value (sub { }) ; + + $_ = "original" ; + + $h{"fred"} = "joe" ; + ok(74, $h{"fred"} eq "joe"); + + eval { grep { $h{$_} } (1, 2, 3) }; + ok (75, ! $@); + + + # delete the filters + $db->filter_fetch_key (undef); + $db->filter_store_key (undef); + $db->filter_fetch_value (undef); + $db->filter_store_value (undef); + + $h{"fred"} = "joe" ; + + ok(76, $h{"fred"} eq "joe"); + + ok(77, $db->FIRSTKEY() eq "fred") ; + + eval { grep { $h{$_} } (1, 2, 3) }; + ok (78, ! $@); + + undef $db ; + untie %h; + unlink <Op.dbmx*>; +} exit ; if ($^O eq 'hpux') { print <<EOM; diff --git a/ext/ODBM_File/typemap b/ext/ODBM_File/typemap index 62b8622569..4f4802cfa5 100644 --- a/ext/ODBM_File/typemap +++ b/ext/ODBM_File/typemap @@ -16,7 +16,7 @@ FATALFUNC T_OPAQUEPTR INPUT T_DATUM_K - ckFilter($arg, filter_store_key, \"filter_store_key\"); + DBM_ckFilter($arg, filter_store_key, \"filter_store_key\"); $var.dptr = SvPV($arg, PL_na); $var.dsize = (int)PL_na; T_DATUM_K_C @@ -24,7 +24,7 @@ T_DATUM_K_C SV * tmpSV ; if (db->filter_store_key){ tmpSV = sv_2mortal(newSVsv($arg)); - ckFilter(tmpSV, filter_store_key, \"filter_store_key\"); + DBM_ckFilter(tmpSV, filter_store_key, \"filter_store_key\"); } else tmpSV = $arg; @@ -32,7 +32,7 @@ T_DATUM_K_C $var.dsize = (int)PL_na; } T_DATUM_V - ckFilter($arg, filter_store_value, \"filter_store_value\"); + DBM_ckFilter($arg, filter_store_value, \"filter_store_value\"); if (SvOK($arg)) { $var.dptr = SvPV($arg, PL_na); $var.dsize = (int)PL_na; @@ -46,9 +46,9 @@ T_GDATUM OUTPUT T_DATUM_K sv_setpvn($arg, $var.dptr, $var.dsize); - ckFilter($arg, filter_fetch_key,\"filter_fetch_key\"); + DBM_ckFilter($arg, filter_fetch_key,\"filter_fetch_key\"); T_DATUM_V sv_setpvn($arg, $var.dptr, $var.dsize); - ckFilter($arg, filter_fetch_value,\"filter_fetch_value\"); + DBM_ckFilter($arg, filter_fetch_value,\"filter_fetch_value\"); T_GDATUM sv_usepvn($arg, $var.dptr, $var.dsize); diff --git a/ext/Opcode/Opcode.t b/ext/Opcode/Opcode.t index a785fce48b..9f2748cc06 100755 --- a/ext/Opcode/Opcode.t +++ b/ext/Opcode/Opcode.t @@ -87,7 +87,7 @@ print verify_opset($s1) && !verify_opset(42) ? "ok $t\n":"not ok $t\n"; $t++; opmask_add(opset(qw(fileno))); # add to global op_mask print eval 'fileno STDOUT' ? "not ok $t\n" : "ok $t\n"; $t++; # fail -print $@ =~ /fileno trapped/ ? "ok $t\n" : "not ok $t\n# $@\n"; $t++; +print $@ =~ /'fileno' trapped/ ? "ok $t\n" : "not ok $t\n# $@\n"; $t++; # --- check use of bit vector ops on opsets diff --git a/ext/Opcode/Safe.pm b/ext/Opcode/Safe.pm index 22ba03fe12..8d875ef5b2 100644 --- a/ext/Opcode/Safe.pm +++ b/ext/Opcode/Safe.pm @@ -214,11 +214,11 @@ sub reval { # Create anon sub ref in root of compartment. # Uses a closure (on $expr) to pass in the code to be executed. # (eval on one line to keep line numbers as expected by caller) - my $evalcode = sprintf('package %s; sub { eval $expr; }', $root); + my $evalcode = sprintf('package %s; sub { @_ = (); eval $expr; }', $root); my $evalsub; - if ($strict) { use strict; $evalsub = eval $evalcode; } - else { no strict; $evalsub = eval $evalcode; } + if ($strict) { use strict; $evalsub = eval $evalcode; } + else { no strict; $evalsub = eval $evalcode; } return Opcode::_safe_call_sv($root, $obj->{Mask}, $evalsub); } @@ -383,8 +383,9 @@ This shares the variable(s) in the argument list with the compartment. This is almost identical to exporting variables using the L<Exporter> module. -Each NAME must be the B<name> of a variable, typically with the leading -type identifier included. A bareword is treated as a function name. +Each NAME must be the B<name> of a non-lexical variable, typically +with the leading type identifier included. A bareword is treated as a +function name. Examples of legal names are '$foo' for a scalar, '@foo' for an array, '%foo' for a hash, '&foo' or 'foo' for a subroutine and '*foo' @@ -426,7 +427,7 @@ C<main::> package to the code inside the compartment. Any attempt by the code in STRING to use an operator which is not permitted by the compartment will cause an error (at run-time of the main program but at compile-time for the code in STRING). The error is of the form -"%s trapped by operation mask operation...". +"'%s' trapped by operation mask...". If an operation is trapped in this way, then the code in STRING will not be executed. If such a trapped operation occurs or any other diff --git a/ext/POSIX/POSIX.pm b/ext/POSIX/POSIX.pm index 05634f0132..5a1cbb9392 100644 --- a/ext/POSIX/POSIX.pm +++ b/ext/POSIX/POSIX.pm @@ -51,9 +51,12 @@ sub AUTOLOAD { goto &$AUTOLOAD; } -sub POSIX::SigAction::new { - bless {HANDLER => $_[1], MASK => $_[2], FLAGS => $_[3] || 0}, $_[0]; -} +package POSIX::SigAction; + +use AutoLoader 'AUTOLOAD'; +sub new { bless {HANDLER => $_[1], MASK => $_[2], FLAGS => $_[3] || 0}, $_[0] } + +package POSIX; 1; __END__ @@ -948,3 +951,9 @@ for (values %EXPORT_TAGS) { require Exporter; } + +package POSIX::SigAction; + +sub handler { $_[0]->{HANDLER} = $_[1] if @_ > 1; $_[0]->{HANDLER} }; +sub mask { $_[0]->{MASK} = $_[1] if @_ > 1; $_[0]->{MASK} }; +sub flags { $_[0]->{FLAGS} = $_[1] if @_ > 1; $_[0]->{FLAGS} }; diff --git a/ext/POSIX/POSIX.pod b/ext/POSIX/POSIX.pod index 286df40ec1..a4550855a0 100644 --- a/ext/POSIX/POSIX.pod +++ b/ext/POSIX/POSIX.pod @@ -1391,7 +1391,7 @@ Returns C<undef> on failure. =item tcflush This is similar to the C function C<tcflush()> for flushing -the I/O buffers of its argumeny stream. +the I/O buffers of its argument stream. Returns C<undef> on failure. @@ -1594,6 +1594,21 @@ function. =back +=over 8 + +=item handler + +=item mask + +=item flags + +accessor functions to get/set the values of a SigAction object. + + $sigset = $sigaction->mask; + $sigaction->flags(&POSIX::SA_RESTART); + +=back + =head2 POSIX::SigSet =over 8 diff --git a/ext/POSIX/POSIX.xs b/ext/POSIX/POSIX.xs index 2eab9562ac..9a4fc02e46 100644 --- a/ext/POSIX/POSIX.xs +++ b/ext/POSIX/POSIX.xs @@ -843,7 +843,7 @@ isalnum(charstring) unsigned char * charstring CODE: unsigned char *s = charstring; - unsigned char *e = s + PL_na; /* "PL_na" set by typemap side effect */ + unsigned char *e = s + SvCUR(ST(0)); for (RETVAL = 1; RETVAL && s < e; s++) if (!isalnum(*s)) RETVAL = 0; @@ -855,7 +855,7 @@ isalpha(charstring) unsigned char * charstring CODE: unsigned char *s = charstring; - unsigned char *e = s + PL_na; /* "PL_na" set by typemap side effect */ + unsigned char *e = s + SvCUR(ST(0)); for (RETVAL = 1; RETVAL && s < e; s++) if (!isalpha(*s)) RETVAL = 0; @@ -867,7 +867,7 @@ iscntrl(charstring) unsigned char * charstring CODE: unsigned char *s = charstring; - unsigned char *e = s + PL_na; /* "PL_na" set by typemap side effect */ + unsigned char *e = s + SvCUR(ST(0)); for (RETVAL = 1; RETVAL && s < e; s++) if (!iscntrl(*s)) RETVAL = 0; @@ -879,7 +879,7 @@ isdigit(charstring) unsigned char * charstring CODE: unsigned char *s = charstring; - unsigned char *e = s + PL_na; /* "PL_na" set by typemap side effect */ + unsigned char *e = s + SvCUR(ST(0)); for (RETVAL = 1; RETVAL && s < e; s++) if (!isdigit(*s)) RETVAL = 0; @@ -891,7 +891,7 @@ isgraph(charstring) unsigned char * charstring CODE: unsigned char *s = charstring; - unsigned char *e = s + PL_na; /* "PL_na" set by typemap side effect */ + unsigned char *e = s + SvCUR(ST(0)); for (RETVAL = 1; RETVAL && s < e; s++) if (!isgraph(*s)) RETVAL = 0; @@ -903,7 +903,7 @@ islower(charstring) unsigned char * charstring CODE: unsigned char *s = charstring; - unsigned char *e = s + PL_na; /* "PL_na" set by typemap side effect */ + unsigned char *e = s + SvCUR(ST(0)); for (RETVAL = 1; RETVAL && s < e; s++) if (!islower(*s)) RETVAL = 0; @@ -915,7 +915,7 @@ isprint(charstring) unsigned char * charstring CODE: unsigned char *s = charstring; - unsigned char *e = s + PL_na; /* "PL_na" set by typemap side effect */ + unsigned char *e = s + SvCUR(ST(0)); for (RETVAL = 1; RETVAL && s < e; s++) if (!isprint(*s)) RETVAL = 0; @@ -927,7 +927,7 @@ ispunct(charstring) unsigned char * charstring CODE: unsigned char *s = charstring; - unsigned char *e = s + PL_na; /* "PL_na" set by typemap side effect */ + unsigned char *e = s + SvCUR(ST(0)); for (RETVAL = 1; RETVAL && s < e; s++) if (!ispunct(*s)) RETVAL = 0; @@ -939,7 +939,7 @@ isspace(charstring) unsigned char * charstring CODE: unsigned char *s = charstring; - unsigned char *e = s + PL_na; /* "PL_na" set by typemap side effect */ + unsigned char *e = s + SvCUR(ST(0)); for (RETVAL = 1; RETVAL && s < e; s++) if (!isspace(*s)) RETVAL = 0; @@ -951,7 +951,7 @@ isupper(charstring) unsigned char * charstring CODE: unsigned char *s = charstring; - unsigned char *e = s + PL_na; /* "PL_na" set by typemap side effect */ + unsigned char *e = s + SvCUR(ST(0)); for (RETVAL = 1; RETVAL && s < e; s++) if (!isupper(*s)) RETVAL = 0; @@ -963,7 +963,7 @@ isxdigit(charstring) unsigned char * charstring CODE: unsigned char *s = charstring; - unsigned char *e = s + PL_na; /* "PL_na" set by typemap side effect */ + unsigned char *e = s + SvCUR(ST(0)); for (RETVAL = 1; RETVAL && s < e; s++) if (!isxdigit(*s)) RETVAL = 0; diff --git a/ext/POSIX/t/posix.t b/ext/POSIX/t/posix.t index 8f31ada848..01dba7f748 100644 --- a/ext/POSIX/t/posix.t +++ b/ext/POSIX/t/posix.t @@ -11,7 +11,7 @@ BEGIN { } require "./test.pl"; -plan(tests => 39); +plan(tests => 61); use POSIX qw(fcntl_h signal_h limits_h _exit getcwd open read strftime write @@ -223,6 +223,30 @@ is ($result, undef, "fgets should fail"); like ($@, qr/^Use method IO::Handle::gets\(\) instead/, "check its redef message"); +# Simplistic tests for the isXXX() functions (bug #16799) +ok( POSIX::isalnum('1'), 'isalnum' ); +ok(!POSIX::isalnum('*'), 'isalnum' ); +ok( POSIX::isalpha('f'), 'isalpha' ); +ok(!POSIX::isalpha('7'), 'isalpha' ); +ok( POSIX::iscntrl("\cA"),'iscntrl' ); +ok(!POSIX::iscntrl("A"), 'iscntrl' ); +ok( POSIX::isdigit('1'), 'isdigit' ); +ok(!POSIX::isdigit('z'), 'isdigit' ); +ok( POSIX::isgraph('@'), 'isgraph' ); +ok(!POSIX::isgraph(' '), 'isgraph' ); +ok( POSIX::islower('l'), 'islower' ); +ok(!POSIX::islower('L'), 'islower' ); +ok( POSIX::isupper('U'), 'isupper' ); +ok(!POSIX::isupper('u'), 'isupper' ); +ok( POSIX::isprint('$'), 'isprint' ); +ok(!POSIX::isprint("\n"), 'isprint' ); +ok( POSIX::ispunct('%'), 'ispunct' ); +ok(!POSIX::ispunct('u'), 'ispunct' ); +ok( POSIX::isspace("\t"), 'isspace' ); +ok(!POSIX::isspace('_'), 'isspace' ); +ok( POSIX::isxdigit('f'), 'isxdigit' ); +ok(!POSIX::isxdigit('g'), 'isxdigit' ); + # Check that output is not flushed by _exit. This test should be last # in the file, and is not counted in the total number of tests. if ($^O eq 'vos') { diff --git a/ext/PerlIO/scalar/scalar.xs b/ext/PerlIO/scalar/scalar.xs index c027bd12d1..7bcee5774e 100644 --- a/ext/PerlIO/scalar/scalar.xs +++ b/ext/PerlIO/scalar/scalar.xs @@ -25,6 +25,8 @@ PerlIOScalar_pushed(pTHX_ PerlIO * f, const char *mode, SV * arg, if (arg) { if (SvROK(arg)) { s->var = SvREFCNT_inc(SvRV(arg)); + if (!SvPOK(s->var)) + (void)SvPV_nolen(s->var); } else { s->var = diff --git a/ext/PerlIO/t/scalar.t b/ext/PerlIO/t/scalar.t index fd1b852657..4e6615e799 100644 --- a/ext/PerlIO/t/scalar.t +++ b/ext/PerlIO/t/scalar.t @@ -10,7 +10,7 @@ BEGIN { } $| = 1; -print "1..22\n"; +print "1..23\n"; my $fh; my $var = "ok 2\n"; @@ -115,3 +115,8 @@ while (<$dup>) { close($fh); close($dup); +# Check reading from non-string scalars + +open $fh, '<', \42; +print <$fh> eq "42" ? "ok 23\n" : "not ok 23\n"; +close $fh; diff --git a/ext/PerlIO/via/via.xs b/ext/PerlIO/via/via.xs index 0c247780b6..2bcd35562d 100644 --- a/ext/PerlIO/via/via.xs +++ b/ext/PerlIO/via/via.xs @@ -143,11 +143,15 @@ PerlIOVia_pushed(pTHX_ PerlIO * f, const char *mode, SV * arg, s->stash = gv_stashpvn(SvPVX(s->obj), pkglen + 13, FALSE); } if (s->stash) { - SV *modesv = - (mode) ? sv_2mortal(newSVpvn(mode, strlen(mode))) : - Nullsv; - SV *result = - PerlIOVia_method(aTHX_ f, MYMethod(PUSHED), G_SCALAR, + char lmode[8]; + SV *modesv; + SV *result; + if (!mode) { + /* binmode() passes NULL - so find out what mode is */ + mode = PerlIO_modestr(f,lmode); + } + modesv = sv_2mortal(newSVpvn(mode, strlen(mode))); + result = PerlIOVia_method(aTHX_ f, MYMethod(PUSHED), G_SCALAR, modesv, Nullsv); if (result) { if (sv_isobject(result)) { diff --git a/ext/SDBM_File/SDBM_File.xs b/ext/SDBM_File/SDBM_File.xs index b454d59152..3bf3c2baf9 100644 --- a/ext/SDBM_File/SDBM_File.xs +++ b/ext/SDBM_File/SDBM_File.xs @@ -17,24 +17,6 @@ typedef SDBM_File_type * SDBM_File ; typedef datum datum_key ; typedef datum datum_value ; -#define ckFilter(arg,type,name) \ - if (db->type) { \ - SV * save_defsv ; \ - /* printf("filtering %s\n", name) ;*/ \ - if (db->filtering) \ - croak("recursion detected in %s", name) ; \ - db->filtering = TRUE ; \ - save_defsv = newSVsv(DEFSV) ; \ - sv_setsv(DEFSV, arg) ; \ - PUSHMARK(sp) ; \ - (void) perl_call_sv(db->type, G_DISCARD|G_NOARGS); \ - sv_setsv(arg, DEFSV) ; \ - sv_setsv(DEFSV, save_defsv) ; \ - SvREFCNT_dec(save_defsv) ; \ - db->filtering = FALSE ; \ - /*printf("end of filtering %s\n", name) ;*/ \ - } - #define sdbm_TIEHASH(dbtype,filename,flags,mode) sdbm_open(filename,flags,mode) #define sdbm_FETCH(db,key) sdbm_fetch(db->dbp,key) #define sdbm_STORE(db,key,value,flags) sdbm_store(db->dbp,key,value,flags) @@ -138,32 +120,13 @@ sdbm_clearerr(db) RETVAL -#define setFilter(type) \ - { \ - if (db->type) \ - RETVAL = sv_mortalcopy(db->type) ; \ - ST(0) = RETVAL ; \ - if (db->type && (code == &PL_sv_undef)) { \ - SvREFCNT_dec(db->type) ; \ - db->type = NULL ; \ - } \ - else if (code) { \ - if (db->type) \ - sv_setsv(db->type, code) ; \ - else \ - db->type = newSVsv(code) ; \ - } \ - } - - - SV * filter_fetch_key(db, code) SDBM_File db SV * code SV * RETVAL = &PL_sv_undef ; CODE: - setFilter(filter_fetch_key) ; + DBM_setFilter(db->filter_fetch_key, code) ; SV * filter_store_key(db, code) @@ -171,7 +134,7 @@ filter_store_key(db, code) SV * code SV * RETVAL = &PL_sv_undef ; CODE: - setFilter(filter_store_key) ; + DBM_setFilter(db->filter_store_key, code) ; SV * filter_fetch_value(db, code) @@ -179,7 +142,7 @@ filter_fetch_value(db, code) SV * code SV * RETVAL = &PL_sv_undef ; CODE: - setFilter(filter_fetch_value) ; + DBM_setFilter(db->filter_fetch_value, code) ; SV * filter_store_value(db, code) @@ -187,5 +150,5 @@ filter_store_value(db, code) SV * code SV * RETVAL = &PL_sv_undef ; CODE: - setFilter(filter_store_value) ; + DBM_setFilter(db->filter_store_value, code) ; diff --git a/ext/SDBM_File/sdbm.t b/ext/SDBM_File/sdbm.t index f942b97d96..8106289364 100644 --- a/ext/SDBM_File/sdbm.t +++ b/ext/SDBM_File/sdbm.t @@ -28,7 +28,7 @@ require SDBM_File; #If Fcntl is not available, try 0x202 or 0x102 for O_RDWR|O_CREAT use Fcntl; -print "1..74\n"; +print "1..80\n"; unlink <Op_dbmx.*>; @@ -439,7 +439,7 @@ unlink <Op_dbmx*>, $Dfile; use strict ; use SDBM_File ; - unlink <Op.dbmx*>; + unlink <Op_dbmx*>; my $bad_key = 0 ; my %h = () ; ok(69, my $db = tie(%h, 'SDBM_File','Op_dbmx', O_RDWR|O_CREAT, 0640)) ; @@ -466,7 +466,51 @@ unlink <Op_dbmx*>, $Dfile; undef $db ; untie %h ; - unlink <Op.dbmx*>; + unlink <Op_dbmx*>; } + +{ + # Check that DBM Filter can cope with read-only $_ + + use warnings ; + use strict ; + my %h ; + unlink <Op1_dbmx*>; + + ok(75, my $db = tie(%h, 'SDBM_File','Op1_dbmx', O_RDWR|O_CREAT, 0640)) ; + + $db->filter_fetch_key (sub { }) ; + $db->filter_store_key (sub { }) ; + $db->filter_fetch_value (sub { }) ; + $db->filter_store_value (sub { }) ; + + $_ = "original" ; + + $h{"fred"} = "joe" ; + ok(76, $h{"fred"} eq "joe"); + + eval { grep { $h{$_} } (1, 2, 3) }; + ok (77, ! $@); + + + # delete the filters + $db->filter_fetch_key (undef); + $db->filter_store_key (undef); + $db->filter_fetch_value (undef); + $db->filter_store_value (undef); + + $h{"fred"} = "joe" ; + + ok(78, $h{"fred"} eq "joe"); + + ok(79, $db->FIRSTKEY() eq "fred") ; + + eval { grep { $h{$_} } (1, 2, 3) }; + ok (80, ! $@); + + undef $db ; + untie %h; + unlink <Op1_dbmx*>; +} exit ; diff --git a/ext/SDBM_File/typemap b/ext/SDBM_File/typemap index 40b95f22c0..093c426409 100644 --- a/ext/SDBM_File/typemap +++ b/ext/SDBM_File/typemap @@ -15,11 +15,11 @@ FATALFUNC T_OPAQUEPTR INPUT T_DATUM_K - ckFilter($arg, filter_store_key, \"filter_store_key\"); + DBM_ckFilter($arg, filter_store_key, \"filter_store_key\"); $var.dptr = SvPV($arg, PL_na); $var.dsize = (int)PL_na; T_DATUM_V - ckFilter($arg, filter_store_value, \"filter_store_value\"); + DBM_ckFilter($arg, filter_store_value, \"filter_store_value\"); if (SvOK($arg)) { $var.dptr = SvPV($arg, PL_na); $var.dsize = (int)PL_na; @@ -33,10 +33,10 @@ T_GDATUM OUTPUT T_DATUM_K sv_setpvn($arg, $var.dptr, $var.dsize); - ckFilter($arg, filter_fetch_key,\"filter_fetch_key\"); + DBM_ckFilter($arg, filter_fetch_key,\"filter_fetch_key\"); T_DATUM_V sv_setpvn($arg, $var.dptr, $var.dsize); - ckFilter($arg, filter_fetch_value,\"filter_fetch_value\"); + DBM_ckFilter($arg, filter_fetch_value,\"filter_fetch_value\"); T_GDATUM sv_usepvn($arg, $var.dptr, $var.dsize); T_PTROBJ diff --git a/ext/Safe/safe2.t b/ext/Safe/safe2.t index d967b19634..94398d4565 100755 --- a/ext/Safe/safe2.t +++ b/ext/Safe/safe2.t @@ -38,7 +38,7 @@ $cpt = new Safe or die; $cpt = new Safe "Root"; $cpt->reval(q{ system("echo not ok 1"); }); -if ($@ =~ /^system trapped by operation mask/) { +if ($@ =~ /^'system' trapped by operation mask/) { print "ok 1\n"; } else { print "#$@" if $@; diff --git a/ext/Safe/safe3.t b/ext/Safe/safe3.t new file mode 100644 index 0000000000..c924762faa --- /dev/null +++ b/ext/Safe/safe3.t @@ -0,0 +1,33 @@ +#!perl + +BEGIN { + if ($ENV{PERL_CORE}) { + chdir 't' if -d 't'; + @INC = '../lib'; + require Config; import Config; + if ($Config{'extensions'} !~ /\bOpcode\b/ + && $Config{'extensions'} !~ /\bPOSIX\b/ + && $Config{'osname'} ne 'VMS') + { + print "1..0\n"; + exit 0; + } + } +} + +use strict; +use warnings; +use POSIX qw(ceil); +use Test::More tests => 1; +use Safe; + +my $safe = new Safe; +$safe->deny('add'); + +# Attempt to change the opmask from within the safe compartment +$safe->reval( qq{\$_[1] = q/\0/ x } . ceil( Opcode::opcodes / 8 ) ); + +# Check that it didn't work +$safe->reval( q{$x + $y} ); +like( $@, qr/^'?addition \(\+\)'? trapped by operation mask/, + 'opmask still in place' ); diff --git a/ext/Sys/Hostname/Hostname.pm b/ext/Sys/Hostname/Hostname.pm index 1efc897c3b..29825b95b0 100644 --- a/ext/Sys/Hostname/Hostname.pm +++ b/ext/Sys/Hostname/Hostname.pm @@ -47,7 +47,7 @@ sub hostname { # rats! $host = ''; - Carp::croak "Cannot get host name of local machine"; + croak "Cannot get host name of local machine"; } elsif ($^O eq 'MSWin32') { @@ -110,7 +110,7 @@ sub hostname { } # bummer - || Carp::croak "Cannot get host name of local machine"; + || croak "Cannot get host name of local machine"; # remove garbage $host =~ tr/\0\r\n//d; diff --git a/ext/Sys/Syslog/syslog.t b/ext/Sys/Syslog/syslog.t index 30695e2644..72171f532b 100755 --- a/ext/Sys/Syslog/syslog.t +++ b/ext/Sys/Syslog/syslog.t @@ -47,11 +47,21 @@ print "1..6\n"; if (Sys::Syslog::_PATH_LOG()) { if (-e Sys::Syslog::_PATH_LOG()) { - print defined(eval { setlogsock('unix') }) ? "ok 1\n" : "not ok 1 # $!\n"; - print defined(eval { openlog('perl', 'ndelay', 'local0') }) ? "ok 2\n" : "not ok 2 # $!\n"; - print defined(eval { syslog('info', $test_string ) }) ? "ok 3\n" : "not ok 3 # $!\n"; - } - else { + print defined(eval { setlogsock('unix') }) + ? "ok 1\n" : "not ok 1 # $!\n"; + if (defined(eval { openlog('perl', 'ndelay', 'local0') })) { + print "ok 2\n"; + print defined(eval { syslog('info', $test_string ) }) + ? "ok 3\n" : "not ok 3 # $!\n"; + } else { + if ($@ =~ /no connection to syslog available/) { + print "ok 2 # Skip: syslogd not running\n"; + } else { + print "not ok 2 # $@\n"; + } + print "ok 3 # Skip: openlog failed\n"; + } + } else { for (1..3) { print "ok $_ # Skip: file ", diff --git a/ext/Time/HiRes/Changes b/ext/Time/HiRes/Changes index 16fc02782f..3ba982d67f 100644 --- a/ext/Time/HiRes/Changes +++ b/ext/Time/HiRes/Changes @@ -1,5 +1,165 @@ Revision history for Perl extension Time::HiRes. +1.38 + - no functional changes + - move lib/Time/HiRes.pm as Hires.pm + - libraries scanning was slightly broken (always scanned + for a library even when $Config{libs} already had it) + +1.37 + - Ray Zimmerman ran into a race condition in Mac OS X. + A 0.01-second alarm fired before the test expected. + The test first slept indefinitely (blocking for signals) + and only after that tested for the signal having been sent. + Since the signal had already been sent, the test #12 never + completed. The solution: test first, then block. + - default to being silent on all probing attempts, set the + environment variable VERBOSE to a true value to see the + details (the probing command and the possible errors) + +1.36 + - do not clear MAN3PODS in Makefile.PL (Radoslaw Zielinski) + - INSTALLDIRS => 'perl' missing which means that Time::HiRes + cannot be upgraded from CPAN to override the 5.8.0 version + (Guido A. Ostkamp) + - Time::HiRes 1.35 could not be dropped as-is to bleadperl + because the include directories did not adjust themselves + if $ENV{PERL_CORE} (Hugo van der Sanden) + - add documentation about the restart of select() under alarm() + +1.35 + - small documentation tweaks + + +1.34 + - better VMS operation (Craig Berry) + +1.33 + - our time machine is accelerating: now works with Perl 5.004_01 + (tried with 5.003_07 and 5.002 but I get segmentation faults + from running the Makefile.PL with those in Tru64 4.0D) + +1.32 + - backward compatibility (pre-5.6.0) tweaks: + - no XSLoader in 5.00503, use DynaLoader instead + - no SvPV_nolen, either + - no PerlProc_pause(), either + - now tested with 5.00404 and 5.00503 + - Makefile.PL requires 5.00404 (no more 5.002) + - use nanosleep instead of usleep, if it is available (Wilson Snyder) + (this means that one can mix subsecond sleeps with alarms) + - because of nanosleep we probe for -lrt and -lposix4 + - the existence of getitimer/nanosleep/setitimer/ualarm/usleep + is available by exportable constants Time::HiRes::d_func + (since older Perl do not have them in %Config, and even + 5.8.0 does not probe for nanosleep) + +1.31 + - backward compatibility (pre-5.6.1) tweaks: + - define NV if no NVTYPE + - define IVdf if needed (note: the Devel::PPPort + in 5.8.0 does not try hard hard enough since + the IVSIZE might not be defined) + - define NVgf if needed + - grab the typemap from 5.8.0 for the NV stuff +1.30 + + - release 1.29_02 as 1.30 + +1.29_02 + + - fix a silly unclosed comment typo in HiRes.xs + - document and export REALTIME_REALPROF (Solaris) + +1.29_01 + + - only getitimer(ITIMER_REAL) available in Cygwin and Win32 + (need to patch this also in Perl 5.[89]) + - remove CVS revision log from HiRes.xs + +1.29_00 + + The following numbered patches refer to the Perl 5.7 changes, + you can browse them at http://public.activestate.com/cgi-bin/perlbrowse + + - 17558: Add #!./perl to the .t + - 17201: linux + usemorebits fix, from Rafael Garcia-Suarez + - 16198: political correctness, from Simon Cozens + - 15857: doc tweaks, from Jarkko Hietaniemi + - 15593: optimization in .xs, from Paul Green + - 14892: pod fixes, from Robin Barker + - 14100: VOS fixes, from Paul Green + - 13422: XS segfault, from Marc Lehmann + - 13378: whether select() gets restarted on signals, depends + - 13354: timing constraints, again, from Andy Dougherty + - 13278: can't do subecond alarms with ualarm; + break out early if alarms do not seem to be working + - 13266: test relaxation (cygwin gets lower hires + times than lores ones) + - 12846: protect against high load, from Jarkko Hietaniemi + - 12837: HiRes.t VMS tweak, from Craig A. Berry + - 12797: HiRes.t VMS tweak, from Charles Lane + - 12769: HiRes.t VMS tweak, from Craig A. Berry + - 12744: gcc vs MS 64-bit constant syntax, from Nick Ing-Simmons + - 12722: VMS ualarm for VMS without ualarm, from Charles Lane + - 12692: alarm() ain't gonna work if ualarm() ain't, + from Gurusamy Sarathy + - 12680: minor VMS tweak, from Charles Lane + - 12617: don't try to print ints as IVs, from Jarkko Hietaniemi + - 12609: croak on negative time, from Jarkko Hietaniemi + - 12595: Cygwin rounds up for time(), from Jarkko Hietaniemi + - 12594: MacOS Classic timeofday, from Chris Nandor + - 12473: allow for more than one second for sleep() and usleep() + - 12458: test tuning, relax timing constraints, + from Jarkko Hietaniemi + - 12449: make sleep() and usleep() to return the number + of seconds and microseconds actually slept (analogously + with the builtin sleep()), also make usleep() croak if + asked for more than 1_000_000 useconds, from Jarkko Hietaniemi + - 12366: Time::HiRes for VMS pre-7.0, from Charles Lane + - 12199: do not use ftime on Win32, from Gurusamy Sarathy + - 12196: use ftime() on Win32, from Artur Bergman + - 12184: fix Time::HiRes gettimeofday() on Win32, from Gurusamy Sarathy + - 12105: use GetSystemTime() on Win32, from Artur Bergman + - 12060: explain the 1e9 seconds problem, from Jarkko Hietaniemi + - 11901: UNICOS sloppy division, from Jarkko Hietaniemi + - 11797: problem in HiRes.t, from John P. Linderman + - 11414: prototype from Time::HiRes::sleep(), from Abhijit Menon-Sen + - 11409: Time::HiRes qw(sleep) failed, from Abhijit Menon-Sen + - 11270: dynix/ptx 4.5.2 hints fix, from Peter Prymmer + - 11032: VAX VMS s/div/lib\$ediv/ fix, from Peter Prymmer + - 11011: VAX VMS s/qdiv/div/ fix, from Peter Prymmer + - 10953: SCO OpenServer 5.0.5 requires an explicit -lc for usleep(), + from Jonathan Stowe + - 10942: MPE/IX test tweaks, from Mark Bixby + - 10784: unnecessary pod2man calls, from Andy Dougherty + - 10354: ext/ + -Wall, from Doug MacEachern + - 10320: fix the BOOT section to call myU2time correctly + - 10317: correct casting for AIX< from H. Merijn Brand + - 10119: document that the core time() may be rounding, not truncating + - 10118: test fix, from John Peacock + - 9988: long =item, from Robin Barker + - 9714: correct test output + - 9708: test also the scalar aspect of getitimer() + - 9705: Add interval timers (setitimer, getitimer) + - 9692: do not require at least 5.005 using XS + + The following changes were made on top of the changes + made for Time::HiRes during the Perl 5.7 development + cycle that culminated in the release of Perl 5.8.0. + + - add "require 5.005" to the Makefile.PL + - remove the REVISION section (CVS log) from HiRes.pm + - add jhi's copyright alongside Douglas' + - move HiRes.pm to lib/Time/ + - move HiRes.t to t/ + - modify HiRes.t to use $ENV{PERL_CORE} + - modify the original Time::HiRes version 1.20 Makefile.PL + to work both with Perl 5.8.0 and the new code with pre-5.8.0 + Perls (tried with 5.6.1) + - tiny tweaks and updates in README and TODO + - bump the VERSION to 1.29 + 1.20 Wed Feb 24 21:30 1999 - make our usleep and ualarm substitutes into hrt_usleep and hrt_ualarm. This helps static links of Perl with other @@ -7,7 +167,7 @@ Revision history for Perl extension Time::HiRes. Ilya Zakharevich <ilya@math.ohio-state.edu> - add C API stuff. From Joshua Pritikin <joshua.pritikin@db.com> - - VMS Makefile.PL fun. From pvhp@forte.com (Peter Prymmer) + - VMS Makefile.PL fun. From pvhp@forte.com (Peter Prymmer) - hopefully correct "-lc" fix for SCO. - add PPD stuff @@ -32,9 +192,9 @@ Revision history for Perl extension Time::HiRes. 1.17 Wed Jul 1 20:10 1998 - fix setitimer calls so microseconds is not more than 1000000. Hp/UX 9 doesn't like that. Provided by Roland B Robert, PhD. - - make Win32. We only get gettimeofday (the select hack doesn't + - make Win32. We only get gettimeofday (the select hack doesn't seem to work on my Win95 system). - - fix test 4 on 01test.t. add test to see if time() and + - fix test 4 on 01test.t. add test to see if time() and Time::HiRes::time() are close. 1.16 Wed Nov 12 21:05 1997 diff --git a/ext/Time/HiRes/HiRes.pm b/ext/Time/HiRes/HiRes.pm index 6337532040..9886138b53 100644 --- a/ext/Time/HiRes/HiRes.pm +++ b/ext/Time/HiRes/HiRes.pm @@ -4,15 +4,18 @@ use strict; use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK $AUTOLOAD); require Exporter; -use XSLoader; +require DynaLoader; -@ISA = qw(Exporter); +@ISA = qw(Exporter DynaLoader); @EXPORT = qw( ); @EXPORT_OK = qw (usleep sleep ualarm alarm gettimeofday time tv_interval - getitimer setitimer ITIMER_REAL ITIMER_VIRTUAL ITIMER_PROF); - -$VERSION = '1.20_00'; + getitimer setitimer + ITIMER_REAL ITIMER_VIRTUAL ITIMER_PROF ITIMER_REALPROF + d_usleep d_ualarm d_gettimeofday d_getitimer d_setitimer + d_nanosleep); + +$VERSION = '1.38'; $XS_VERSION = $VERSION; $VERSION = eval $VERSION; @@ -31,7 +34,7 @@ sub AUTOLOAD { goto &$AUTOLOAD; } -XSLoader::load 'Time::HiRes', $XS_VERSION; +bootstrap Time::HiRes; # Preloaded methods go here. @@ -75,7 +78,7 @@ Time::HiRes - High resolution alarm, sleep, gettimeofday, interval timers alarm ($floating_seconds, $floating_interval); use Time::HiRes qw( setitimer getitimer - ITIMER_REAL ITIMER_VIRTUAL ITIMER_PROF ); + ITIMER_REAL ITIMER_VIRTUAL ITIMER_PROF ITIMER_REALPROF ); setitimer ($which, $floating_seconds, $floating_interval ); getitimer ($which); @@ -85,15 +88,28 @@ Time::HiRes - High resolution alarm, sleep, gettimeofday, interval timers The C<Time::HiRes> module implements a Perl interface to the usleep, ualarm, gettimeofday, and setitimer/getitimer system calls. See the EXAMPLES section below and the test scripts for usage; see your system -documentation for the description of the underlying usleep, ualarm, -gettimeofday, and setitimer/getitimer calls. +documentation for the description of the underlying nanosleep or usleep, +ualarm, gettimeofday, and setitimer/getitimer calls. If your system lacks gettimeofday(2) or an emulation of it you don't -get gettimeofday() or the one-arg form of tv_interval(). -If you don't have usleep(3) or select(2) you don't get usleep() +get gettimeofday() or the one-arg form of tv_interval(). If you don't +have nanosleep() or usleep(3) or select(2) you don't get Time::HiRes::usleep() or sleep(). If your system don't have ualarm(3) or setitimer(2) you -don't get ualarm() or alarm(). If you try to import an unimplemented -function in the C<use> statement it will fail at compile time. +don't get Time::HiRes::ualarm() or alarm(). + +If you try to import an unimplemented function in the C<use> statement +it will fail at compile time. + +If your subsecond sleeping is implemented with nanosleep() instead of +usleep(), you can mix subsecond sleeping with signals since +nanosleep() does not use signals. This, however, is unportable +behavior, and you should first check for the truth value of +C<&Time::HiRes::d_nanosleep> to see whether you have nanosleep, +and then read carefully your nanosleep() C API documentation for +any peculiarities. (There is no separate interface to call nanosleep(); +just use Time::HiRes::sleep() or usleep() with small enough values. Also, +think twice whether using nanosecond accuracies in a Perl program is what +you should be doing.) The following functions can be imported from this module. No functions are exported by default. @@ -160,12 +176,18 @@ provided with perl, see the EXAMPLES below. =item alarm ( $floating_seconds [, $interval_floating_seconds ] ) -The SIGALRM signal is sent after the specfified number of seconds. +The SIGALRM signal is sent after the specified number of seconds. Implemented using ualarm(). The $interval_floating_seconds argument is optional and will be 0 if unspecified, resulting in alarm()-like behaviour. This function can be imported, resulting in a nice drop-in replacement for the C<alarm> provided with perl, see the EXAMPLES below. +B<NOTE 1>: With some platform - Perl release combinations select() +gets restarted by SIGALRM, instead of dropping out of select(). +This means that an alarm() followed by a select() may together take +the sum of the times specified for the the alarm() and the select(), +not just the time of the alarm(). + =item setitimer C<setitimer ( $which, $floating_seconds [, $interval_floating_seconds ] )> @@ -183,8 +205,12 @@ In scalar context, the remaining time in the timer is returned. In list context, both the remaining time and the interval are returned. -There are three interval timers: the $which can be ITIMER_REAL, -ITIMER_VIRTUAL, or ITIMER_PROF. +There are usually three or four interval timers available: the $which +can be ITIMER_REAL, ITIMER_VIRTUAL, ITIMER_PROF, or ITIMER_REALPROF. +Note that which ones are available depends: true UNIX platforms have +usually all first three, but for example Win32 and Cygwin only have +ITIMER_REAL, and only Solaris seems to have ITIMER_REALPROF (which is +used to profile multithreaded programs). ITIMER_REAL results in alarm()-like behavior. Time is counted in I<real time>, that is, wallclock time. SIGALRM is delivered when @@ -300,58 +326,13 @@ R. Schertler <roderick@argon.org> J. Hietaniemi <jhi@iki.fi> G. Aas <gisle@aas.no> -=head1 REVISION - -$Id: HiRes.pm,v 1.20 1999/03/16 02:26:13 wegscd Exp $ - -$Log: HiRes.pm,v $ -Revision 1.20 1999/03/16 02:26:13 wegscd -Add documentation for NVTime and U2Time. - -Revision 1.19 1998/09/30 02:34:42 wegscd -No changes, bump version. - -Revision 1.18 1998/07/07 02:41:35 wegscd -No changes, bump version. - -Revision 1.17 1998/07/02 01:45:13 wegscd -Bump version to 1.17 - -Revision 1.16 1997/11/13 02:06:36 wegscd -version bump to accomodate HiRes.xs fix. - -Revision 1.15 1997/11/11 02:17:59 wegscd -POD editing, courtesy of Gisle Aas. - -Revision 1.14 1997/11/06 03:14:35 wegscd -Update version # for Makefile.PL and HiRes.xs changes. - -Revision 1.13 1997/11/05 05:36:25 wegscd -change version # for Makefile.pl and HiRes.xs changes. - -Revision 1.12 1997/10/13 20:55:33 wegscd -Force a new version for Makefile.PL changes. - -Revision 1.11 1997/09/05 19:59:33 wegscd -New version to bump version for README and Makefile.PL fixes. -Fix bad RCS log. - -Revision 1.10 1997/05/23 01:11:38 wegscd -Conditional compilation; EXPORT_FAIL fixes. - -Revision 1.2 1996/12/30 13:28:40 wegscd -Update documentation for what to do when missing ualarm() and friends. - -Revision 1.1 1996/10/17 20:53:31 wegscd -Fix =head1 being next to __END__ so pod2man works +=head1 COPYRIGHT AND LICENSE -Revision 1.0 1996/09/03 18:25:15 wegscd -Initial revision +Copyright (c) 1996-2002 Douglas E. Wegscheid. All rights reserved. -=head1 COPYRIGHT +Copyright (c) 2002 Jarkko Hietaniemi. All rights reserved. -Copyright (c) 1996-1997 Douglas E. Wegscheid. -All rights reserved. This program is free software; you can -redistribute it and/or modify it under the same terms as Perl itself. +This program is free software; you can redistribute it and/or modify +it under the same terms as Perl itself. =cut diff --git a/ext/Time/HiRes/HiRes.t b/ext/Time/HiRes/HiRes.t index 8a50f5029c..1cc2c7666c 100644 --- a/ext/Time/HiRes/HiRes.t +++ b/ext/Time/HiRes/HiRes.t @@ -1,8 +1,10 @@ #!./perl -w BEGIN { - chdir 't' if -d 't'; - @INC = '../lib'; + if ($ENV{PERL_CORE}) { + chdir 't' if -d 't'; + @INC = '../lib'; + } } BEGIN { $| = 1; print "1..25\n"; } @@ -28,6 +30,13 @@ import Time::HiRes 'ualarm' if $have_ualarm; use Config; +my $xdefine; + +if (open(XDEFINE, "xdefine")) { + chomp($xdefine = <XDEFINE>); + close(XDEFINE); +} + # Ideally, we'd like to test that the timers are rather precise. # However, if the system is busy, there are no guarantees on how # quickly we will return. This limit used to be 10%, but that @@ -41,7 +50,7 @@ use Config; my $limit = 0.20; # 20% is acceptable slosh for testing timers sub skip { - map { print "ok $_ (skipped)\n" } @_; + map { print "ok $_ # skipped\n" } @_; } sub ok { @@ -130,14 +139,14 @@ else { my $tick = 0; local $SIG{ALRM} = sub { $tick++ }; - my $one = time; $tick = 0; ualarm(10_000); sleep until $tick; - my $two = time; $tick = 0; ualarm(10_000); sleep until $tick; + my $one = time; $tick = 0; ualarm(10_000); while ($tick == 0) { sleep } + my $two = time; $tick = 0; ualarm(10_000); while ($tick == 0) { sleep } my $three = time; ok 12, $one == $two || $two == $three, "slept too long, $one $two $three"; $tick = 0; ualarm(10_000, 10_000); - sleep until $tick >= 3; + while ($tick < 3) { sleep } ok 13, 1; ualarm(0); } @@ -158,12 +167,16 @@ if (!$have_time) { print "# s = $s, n = $n, s/n = ", $s/$n, "\n"; } -unless (defined &Time::HiRes::gettimeofday +my $has_ualarm = $Config{d_ualarm}; + +$has_ualarm ||= $xdefine =~ /-DHAS_UALARM/; + +unless ( defined &Time::HiRes::gettimeofday && defined &Time::HiRes::ualarm && defined &Time::HiRes::usleep - && $Config{d_ualarm}) { + && $has_ualarm) { for (15..17) { - print "ok $_ # skipped\n"; + print "ok $_ # Skip: no gettimeofday or no ualarm or no usleep\n"; } } else { use Time::HiRes qw (time alarm sleep); @@ -194,7 +207,7 @@ unless (defined &Time::HiRes::gettimeofday # from the alarm. If this happens, let's just skip # this particular test. --jhi if (abs($ival/3.3 - 1) < $limit) { - $ok = "Skip: your select() seems to get restarted by your SIGALRM"; + $ok = "Skip: your select() may get restarted by your SIGALRM (or just retry test)"; undef $not; last; } @@ -227,9 +240,9 @@ unless (defined &Time::HiRes::gettimeofday print $not ? "not ok 17 # $not\n" : "ok 17 # $ok\n"; } -unless (defined &Time::HiRes::setitimer +unless ( defined &Time::HiRes::setitimer && defined &Time::HiRes::getitimer - && exists &Time::HiRes::ITIMER_VIRTUAL + && eval 'Time::HiRes::ITIMER_VIRTUAL' && $Config{d_select} && $Config{sig_name} =~ m/\bVTALRM\b/) { for (18..19) { @@ -255,7 +268,8 @@ unless (defined &Time::HiRes::setitimer print "# getitimer: ", join(" ", getitimer(ITIMER_VIRTUAL)), "\n"; while (getitimer(ITIMER_VIRTUAL)) { - my $j; $j++ for 1..1000; # Can't be unbreakable, must test getitimer(). + my $j; + for (1..1000) { $j++ } # Can't be unbreakable, must test getitimer(). } print "# getitimer: ", join(" ", getitimer(ITIMER_VIRTUAL)), "\n"; diff --git a/ext/Time/HiRes/HiRes.xs b/ext/Time/HiRes/HiRes.xs index c66b92db08..5da54c6d19 100644 --- a/ext/Time/HiRes/HiRes.xs +++ b/ext/Time/HiRes/HiRes.xs @@ -18,11 +18,123 @@ extern "C" { } #endif +#ifndef aTHX_ +# define aTHX_ +# define pTHX_ +#endif + +#ifndef NVTYPE +# if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE) +# define NVTYPE long double +# else +# define NVTYPE double +# endif +typedef NVTYPE NV; +#endif + +#ifndef IVdf +# ifdef IVSIZE +# if IVSIZE == LONGSIZE +# define IVdf "ld" +# else +# if IVSIZE == INTSIZE +# define IVdf "d" +# endif +# endif +# else +# define IVdf "ld" +# endif +#endif + +#ifndef NVef +# if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE) && \ + defined(PERL_PRIgldbl) /* Not very likely, but let's try anyway. */ +# define NVgf PERL_PRIgldbl +# else +# define NVgf "g" +# endif +#endif + +#ifndef INT2PTR + +#if (IVSIZE == PTRSIZE) && (UVSIZE == PTRSIZE) +# define PTRV UV +# define INT2PTR(any,d) (any)(d) +#else +# if PTRSIZE == LONGSIZE +# define PTRV unsigned long +# else +# define PTRV unsigned +# endif +# define INT2PTR(any,d) (any)(PTRV)(d) +#endif +#define PTR2IV(p) INT2PTR(IV,p) + +#endif /* !INT2PTR */ + +#ifndef SvPV_nolen +static char * +sv_2pv_nolen(pTHX_ register SV *sv) +{ + STRLEN n_a; + return sv_2pv(sv, &n_a); +} +# define SvPV_nolen(sv) \ + ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ + ? SvPVX(sv) : sv_2pv_nolen(sv)) +#endif + +#ifndef PerlProc_pause +# define PerlProc_pause() Pause() +#endif + +/* Though the cpp define ITIMER_VIRTUAL is available the functionality + * is not supported in Cygwin as of August 2002, ditto for Win32. + * Neither are ITIMER_PROF or ITIMER_REALPROF implemented. --jhi + */ +#if defined(__CYGWIN__) || defined(WIN32) +# undef ITIMER_VIRTUAL +# undef ITIMER_PROF +# undef ITIMER_REALPROF +#endif + static IV constant(char *name, int arg) { errno = 0; switch (*name) { + case 'd': + if (strEQ(name, "d_getitimer")) +#ifdef HAS_GETITIMER + return 1; +#else + return 0; +#endif + if (strEQ(name, "d_nanosleep")) +#ifdef HAS_NANOSLEEP + return 1; +#else + return 0; +#endif + if (strEQ(name, "d_setitimer")) +#ifdef HAS_SETITIMER + return 1; +#else + return 0; +#endif + if (strEQ(name, "d_ualarm")) +#ifdef HAS_UALARM + return 1; +#else + return 0; +#endif + if (strEQ(name, "d_usleep")) +#ifdef HAS_USLEEP + return 1; +#else + return 0; +#endif + break; case 'I': if (strEQ(name, "ITIMER_REAL")) #ifdef ITIMER_REAL @@ -287,6 +399,22 @@ gettimeofday (struct timeval *tp, void *tpz) } #endif + +#if !defined(HAS_USLEEP) && defined(HAS_NANOSLEEP) +#define HAS_USLEEP +#define usleep hrt_nanosleep /* could conflict with ncurses for static build */ + +void +hrt_nanosleep(unsigned long usec) +{ + struct timespec res; + res.tv_sec = usec/1000/1000; + res.tv_nsec = ( usec - res.tv_sec*1000*1000 ) * 1000; + nanosleep(&res, NULL); +} +#endif + + #if !defined(HAS_USLEEP) && defined(HAS_SELECT) #ifndef SELECT_IS_BROKEN #define HAS_USLEEP @@ -531,8 +659,6 @@ ualarm_AST(Alarm *a) #endif /* !HAS_UALARM && VMS */ - - #ifdef HAS_GETTIMEOFDAY static int @@ -562,6 +688,7 @@ MODULE = Time::HiRes PACKAGE = Time::HiRes PROTOTYPES: ENABLE BOOT: +#ifdef ATLEASTFIVEOHOHFIVE #ifdef HAS_GETTIMEOFDAY { UV auv[2]; @@ -570,6 +697,7 @@ BOOT: hv_store(PL_modglobal, "Time::U2time", 12, newSViv((IV) auv[0]), 0); } #endif +#endif IV constant(name, arg) @@ -779,41 +907,3 @@ getitimer(which) #endif -# $Id: HiRes.xs,v 1.11 1999/03/16 02:27:38 wegscd Exp wegscd $ - -# $Log: HiRes.xs,v $ -# Revision 1.11 1999/03/16 02:27:38 wegscd -# Add U2time, NVtime. Fix symbols for static link. -# -# Revision 1.10 1998/09/30 02:36:25 wegscd -# Add VMS changes. -# -# Revision 1.9 1998/07/07 02:42:06 wegscd -# Win32 usleep() -# -# Revision 1.8 1998/07/02 01:47:26 wegscd -# Add Win32 code for gettimeofday. -# -# Revision 1.7 1997/11/13 02:08:12 wegscd -# Add missing EXTEND in gettimeofday() scalar code. -# -# Revision 1.6 1997/11/11 02:32:35 wegscd -# Do something useful when calling gettimeofday() in a scalar context. -# The patch is courtesy of Gisle Aas. -# -# Revision 1.5 1997/11/06 03:10:47 wegscd -# Fake ualarm() if we have setitimer. -# -# Revision 1.4 1997/11/05 05:41:23 wegscd -# Turn prototypes ON (suggested by Gisle Aas) -# -# Revision 1.3 1997/10/13 20:56:15 wegscd -# Add PROTOTYPES: DISABLE -# -# Revision 1.2 1997/05/23 01:01:38 wegscd -# Conditional compilation, depending on what the OS gives us. -# -# Revision 1.1 1996/09/03 18:26:35 wegscd -# Initial revision -# -# diff --git a/ext/Time/HiRes/Makefile.PL b/ext/Time/HiRes/Makefile.PL index b7c6459162..ea8b85f993 100644 --- a/ext/Time/HiRes/Makefile.PL +++ b/ext/Time/HiRes/Makefile.PL @@ -1,13 +1,409 @@ + # See lib/ExtUtils/MakeMaker.pm for details of how to influence # the contents of the Makefile that is written. # -use strict; +require 5.002; + +use Config; use ExtUtils::MakeMaker; -WriteMakefile( - 'NAME' => 'Time::HiRes', - MAN3PODS => {}, # Pods will be built by installman. - 'VERSION_FROM' => 'HiRes.pm', -); +# Perls 5.002 and 5.003 did not have File::Spec, fake what we need. + +my $VERBOSE = $ENV{VERBOSE}; + +sub my_dirsep { + $^O eq 'VMS' ? '.' : + $^O =~ /mswin32|netware|djgpp/i ? '\\' : + $^O eq 'MacOS' ? ':' + : '/'; +} + +sub my_catdir { + shift; + my $catdir = join(my_dirsep, @_); + $^O eq 'VMS' ? "[$dirsep]" : $dirsep; +} + +sub my_updir { + shift; + $^O eq 'VMS' ? "-" : ".."; +} + +BEGIN { + eval { require File::Spec }; + if ($@) { + *File::Spec::catdir = \&my_catdir; + *File::Spec::updir = \&my_updir; + } +} + +# if you have 5.004_03 (and some slightly older versions?), xsubpp +# tries to generate line numbers in the C code generated from the .xs. +# unfortunately, it is a little buggy around #ifdef'd code. +# my choice is leave it in and have people with old perls complain +# about the "Usage" bug, or leave it out and be unable to compile myself +# without changing it, and then I'd always forget to change it before a +# release. Sorry, Edward :) + +sub TMPDIR { + my $TMPDIR = + (grep(defined $_ && -d $_ && -w _, + ((defined $ENV{'TMPDIR'} ? $ENV{'TMPDIR'} : undef), + qw(/var/tmp /usr/tmp /tmp))))[0] + unless defined $TMPDIR; + $TMPDIR || die "Cannot find writable temporary directory.\n"; +} + +sub try_compile_and_link { + my ($c, %args) = @_; + + my ($ok) = 0; + my ($tmp) = (($^O eq 'VMS') ? "sys\$scratch:tmp$$" : TMPDIR . '/' . "tmp$$"); + local(*TMPC); + + my $obj_ext = $Config{obj_ext} || ".o"; + unlink("$tmp.c", "$tmp$obj_ext"); + + if (open(TMPC, ">$tmp.c")) { + print TMPC $c; + close(TMPC); + + $cccmd = $args{cccmd}; + + my $errornull; + + my $COREincdir; + if ($ENV{PERL_CORE}) { + my $updir = File::Spec->updir; + $COREincdir = File::Spec->catdir(($updir) x 3); + } else { + $COREincdir = File::Spec->catdir($Config{'archlibexp'}, 'CORE'); + } + my $ccflags = $Config{'ccflags'} . ' ' . "-I$COREincdir"; + if ($^O eq 'VMS') { + if ($ENV{PERL_CORE}) { + $cccmd = "$Config{'cc'} /include=(perl_root:[000000]) $tmp.c"; + } else { + my $perl_core = $Config{'installarchlib'}; + $perl_core =~ s/\]$/.CORE]/; + $cccmd = "$Config{'cc'} /include=(perl_root:[000000],$perl_core) $tmp.c"; + } + } + + if ($args{silent} || !$VERBOSE) { + $errornull = "2>/dev/null" unless defined $errornull; + } else { + $errornull = ''; + } + + $cccmd = "$Config{'cc'} -o $tmp $ccflags $tmp.c @$LIBS $errornull" + unless defined $cccmd; + if ($^O eq 'VMS') { + open( CMDFILE, ">$tmp.com" ); + print CMDFILE "\$ SET MESSAGE/NOFACILITY/NOSEVERITY/NOIDENT/NOTEXT\n"; + print CMDFILE "\$ $cccmd\n"; + print CMDFILE "\$ IF \$SEVERITY .NE. 1 THEN EXIT 44\n"; # escalate + close CMDFILE; + system("\@ $tmp.com"); + $ok = $?==0; + for ("$tmp.c", "$tmp$obj_ext", "$tmp.com", "$tmp$Config{exe_ext}") { + 1 while unlink $_; + } + } + else + { + printf "cccmd = $cccmd\n" if $VERBOSE; + system($cccmd); + $ok = -s $tmp && -x _; + unlink("$tmp.c", $tmp); + } + } + + $ok; +} + +sub has_gettimeofday { + # confusing but true (if condition true ==> -DHAS_GETTIMEOFDAY already) + return 0 if $Config{'d_gettimeod'} eq 'define'; + return 1 if try_compile_and_link(<<EOM); +#include "EXTERN.h" +#include "perl.h" +#include "XSUB.h" +#ifdef I_SYS_TYPES +# include <sys/types.h> +#endif + +#ifdef I_SYS_TIME +# include <sys/time.h> +#endif + +#ifdef I_SYS_SELECT +# include <sys/select.h> /* struct timeval might be hidden in here */ +#endif +static int foo() +{ + struct timeval tv; + gettimeofday(&tv, 0); +} +int main _((int argc, char** argv, char** env)) +{ + foo(); +} +EOM + return 0; +} + +sub has_x { + my ($x, %args) = @_; + + return 1 if + try_compile_and_link(<<EOM, %args); +#include "EXTERN.h" +#include "perl.h" +#include "XSUB.h" + +#ifdef I_UNISTD +# include <unistd.h> +#endif + +#ifdef I_SYS_TYPES +# include <sys/types.h> +#endif + +#ifdef I_SYS_TIME +# include <sys/time.h> +#endif + +int main _((int argc, char** argv, char** env)) +{ + $x; +} +EOM + return 0; +} + +sub unixinit { + $DEFINE = ''; + + $LIBS = []; + + # this might break the link, try it if it can't find some things you + # honestly think should be in there... + # $LIBS = ['-lucb -lbsd']; + + # ... but ucb is poison for Solaris, and probably Linux. honest. + $LIBS = [] if $Config{'osname'} eq 'solaris'; + $LIBS = [] if $Config{'osname'} eq 'linux'; + $LIBS = ['-lm'] if $Config{'osname'} =~ /sco/i; + $LIBS = ['-lc'] if $Config{'osname'} =~ /dynixptx/i; + + # For nanosleep + push @$LIBS, '-lrt' unless $Config{'osname'} =~ /irix/; + push @$LIBS, '-lposix4' ; + + my @goodlibs; + + select(STDOUT); $| = 1; + + print "Checking for libraries...\n"; + my $lib; + for $lib (@$LIBS) { + print "Checking for $lib...\n"; + $LIBS = [ $lib ]; + if ($Config{libs} =~ /\b$lib\b/ || has_x("time(0)")) { + push @goodlibs, $lib; + } + } + @$LIBS = @goodlibs; + print @$LIBS ? + "You have extra libraries: @$LIBS.\n" : + "You have no applicable extra libraries.\n"; + print "\n"; + + print "Looking for gettimeofday()...\n"; + my $has_gettimeofday; + if ($Config{'d_gettimeod'}) { + $has_gettimeofday++; + } elsif (has_gettimeofday()) { + $DEFINE .= ' -DHAS_GETTIMEOFDAY'; + $has_gettimeofday++; + } + + if ($has_gettimeofday) { + print "You have gettimeofday().\n\n"; + } else { + die <<EOD +Your operating system does not seem to have the gettimeofday() function. +(or, at least, I cannot find it) + +There is no way Time::HiRes is going to work. + +I am awfully sorry but I cannot go further. + +Aborting configuration. + +EOD + } + + print "Looking for setitimer()...\n"; + my $has_setitimer; + if ($Config{d_setitimer}) { + $has_setitimer++; + } elsif (has_x("setitimer(ITIMER_REAL, 0, 0)")) { + $has_setitimer++; + $DEFINE .= ' -DHAS_SETITIMER'; + } + + if ($has_setitimer) { + print "You have setitimer().\n\n"; + } else { + print "No setitimer().\n\n"; + } + + print "Looking for getitimer()...\n"; + my $has_getitimer; + if ($Config{d_getitimer}) { + $has_getitimer++; + } elsif (has_x("getitimer(ITIMER_REAL, 0)")) { + $has_getitimer++; + $DEFINE .= ' -DHAS_GETITIMER'; + } + + if ($has_getitimer) { + print "You have getitimer().\n\n"; + } else { + print "No getitimer().\n\n"; + } + + if ($has_setitimer && $has_getitimer) { + print "You have interval timers (both setitimer and setitimer).\n\n"; + } else { + print "You do not have interval timers.\n\n"; + } + + print "Looking for ualarm()...\n"; + my $has_ualarm; + if ($Config{d_ualarm}) { + $has_ualarm++; + } elsif (has_x ("ualarm (0, 0)")) { + $has_ualarm++; + $DEFINE .= ' -DHAS_UALARM'; + } + + if ($has_ualarm) { + print "You have ualarm().\n\n"; + } else { + print "Whoops! No ualarm()!\n"; + if ($setitimer) { + print "You have setitimer(); we can make a Time::HiRes::ualarm()\n\n"; + } else { + print "We'll manage.\n\n"; + } + } + + print "Looking for usleep()...\n"; + my $has_usleep; + if ($Config{d_usleep}) { + $has_usleep++; + } elsif (has_x ("usleep (0)")) { + $has_usleep++; + $DEFINE .= ' -DHAS_USLEEP'; + } + + if ($has_usleep) { + print "You have usleep().\n\n"; + } else { + print "Whoops! No usleep()! Let's see if you have select().\n"; + if ($Config{'d_select'} eq 'define') { + print "You have select(); we can make a Time::HiRes::usleep()\n\n"; + } else { + print "No select(); you won't have a Time::HiRes::usleep()\n\n"; + } + } + + print "Looking for nanosleep()...\n"; + my $has_nanosleep; + if ($Config{d_nanosleep}) { + $has_nanosleep++; + } elsif (has_x ("nanosleep (NULL, NULL)")) { + $has_nanosleep++; + $DEFINE .= ' -DHAS_NANOSLEEP'; + } + + if ($has_nanosleep) { + print "You have nanosleep(). You can mix subsecond sleeps with signals.\n\n"; + } else { + print "Whoops! No nanosleep()! You cannot mix subsecond sleeps with signals.\n"; + } + + if ($DEFINE) { + $DEFINE =~ s/^\s+//; + if (open(XDEFINE, ">xdefine")) { + print XDEFINE $DEFINE, "\n"; + close(XDEFINE); + } + } +} + +sub doMakefile { + @makefileopts = (); + + if ($] >= 5.005) { + push (@makefileopts, + 'AUTHOR' => 'Jarkko Hietaniemi <jhi@iki.fi>', + 'ABSTRACT_FROM' => 'HiRes.pm', + ); + $DEFINE .= " -DATLEASTFIVEOHOHFIVE"; + } + + push (@makefileopts, + 'NAME' => 'Time::HiRes', + 'VERSION_FROM' => 'HiRes.pm', # finds $VERSION + 'LIBS' => $LIBS, # e.g., '-lm' + 'DEFINE' => $DEFINE, # e.g., '-DHAS_SOMETHING' + 'XSOPT' => $XSOPT, + # do not even think about 'INC' => '-I/usr/ucbinclude', Solaris will avenge. + 'INC' => '', # e.g., '-I/usr/include/other' + 'INSTALLDIRS' => 'perl', + 'dist' => { + 'CI' => 'ci -l', + 'COMPRESS' => 'gzip -9f', + 'SUFFIX' => 'gz', + }, + clean => { FILES => "xdefine" }, + ); + + WriteMakefile(@makefileopts); +} + +sub main { + print <<EOM; + +Configuring Time::HiRes... + +EOM + + if ($^O =~ /Win32/i) { + $DEFINE = '-DSELECT_IS_BROKEN'; + $LIBS = ['']; + } else { + unixinit(); + } + configure; + doMakefile; + my $make = $Config{'make'} || "make"; + unless ($ENV{PERL_CORE}) { + print <<EOM; + +Done configuring. + +Now you may issue '$make'. Do not forget also '$make test'. + +EOM + } +} + +&main; +# EOF diff --git a/ext/Time/HiRes/typemap b/ext/Time/HiRes/typemap new file mode 100644 index 0000000000..1124eb6483 --- /dev/null +++ b/ext/Time/HiRes/typemap @@ -0,0 +1,313 @@ +# basic C types +int T_IV +unsigned T_UV +unsigned int T_UV +long T_IV +unsigned long T_UV +short T_IV +unsigned short T_UV +char T_CHAR +unsigned char T_U_CHAR +char * T_PV +unsigned char * T_PV +const char * T_PV +caddr_t T_PV +wchar_t * T_PV +wchar_t T_IV +bool_t T_IV +size_t T_UV +ssize_t T_IV +time_t T_NV +unsigned long * T_OPAQUEPTR +char ** T_PACKEDARRAY +void * T_PTR +Time_t * T_PV +SV * T_SV +SVREF T_SVREF +AV * T_AVREF +HV * T_HVREF +CV * T_CVREF + +IV T_IV +UV T_UV +NV T_NV +I32 T_IV +I16 T_IV +I8 T_IV +STRLEN T_UV +U32 T_U_LONG +U16 T_U_SHORT +U8 T_UV +Result T_U_CHAR +Boolean T_BOOL +float T_FLOAT +double T_DOUBLE +SysRet T_SYSRET +SysRetLong T_SYSRET +FILE * T_STDIO +PerlIO * T_INOUT +FileHandle T_PTROBJ +InputStream T_IN +InOutStream T_INOUT +OutputStream T_OUT +bool T_BOOL + +############################################################################# +INPUT +T_SV + $var = $arg +T_SVREF + if (SvROK($arg)) + $var = (SV*)SvRV($arg); + else + Perl_croak(aTHX_ \"$var is not a reference\") +T_AVREF + if (SvROK($arg) && SvTYPE(SvRV($arg))==SVt_PVAV) + $var = (AV*)SvRV($arg); + else + Perl_croak(aTHX_ \"$var is not an array reference\") +T_HVREF + if (SvROK($arg) && SvTYPE(SvRV($arg))==SVt_PVHV) + $var = (HV*)SvRV($arg); + else + Perl_croak(aTHX_ \"$var is not a hash reference\") +T_CVREF + if (SvROK($arg) && SvTYPE(SvRV($arg))==SVt_PVCV) + $var = (CV*)SvRV($arg); + else + Perl_croak(aTHX_ \"$var is not a code reference\") +T_SYSRET + $var NOT IMPLEMENTED +T_UV + $var = ($type)SvUV($arg) +T_IV + $var = ($type)SvIV($arg) +T_INT + $var = (int)SvIV($arg) +T_ENUM + $var = ($type)SvIV($arg) +T_BOOL + $var = (bool)SvTRUE($arg) +T_U_INT + $var = (unsigned int)SvUV($arg) +T_SHORT + $var = (short)SvIV($arg) +T_U_SHORT + $var = (unsigned short)SvUV($arg) +T_LONG + $var = (long)SvIV($arg) +T_U_LONG + $var = (unsigned long)SvUV($arg) +T_CHAR + $var = (char)*SvPV_nolen($arg) +T_U_CHAR + $var = (unsigned char)SvUV($arg) +T_FLOAT + $var = (float)SvNV($arg) +T_NV + $var = ($type)SvNV($arg) +T_DOUBLE + $var = (double)SvNV($arg) +T_PV + $var = ($type)SvPV_nolen($arg) +T_PTR + $var = INT2PTR($type,SvIV($arg)) +T_PTRREF + if (SvROK($arg)) { + IV tmp = SvIV((SV*)SvRV($arg)); + $var = INT2PTR($type,tmp); + } + else + Perl_croak(aTHX_ \"$var is not a reference\") +T_REF_IV_REF + if (sv_isa($arg, \"${ntype}\")) { + IV tmp = SvIV((SV*)SvRV($arg)); + $var = *INT2PTR($type *, tmp); + } + else + Perl_croak(aTHX_ \"$var is not of type ${ntype}\") +T_REF_IV_PTR + if (sv_isa($arg, \"${ntype}\")) { + IV tmp = SvIV((SV*)SvRV($arg)); + $var = INT2PTR($type, tmp); + } + else + Perl_croak(aTHX_ \"$var is not of type ${ntype}\") +T_PTROBJ + if (sv_derived_from($arg, \"${ntype}\")) { + IV tmp = SvIV((SV*)SvRV($arg)); + $var = INT2PTR($type,tmp); + } + else + Perl_croak(aTHX_ \"$var is not of type ${ntype}\") +T_PTRDESC + if (sv_isa($arg, \"${ntype}\")) { + IV tmp = SvIV((SV*)SvRV($arg)); + ${type}_desc = (\U${type}_DESC\E*) tmp; + $var = ${type}_desc->ptr; + } + else + Perl_croak(aTHX_ \"$var is not of type ${ntype}\") +T_REFREF + if (SvROK($arg)) { + IV tmp = SvIV((SV*)SvRV($arg)); + $var = *INT2PTR($type,tmp); + } + else + Perl_croak(aTHX_ \"$var is not a reference\") +T_REFOBJ + if (sv_isa($arg, \"${ntype}\")) { + IV tmp = SvIV((SV*)SvRV($arg)); + $var = *INT2PTR($type,tmp); + } + else + Perl_croak(aTHX_ \"$var is not of type ${ntype}\") +T_OPAQUE + $var = *($type *)SvPV_nolen($arg) +T_OPAQUEPTR + $var = ($type)SvPV_nolen($arg) +T_PACKED + $var = XS_unpack_$ntype($arg) +T_PACKEDARRAY + $var = XS_unpack_$ntype($arg) +T_CALLBACK + $var = make_perl_cb_$type($arg) +T_ARRAY + U32 ix_$var = $argoff; + $var = $ntype(items -= $argoff); + while (items--) { + DO_ARRAY_ELEM; + ix_$var++; + } + /* this is the number of elements in the array */ + ix_$var -= $argoff +T_STDIO + $var = PerlIO_findFILE(IoIFP(sv_2io($arg))) +T_IN + $var = IoIFP(sv_2io($arg)) +T_INOUT + $var = IoIFP(sv_2io($arg)) +T_OUT + $var = IoOFP(sv_2io($arg)) +############################################################################# +OUTPUT +T_SV + $arg = $var; +T_SVREF + $arg = newRV((SV*)$var); +T_AVREF + $arg = newRV((SV*)$var); +T_HVREF + $arg = newRV((SV*)$var); +T_CVREF + $arg = newRV((SV*)$var); +T_IV + sv_setiv($arg, (IV)$var); +T_UV + sv_setuv($arg, (UV)$var); +T_INT + sv_setiv($arg, (IV)$var); +T_SYSRET + if ($var != -1) { + if ($var == 0) + sv_setpvn($arg, "0 but true", 10); + else + sv_setiv($arg, (IV)$var); + } +T_ENUM + sv_setiv($arg, (IV)$var); +T_BOOL + $arg = boolSV($var); +T_U_INT + sv_setuv($arg, (UV)$var); +T_SHORT + sv_setiv($arg, (IV)$var); +T_U_SHORT + sv_setuv($arg, (UV)$var); +T_LONG + sv_setiv($arg, (IV)$var); +T_U_LONG + sv_setuv($arg, (UV)$var); +T_CHAR + sv_setpvn($arg, (char *)&$var, 1); +T_U_CHAR + sv_setuv($arg, (UV)$var); +T_FLOAT + sv_setnv($arg, (double)$var); +T_NV + sv_setnv($arg, (NV)$var); +T_DOUBLE + sv_setnv($arg, (double)$var); +T_PV + sv_setpv((SV*)$arg, $var); +T_PTR + sv_setiv($arg, PTR2IV($var)); +T_PTRREF + sv_setref_pv($arg, Nullch, (void*)$var); +T_REF_IV_REF + sv_setref_pv($arg, \"${ntype}\", (void*)new $ntype($var)); +T_REF_IV_PTR + sv_setref_pv($arg, \"${ntype}\", (void*)$var); +T_PTROBJ + sv_setref_pv($arg, \"${ntype}\", (void*)$var); +T_PTRDESC + sv_setref_pv($arg, \"${ntype}\", (void*)new\U${type}_DESC\E($var)); +T_REFREF + NOT_IMPLEMENTED +T_REFOBJ + NOT IMPLEMENTED +T_OPAQUE + sv_setpvn($arg, (char *)&$var, sizeof($var)); +T_OPAQUEPTR + sv_setpvn($arg, (char *)$var, sizeof(*$var)); +T_PACKED + XS_pack_$ntype($arg, $var); +T_PACKEDARRAY + XS_pack_$ntype($arg, $var, count_$ntype); +T_DATAUNIT + sv_setpvn($arg, $var.chp(), $var.size()); +T_CALLBACK + sv_setpvn($arg, $var.context.value().chp(), + $var.context.value().size()); +T_ARRAY + { + U32 ix_$var; + EXTEND(SP,size_$var); + for (ix_$var = 0; ix_$var < size_$var; ix_$var++) { + ST(ix_$var) = sv_newmortal(); + DO_ARRAY_ELEM + } + } +T_STDIO + { + GV *gv = newGVgen("$Package"); + PerlIO *fp = PerlIO_importFILE($var,0); + if ( fp && do_open(gv, "+<&", 3, FALSE, 0, 0, fp) ) + sv_setsv($arg, sv_bless(newRV((SV*)gv), gv_stashpv("$Package",1))); + else + $arg = &PL_sv_undef; + } +T_IN + { + GV *gv = newGVgen("$Package"); + if ( do_open(gv, "<&", 2, FALSE, 0, 0, $var) ) + sv_setsv($arg, sv_bless(newRV((SV*)gv), gv_stashpv("$Package",1))); + else + $arg = &PL_sv_undef; + } +T_INOUT + { + GV *gv = newGVgen("$Package"); + if ( do_open(gv, "+<&", 3, FALSE, 0, 0, $var) ) + sv_setsv($arg, sv_bless(newRV((SV*)gv), gv_stashpv("$Package",1))); + else + $arg = &PL_sv_undef; + } +T_OUT + { + GV *gv = newGVgen("$Package"); + if ( do_open(gv, "+>&", 3, FALSE, 0, 0, $var) ) + sv_setsv($arg, sv_bless(newRV((SV*)gv), gv_stashpv("$Package",1))); + else + $arg = &PL_sv_undef; + } diff --git a/ext/threads/shared/shared.pm b/ext/threads/shared/shared.pm index cd39da6bf8..3b41a30c14 100644 --- a/ext/threads/shared/shared.pm +++ b/ext/threads/shared/shared.pm @@ -6,7 +6,7 @@ use warnings; require Exporter; our @ISA = qw(Exporter); -our @EXPORT = qw(share cond_wait cond_broadcast cond_signal _refcnt _id _thrcnt); +our @EXPORT = qw(share cond_wait cond_broadcast cond_signal); our $VERSION = '0.90'; if ($threads::threads) { @@ -24,10 +24,10 @@ else { } -sub cond_wait_disabled { return @_ }; -sub cond_signal_disabled { return @_}; -sub cond_broadcast_disabled { return @_}; -sub share_disabled { return @_} +sub cond_wait_disabled (\[$@%]) { undef } +sub cond_signal_disabled (\[$@%]) { undef } +sub cond_broadcast_disabled (\[$@%]) { undef } +sub share_disabled (\[$@%]) { return $_[0] } $threads::shared::threads_shared = 1; @@ -72,7 +72,7 @@ It is used together with the threads module. =head1 EXPORT -C<share>, C<lock>, C<cond_wait>, C<cond_signal>, C<cond_broadcast> +C<share>, C<cond_wait>, C<cond_signal>, C<cond_broadcast> Note that if this module is imported when C<threads> has not yet been loaded, then these functions all become no-ops. This makes it possible @@ -87,7 +87,7 @@ environments. C<share> takes a value and marks it as shared. You can share a scalar, array, hash, scalar ref, array ref or hash ref. C<share> will return -the shared rvalue. +the shared rvalue but always as a reference. C<share> will traverse up references exactly I<one> level. C<share(\$a)> is equivalent to C<share($a)>, while C<share(\\$a)> is not. diff --git a/ext/threads/shared/t/disabled.t b/ext/threads/shared/t/disabled.t new file mode 100644 index 0000000000..067cf2561e --- /dev/null +++ b/ext/threads/shared/t/disabled.t @@ -0,0 +1,53 @@ +#!./perl -Tw + +# Tests of threads::shared's behavior when threads are disabled. + +BEGIN { + chdir 't'; + @INC = '../lib'; +} + +# Can't use Test::More, it turns threads on. +use Test; +plan tests => 31; + +use threads::shared; + +# Make sure threads are really off. +ok( !$INC{"threads.pm"} ); + +# Check each faked function. +foreach my $func (qw(share cond_wait cond_signal cond_broadcast)) { + ok( my $func_ref = __PACKAGE__->can($func) ? 1 : 0 ); + + eval qq{$func()}; + ok( $@, qr/^Not enough arguments / ); + + my %hash = (foo => 42, bar => 23); + eval qq{$func(\%hash)}; + ok( $@, '' ); + ok( $hash{foo}, 42 ); + ok( $hash{bar}, 23 ); +} + +# These all have no return value. +foreach my $func (qw(cond_wait cond_signal cond_broadcast)) { + my @array = qw(1 2 3 4); + ok( eval qq{$func(\@array)}, undef ); + ok( "@array", "1 2 3 4" ); +} + +# share() is supposed to return back it's argument as a ref. +{ + my @array = qw(1 2 3 4); + ok( share(@array), \@array ); + ok( ref &share({}), 'HASH' ); + ok( "@array", "1 2 3 4" ); +} + +# lock() should be a no-op. The return value is currently undefined. +{ + my @array = qw(1 2 3 4); + lock(@array); + ok( "@array", "1 2 3 4" ); +} diff --git a/ext/threads/shared/t/hv_refs.t b/ext/threads/shared/t/hv_refs.t index 31ea5d964f..94bf822f8f 100644 --- a/ext/threads/shared/t/hv_refs.t +++ b/ext/threads/shared/t/hv_refs.t @@ -32,7 +32,7 @@ use ExtUtils::testlib; use strict; BEGIN { print "1..13\n" }; use threads; -use threads::shared qw(:DEFAULT _refcnt _id); +use threads::shared; ok(1,1,"loaded"); my $foo; share($foo); @@ -57,9 +57,9 @@ my $gg = $foo{test}; $$gg = "test"; ok(7, ${$foo{test}} eq "test", "Check reference"); my $gg2 = delete($foo{test}); -ok(8, _id($$gg) == _id($$gg2), +ok(8, threads::shared::_id($$gg) == threads::shared::_id($$gg2), sprintf("Check we get the same thing (%x vs %x)", - _id($$gg),_id($$gg2))); + threads::shared::_id($$gg),threads::shared::_id($$gg2))); ok(9, $$gg eq $$gg2, "And check the values are the same"); ok(10, keys %foo == 0, "And make sure we realy have deleted the values"); { @@ -1077,15 +1077,7 @@ Perl_gv_fullname4(pTHX_ SV *sv, GV *gv, const char *prefix, bool keepmain) void Perl_gv_fullname3(pTHX_ SV *sv, GV *gv, const char *prefix) { - HV *hv = GvSTASH(gv); - if (!hv) { - (void)SvOK_off(sv); - return; - } - sv_setpv(sv, prefix ? prefix : ""); - sv_catpv(sv,HvNAME(hv)); - sv_catpvn(sv,"::", 2); - sv_catpvn(sv,GvNAME(gv),GvNAMELEN(gv)); + gv_fullname4(sv, gv, prefix, TRUE); } void @@ -1100,10 +1092,7 @@ Perl_gv_efullname4(pTHX_ SV *sv, GV *gv, const char *prefix, bool keepmain) void Perl_gv_efullname3(pTHX_ SV *sv, GV *gv, const char *prefix) { - GV *egv = GvEGV(gv); - if (!egv) - egv = gv; - gv_fullname3(sv, egv, prefix); + gv_efullname4(sv, gv, prefix, TRUE); } /* XXX compatibility with versions <= 5.003. */ diff --git a/hints/README.hints b/hints/README.hints index 1d0f35cccd..9b49a398bc 100644 --- a/hints/README.hints +++ b/hints/README.hints @@ -297,7 +297,11 @@ be circumvented by the use of "call-back units". That is, the hints file can tuck this information away into a file UU/cc.cbu. Then, after Configure prompts the user for the C compiler, it will load in and run the UU/cc.cbu "call-back" unit. See hints/solaris_2.sh for an -example. +example. Some callbacks exist for other variables than cc, such as for +uselongdouble. At the present time, these callbacks are only called if the +variable in question is defined; however, this may change, so the scheme in +hints/solaris_2.sh of checking to see if uselongdouble is defined is a good +idea. =item Future status diff --git a/hints/aix.sh b/hints/aix.sh index 09ca0a4b57..28bef0ece1 100644 --- a/hints/aix.sh +++ b/hints/aix.sh @@ -51,7 +51,8 @@ esac # Intuiting the existence of system calls under AIX is difficult, # at best; the safest technique is to find them empirically. -# AIX 4.3.* and above default to using nm for symbol extraction +# AIX 4.3.* and above default to letting Configure test if nm +# extraction will work. case "$osvers" in 3.*|4.1.*|4.2.*) case "$usenm" in @@ -62,9 +63,6 @@ case "$osvers" in esac ;; *) - case "$usenm" in - '') usenm='true' - esac case "$usenativedlopen" in '') usenativedlopen='true' esac @@ -211,6 +209,28 @@ esac # the required -bE:$installarchlib/CORE/perl.exp is added by # libperl.U (Configure) later. +case "$cc" in +*gcc*) ;; +cc*|xlc*) # cc should've been set by line 116 or so if empty. + if test ! -x /usr/bin/$cc -a -x /usr/vac/bin/$cc; then + case ":$PATH:" in + *:/usr/vac/bin:*) ;; + *) cat <<EOF + +*** +*** You either implicitly or explicitly specified an IBM C compiler, +*** but you do not seem to have one in /usr/bin, but you seem to have +*** the VAC installed in /usr/vac, but you do not have the /usr/vac/bin +*** in your PATH. I suggest adding that and retrying Configure. +*** +EOF + exit 1 + ;; + esac + fi + ;; +esac + case "$ldlibpthname" in '') ldlibpthname=LIBPATH ;; esac @@ -515,4 +535,37 @@ else esac fi +case "$PASE" in +define) + case "$prefix" in + '') prefix=/QOpenSys/perl ;; + esac + cat >&4 <<EOF + +*** +*** You seem to be compiling in AIX for the OS/400 PASE environment. +*** I'm not going to use the AIX bind, nsl, and possible util libraries, then. +*** I'm also not going to install perl as /usr/bin/perl. +*** Perl will be installed under $prefix. +*** For instructions how to install this build from AIX to PASE, +*** see the file README.os400. Accept the "aix" for the question +*** about "Operating system name". +*** +EOF + set `echo " $libswanted " | sed -e 's@ bind @ @' -e 's@ nsl @ @' -e 's@ util @ @'` + shift + libswanted="$*" + installusrbinperl="$undef" + + # V5R1 doesn't have this (V5R2 does), without knowing + # which one we have it's safer to be pessimistic. + # Cwd will work fine even without fchdir(), but if + # V5R1 tries to use code compiled assuming fchdir(), + # lots of grief will issue forth from Cwd. + case "$d_fchdir" in + '') d_fchdir="$undef" ;; + esac + ;; +esac + # EOF diff --git a/hints/darwin.sh b/hints/darwin.sh index 4bc95f0589..abc0a7c2c9 100644 --- a/hints/darwin.sh +++ b/hints/darwin.sh @@ -7,29 +7,35 @@ # Paths ## +# Configure hasn't figured out the version number yet. Bummer. +perl_revision=`awk '/define[ ]+PERL_REVISION/ {print $3}' $src/patchlevel.h` +perl_version=`awk '/define[ ]+PERL_VERSION/ {print $3}' $src/patchlevel.h` +perl_subversion=`awk '/define[ ]+PERL_SUBVERSION/ {print $3}' $src/patchlevel.h` +version="${perl_revision}.${perl_version}.${perl_subversion}" + # BSD paths case "$prefix" in -'') - # Default install; use non-system directories - prefix='/usr/local'; # Built-in perl uses /usr - siteprefix='/usr/local'; - vendorprefix='/usr/local'; usevendorprefix='define'; - - # Where to put modules. - privlib='/Library/Perl'; # Built-in perl uses /System/Library/Perl - sitelib='/Library/Perl'; - vendorlib='/Network/Library/Perl'; - ;; -'/usr') - # We are building/replacing the built-in perl - siteprefix='/usr/local'; - vendorprefix='/usr/local'; usevendorprefix='define'; - - # Where to put modules. - privlib='/System/Library/Perl'; - sitelib='/Library/Perl'; - vendorlib='/Network/Library/Perl'; - ;; + '') + # Default install; use non-system directories + prefix='/usr/local'; # Built-in perl uses /usr + siteprefix='/usr/local'; + vendorprefix='/usr/local'; usevendorprefix='define'; + + # Where to put modules. + privlib="/Library/Perl/${version}"; # Built-in perl uses /System/Library/Perl + sitelib="/Library/Perl/${version}"; + vendorlib="/Network/Library/Perl/${version}"; + ;; + '/usr') + # We are building/replacing the built-in perl + siteprefix='/usr/local'; + vendorprefix='/usr/local'; usevendorprefix='define'; + + # Where to put modules. + privlib="/System/Library/Perl/${version}"; + sitelib="/Library/Perl/${version}"; + vendorlib="/Network/Library/Perl/${version}"; + ;; esac # 4BSD uses ${prefix}/share/man, not ${prefix}/man. @@ -47,16 +53,15 @@ archname='darwin'; usenm='true'; # Optimize. -if [ "x$optimize" = 'x' ]; then - optimize='-O3' +if [ -z "${optimize}" ]; then + case "$osvers" in + [12345].*) optimize='-O3' ;; + *) optimize='-Os' ;; + esac fi # -pipe: makes compilation go faster. -# -fno-common: we don't like commons. Common symbols are not allowed -# in MH_DYLIB binaries, which is what libperl.dylib is. You will fail -# to link without that option, unless you otherwise eliminate all commons -# by, for example, initializing all globals. -# --Fred Sánchez +# -fno-common because common symbols are not allowed in MH_DYLIB ccflags="${ccflags} -pipe -fno-common" # At least on Darwin 1.3.x: @@ -80,19 +85,20 @@ ccflags="${ccflags} -pipe -fno-common" # stdint.h defining INT32_MIN as (-INT32_MAX-1) # -- Edward Moy # -case "`grep '^#define INT32_MIN' /usr/include/stdint.h`" in -*-2147483648) ccflags="${ccflags} -DINT32_MIN_BROKEN -DINT64_MIN_BROKEN" ;; +case "$(grep '^#define INT32_MIN' /usr/include/stdint.h)" in + *-2147483648) ccflags="${ccflags} -DINT32_MIN_BROKEN -DINT64_MIN_BROKEN" ;; esac # cppflags='-traditional-cpp'; -# avoid Apple's cpp precompiler, better for extensions +# Avoid Apple's cpp precompiler, better for extensions cppflags="${cppflags} -no-cpp-precomp" # and ccflags needs them as well since we don't use cpp directly +# -- If this is necessary, it's a bug. -wsv ccflags="${ccflags} -no-cpp-precomp" # Known optimizer problems. case "`cc -v 2>&1`" in -*"3.1 20020105"*) toke_cflags='optimize=""' ;; + *"3.1 20020105"*) toke_cflags='optimize=""' ;; esac # Shared library extension is .dylib. @@ -102,12 +108,10 @@ so='dylib'; dlext='bundle'; dlsrc='dl_dyld.xs'; usedl='define'; cccdlflags=' '; # space, not empty, because otherwise we get -fpic -# ldflag: -flat_namespace is only available since OS X 10.1 (Darwin 1.4.1) -# - but not in 10.0.x (Darwin 1.3.x) -# -- Kay Roepke +# Perl bundles do not expect two-level namespace, added in Darwin 1.4. case "$osvers" in -1.[0-3].*) ;; -*) ldflags="${ldflags} -flat_namespace" ;; + 1.[0-3].*) ;; + *) ldflags="${ldflags} -flat_namespace" ;; esac lddlflags="${ldflags} -bundle -undefined suppress"; ldlibpthname='DYLD_LIBRARY_PATH'; @@ -142,13 +146,13 @@ firstmakefile=GNUmakefile; # Fix when Apple fixes libc. # case "$usethreads$useithreads$use5005threads" in -*define*) -cat <<EOM >&4 + *define*) + cat <<EOM >&4 *** Warning, there might be problems with your libraries with *** regards to threading. The test ext/threads/t/libc.t is likely *** to fail. EOM - ;; + ;; esac diff --git a/hints/dec_osf.sh b/hints/dec_osf.sh index b3872fac12..8ef151e93f 100644 --- a/hints/dec_osf.sh +++ b/hints/dec_osf.sh @@ -357,14 +357,10 @@ case "`/usr/sbin/sizer -v`" in *[1-4].0*) d_modfl=undef ;; # must wait till 5.0 esac -# Keep those leading tabs. - needusrshlib='' +# Keep that leading tab. old_LD_LIBRARY_PATH=$LD_LIBRARY_PATH for p in $loclibpth do - if test -n "`ls $p/libdb.so* 2>/dev/null`"; then - needusrshlib=yes - fi if test -d $p; then echo "Appending $p to LD_LIBRARY_PATH." >& 4 case "$LD_LIBRARY_PATH" in @@ -377,14 +373,6 @@ case "$LD_LIBRARY_PATH" in "$old_LD_LIBRARY_PATH") ;; *) echo "LD_LIBRARY_PATH is now $LD_LIBRARY_PATH." >& 4 ;; esac -# This is evil but I can't think of a nice workaround: -# the /usr/shlib/libdb.so needs to be seen first, -# or running Configure will fail. -if test -n "$needusrshlib"; then - echo "Prepending /usr/shlib to loclibpth." >& 4 - loclibpth="/usr/shlib $loclibpth" - echo "loclibpth is now $loclibpth." >& 4 -fi # # Unset temporary variables no more needed. diff --git a/hints/hpux.sh b/hints/hpux.sh index 71705163d4..b2a888c164 100644 --- a/hints/hpux.sh +++ b/hints/hpux.sh @@ -410,6 +410,58 @@ case "$ccisgcc" in # ;; # esac +# Once we have the compiler flags defined, Configure will +# execute the following call-back script. See hints/README.hints +# for details. +cat > UU/cc.cbu <<'EOCBU' +# This script UU/cc.cbu will get 'called-back' by Configure after it +# has prompted the user for the C compiler to use. + +# Compile and run the a test case to see if a certain gcc bug is +# present. If so, lower the optimization level when compiling +# pp_pack.c. This works around a bug in unpack. + +if test -z "$ccisgcc" -a -z "$gccversion"; then + : no tests needed for HPc +else + echo " " + echo "Testing for a certain gcc bug is fixed in your compiler..." + + # Try compiling the test case. + if $cc -o t001 -O $ccflags $ldflags -lm ../hints/t001.c; then + gccbug=`$run ./t001` + case "$gccbug" in + *fails*) + cat >&4 <<EOF +This C compiler ($gccversion) is known to have optimizer +problems when compiling pp_pack.c. + +Disabling optimization for pp_pack.c. +EOF + case "$pp_pack_cflags" in + '') pp_pack_cflags='optimize=' + echo "pp_pack_cflags='optimize=\"\"'" >> config.sh ;; + *) echo "You specified pp_pack_cflags yourself, so we'll go with your value." >&4 ;; + esac + ;; + *) echo "Your compiler is ok." >&4 + ;; + esac + else + echo " " + echo "*** WHOA THERE!!! ***" >&4 + echo " Your C compiler \"$cc\" doesn't seem to be working!" >&4 + case "$knowitall" in + '') echo " You'd better start hunting for one and let me know about it." >&4 + exit 1 + ;; + esac + fi + + rm -f t001$_o t001$_exe + fi +EOCBU + cat >UU/uselargefiles.cbu <<'EOCBU' # This script UU/uselargefiles.cbu will get 'called-back' by Configure # after it has prompted the user for whether to use large files. diff --git a/hints/irix_6.sh b/hints/irix_6.sh index 8b14e54d55..ef7c5a6630 100644 --- a/hints/irix_6.sh +++ b/hints/irix_6.sh @@ -37,7 +37,43 @@ # If that fails, or you didn't use that, then try adjusting other # optimization options (-LNO, -INLINE, -O3 to -O2, etcetera). # The compiler bug has been reported to SGI. -# -- Allen Smith <easmith@beatrice.rutgers.edu> +# -- Allen Smith <allens@cpan.org> + +case "$use64bitall" in +$define|true|[yY]*) + case "`uname -s`" in + IRIX) + cat <<END >&2 +You have asked for use64bitall but you aren't running on 64-bit IRIX. +I'll try changing it to use64bitint. +END + use64bitall="$undef" + + case "`uname -r`" in + [1-5]*|6.[01]) + cat <<END >&2 +Sorry, can't do use64bitint either. Try upgrading to IRIX 6.2 or later. +END + use64bitint="$undef" + ;; + *) use64bitint="$define" + ;; + esac + ;; + esac + ;; +esac + +# Until we figure out what to be probed for in Configure (ditto for hpux.sh) +case "$usemorebits" in # Need to expand this now, then. +$define|true|[yY]*) + case "`uname -r`" in + [1-5]*|6.[01]) + uselongdouble="$define" + ;; + *) use64bitint="$define" uselongdouble="$define" ;; + esac +esac # Let's assume we want to use 'cc -n32' by default, unless the # necessary libm is missing (which has happened at least twice) @@ -48,51 +84,38 @@ case "$cc" in esac esac +case "$use64bitint" in + "$define"|true|[yY]*) ;; + *) d_casti32="$undef" ;; +esac + cc=${cc:-cc} +cat=${cat:-cat} + +$cat > UU/cc.cbu <<'EOCCBU' +# This script UU/cc.cbu will get 'called-back' by Configure after it +# has prompted the user for the C compiler to use. case "$cc" in *gcc*) ;; *) ccversion=`cc -version 2>&1` ;; esac -case "$use64bitint" in -$define|true|[yY]*) - case "`uname -r`" in - [1-5]*|6.[01]) - cat >&4 <<EOM -IRIX `uname -r` does not support 64-bit types. -You should upgrade to at least IRIX 6.2. -Cannot continue, aborting. -EOM - exit 1 - ;; - esac - ;; -esac - -case "$use64bitall" in -"$define"|true|[yY]*) - case "`uname -s`" in - IRIX) - cat >&4 <<EOM -You cannot use -Duse64bitall in 32-bit IRIX, sorry. - -Cannot continue, aborting. -EOM - exit 1 - ;; - esac - ;; -esac - # Check for which compiler we're using case "$cc" in *"cc -n32"*) + test -z "$ldlibpthname" && ldlibpthname='LD_LIBRARYN32_PATH' # If a library is requested to link against, make sure the # objects in the library are of the same ABI we are compiling # against. Albert Chin-A-Young <china@thewrittenword.com> + + # In other words, you no longer have to worry regarding having old + # library paths (/usr/lib) in the searchpath for -n32 or -64; thank + # you very much, Albert! Now if we could just get more module authors + # to use something like this... - Allen + libscheck='case "$xxx" in *.a) /bin/ar p $xxx `/bin/ar t $xxx | sed q` >$$.o; case "`/usr/bin/file $$.o`" in @@ -106,37 +129,49 @@ case "$cc" in esac' # NOTE: -L/usr/lib32 -L/lib32 are automatically selected by the linker - ldflags=' -L/usr/local/lib32 -L/usr/local/lib' + test -z "$ldflags" && ldflags=' -L/usr/local/lib32 -L/usr/local/lib' cccdlflags=' ' # From: David Billinghurst <David.Billinghurst@riotinto.com.au> # If you get complaints about so_locations then change the following # line to something like: # lddlflags="-n32 -shared -check_registry /usr/lib32/so_locations" - lddlflags="-n32 -shared" - libc='/usr/lib32/libc.so' - plibpth='/usr/lib32 /lib32 /usr/ccs/lib' + test -z "$lddlflags" && lddlflags="-n32 -shared" + test -z "$libc" && libc='/usr/lib32/libc.so' + test -z "$plibpth" && plibpth='/usr/lib32 /lib32 /usr/ccs/lib' ;; *"cc -64"*) - + case "`uname -s`" in + IRIX) + $cat >&4 <<EOM +You cannot use cc -64 or -Duse64bitall in 32-bit IRIX, sorry. +Cannot continue, aborting. +EOM + exit 1 + ;; + esac + test -z "$ldlibpthname" && ldlibpthname='LD_LIBRARY64_PATH' + test -z "$use64bitall" && use64bitall="$define" + test -z "$use64bitint" && use64bitint="$define" loclibpth="$loclibpth /usr/lib64" libscheck='case "`/usr/bin/file $xxx`" in *64-bit*) ;; *) xxx=/no/64-bit$xxx ;; esac' # NOTE: -L/usr/lib64 -L/lib64 are automatically selected by the linker - ldflags=' -L/usr/local/lib64 -L/usr/local/lib' + test -z "$ldflags" && ldflags=' -L/usr/local/lib64 -L/usr/local/lib' cccdlflags=' ' + test -z "$archname64" && archname64='64all' # From: David Billinghurst <David.Billinghurst@riotinto.com.au> # If you get complaints about so_locations then change the following # line to something like: # lddlflags="-64 -shared -check_registry /usr/lib64/so_locations" - lddlflags="-64 -shared" - libc='/usr/lib64/libc.so' - plibpth='/usr/lib64 /lib64 /usr/ccs/lib' + test -z lddlflags="-64 -shared" + test -z "$libc" && libc='/usr/lib64/libc.so' + test -z "$plibpth" && plibpth='/usr/lib64 /lib64 /usr/ccs/lib' ;; *gcc*) ccflags="$ccflags -D_BSD_TYPES -D_BSD_TIME -D_POSIX_C_SOURCE" - optimize="-O3" + test -z "$optimize" && optimize="-O3" usenm='undef' case "`uname -s`" in # Without the -mabi=64 gcc in 64-bit IRIX has problems passing @@ -162,7 +197,7 @@ esac # Settings common to both native compiler modes. case "$cc" in *"cc -n32"*|*"cc -64"*) - ld=$cc + test -z "$ld" && ld=$cc # perl's malloc can return improperly aligned buffer # which (under 5.6.0RC1) leads into really bizarre bus errors @@ -175,10 +210,12 @@ case "$cc" in # miniperl, as was Scott Henry with snapshots from just before # the RC1. --jhi usemymalloc='undef' -#malloc_cflags='ccflags="-DSTRICT_ALIGNMENT $ccflags"' - nm_opt='-p' - nm_so_opt='-p' + # Was at the first of the line - Allen + #malloc_cflags='ccflags="-DSTRICT_ALIGNMENT $ccflags"' + + nm_opt="$nm_opt -p" + nm_so_opt="$nm_so_opt -p" # Warnings to turn off because the source code hasn't # been cleaned up enough yet to satisfy the IRIX cc. @@ -197,24 +234,45 @@ case "$cc" in optimize='none' ;; *7.1*|*7.2|*7.20) # Mongoose 7.1+ - ccflags="$ccflags -D_BSD_TYPES -D_BSD_TIME -woff $woff -OPT:Olimit=0" - optimize='-O3' -# This is a temporary fix for 5.005. -# Leave pp_ctl_cflags line at left margin for Configure. See -# hints/README.hints, especially the section -# =head2 Propagating variables to config.sh -pp_ctl_cflags='optimize=-O' + ccflags="$ccflags -D_BSD_TYPES -D_BSD_TIME -woff $woff" + case "$optimize" in + '') optimize='-O3 -OPT:Olimit=0' ;; + '-O') optimize='-O3 -OPT:Olimit=0' ;; + *) ;; + esac + + # This is a temporary fix for 5.005+. + # See hints/README.hints, especially the section + # =head2 Propagating variables to config.sh + + # Note the part about case statements not working without + # weirdness like the below echo statement... and, since + # we're in a callback unit, it's to config.sh, not UU/config.sh + # - Allen + + + pp_ctl_cflags="$pp_ctl_flags optimize=\"$optimize -O1\"" + echo "pp_ctl_cflags=\"$pp_ctl_flags optimize=\\\"\$optimize -O1\\\"\"" >> config.sh ;; + + + +# XXX What is space=ON doing in here? Could someone ask Scott Henry? - Allen + *7.*) # Mongoose 7.2.1+ - ccflags="$ccflags -D_BSD_TYPES -D_BSD_TIME -woff $woff -OPT:Olimit=0:space=ON" - optimize='-O3' + ccflags="$ccflags -D_BSD_TYPES -D_BSD_TIME -woff $woff" + case "$optimize" in + '') optimize='-O3 -OPT:Olimit=0:space=ON' ;; + '-O') optimize='-O3 -OPT:Olimit=0:space=ON' ;; + *) ;; + esac ;; *6.2*) # Ragnarok 6.2 ccflags="$ccflags -D_BSD_TYPES -D_BSD_TIME -woff $woff" optimize='none' ;; *) # Be safe and not optimize - ccflags="$ccflags -D_BSD_TYPES -D_BSD_TIME -woff $woff -OPT:Olimit=0" + ccflags="$ccflags -D_BSD_TYPES -D_BSD_TIME -woff $woff" optimize='none' ;; esac @@ -242,15 +300,29 @@ pp_ctl_cflags='optimize=-O' ;; esac -# Don't groan about unused libraries. -ldflags="$ldflags -Wl,-woff,84" - # workaround for an optimizer bug +# Made to work via UU/config.sh thing (or, rather, config.sh, since we're in +# a callback) from README.hints, plus further stuff; doesn't handle -g still, +# unfortunately - Allen case "`$cc -version 2>&1`" in -*7.2.*) op_cflags='optimize=-O1'; opmini_cflags='optimize=-O1' ;; -*7.3.1.*) op_cflags='optimize=-O2'; opmini_cflags='optimize=-O2' ;; +*7.2.*) + test -z "$op_cflags" && echo "op_cflags=\"optimize=\\\"\$optimize -O1\\\"\"" >> config.sh + test -z "$op_cflags" && op_cflags="optimize=\"\$optimize -O1\"" + test -z "$opmini_cflags" && echo "opmini_cflags=\"optimize=\\\"\$optimize -O1\\\"\"" >> config.sh + test -z "$opmini_cflags" && opmini_cflags="optimize=\"\$optimize -O1\"" + ;; +*7.3.1.*) + test -z "$op_cflags" && echo "op_cflags=\"optimize=\\\"\$optimize -O2\\\"\"" >> config.sh + test -z "$op_cflags" && op_cflags="$op_cflags optimize=\"\$optimize -O2\"" + test -z "$opmini_cflags" && echo "opmini_cflags=\"optimize=\\\"\$optimize -O2\\\"\"" >> config.sh + test -z "$opmini_cflags" && opmini_cflags="optimize=\"\$optimize -O2\"" + ;; esac +EOCCBU + +# End of cc.cbu callback unit. - Allen + # We don't want these libraries. # Socket networking is in libc, these are not installed by default, # and just slow perl down. (scotth@sgi.com) @@ -258,15 +330,10 @@ set `echo X "$libswanted "|sed -e 's/ socket / /' -e 's/ nsl / /' -e 's/ dl / /' shift libswanted="$*" -# Irix 6.5.6 seems to have a broken header <sys/mode.h> -# don't include that (it doesn't contain S_IFMT, S_IFREG, et al) - -i_sysmode="$undef" - # I have conflicting reports about the sun, crypt, bsd, and PW # libraries on Irix 6.2. # -# One user rerports: +# One user reports: # Don't need sun crypt bsd PW under 6.2. You *may* need to link # with these if you want to run perl built under 6.2 on a 5.3 machine # (I haven't checked) @@ -287,7 +354,33 @@ set `echo X "$libswanted "|sed -e 's/ sun / /' -e 's/ crypt / /' -e 's/ bsd / /' shift libswanted="$*" -cat > UU/usethreads.cbu <<'EOCBU' +# libbind.{so|a} would be from a BIND/named installation - IRIX 6.5.* has +# pretty much everything that would be useful in libbind in libc, including +# accessing a local caching server (nsd) that will also look in /etc/hosts, +# NIS (yuck!), etcetera. libbind also doesn't have the _r (thread-safe +# reentrant) functions. +# - Allen <easmith@beatrice.rutgers.edu> + +case "`uname -r`" in +6.5) + set `echo X "$libswanted "|sed -e 's/ bind / /'` + shift + libswanted="$*" + ;; +esac + +# Don't groan about unused libraries. +case "$ldflags" in + *-Wl,-woff,84*) ;; + *) ldflags="$ldflags -Wl,-woff,84" ;; +esac + +# Irix 6.5.6 seems to have a broken header <sys/mode.h> +# don't include that (it doesn't contain S_IFMT, S_IFREG, et al) + +i_sysmode="$undef" + +$cat > UU/usethreads.cbu <<'EOCBU' # This script UU/usethreads.cbu will get 'called-back' by Configure # after it has prompted the user for whether to use threads. case "$usethreads" in @@ -328,7 +421,6 @@ EOM exit 1 fi set `echo X "$libswanted "| sed -e 's/ c / pthread /'` - ld="${cc:-cc}" shift libswanted="$*" @@ -337,25 +429,186 @@ EOM # These are hidden behind a _POSIX1C ifdef that would # require including <pthread.h> for the Configure hasproto # to see these. - d_asctime_r_proto="$define" - d_ctime_r_proto="$define" - d_gmtime_r_proto="$define" - d_localtime_r_proto="$define" + +# d_asctime_r_proto="$define" +# d_ctime_r_proto="$define" +# d_gmtime_r_proto="$define" +# d_localtime_r_proto="$define" + + # Safer just to go ahead and include it, for other ifdefs like them + # (there are a lot, such as in netdb.h). - Allen + ccflags="$ccflags -DPTHREAD_H_FIRST" + + pthread_h_first="$define" + echo "pthread_h_first='define'" >> config.sh + ;; + esac EOCBU # The -n32 makes off_t to be 8 bytes, so we should have largefileness. -# Until we figure out what to be probe for in Configure (ditto for hpux.sh) -case "$usemorebits" in # Need to expand this now, then. -$define|true|[yY]*) use64bitint="$define"; uselongdouble="$define" ;; -esac +$cat > UU/use64bitint.cbu <<'EOCBU' +# This script UU/use64bitint.cbu will get 'called-back' by Configure +# after it has prompted the user for whether to use 64 bit integers. + case "$use64bitint" in -$define|true|[yY]*) ;; -*) d_casti32='undef' ;; +$define|true|[yY]*) + case "`uname -r`" in + [1-5]*|6.[01]) + cat >&4 <<EOM +IRIX `uname -r` does not support 64-bit types. +You should upgrade to at least IRIX 6.2. +Cannot continue, aborting. +EOM + exit 1 + ;; + esac + usemymalloc="$undef" + ;; +*) d_casti32="$undef" ;; +esac + +EOCBU + +$cat > UU/use64bitall.cbu <<'EOCBU' +# This script UU/use64bitall.cbu will get 'called-back' by Configure +# after it has prompted the user for whether to be maximally 64 bitty. + +case "$use64bitall" in +$define|true|[yY]*) + case "$cc" in + *-n32*|*-32*) + cat >&4 <<EOM +You cannot use a non-64 bit cc for -Duse64bitall, sorry. +Cannot continue, aborting. +EOM + exit 1 + ;; + esac + ;; +esac + +EOCBU + +$cat > UU/uselongdouble.cbu <<'EOCBU' +# This script UU/uselongdouble.cbu will get 'called-back' by Configure +# after it has prompted the user for whether to use long doubles. + +# This script is designed to test IRIX (and other machines, once it's put into +# Configure) for a bug in which they fail to round correctly when using +# sprintf/printf/etcetera on a long double with precision specified (%.0Lf or +# whatever). Sometimes, this only happens when the number in question is +# between 1 and -1, weirdly enough. - Allen + +case "$uselongdouble" in +$define|true|[yY]*) + +case "$d_PRIfldbl" in +$define|true|[yY]*) + + echo " " >try.c + $cat >>try.c <<EOP +#include <stdio.h> + +#define sPRIfldbl $sPRIfldbl + +#define I_STDLIB $i_stdlib +#ifdef I_STDLIB +#include <stdlib.h> +#endif + +int main() +{ + char buf1[64]; + char buf2[64]; + buf1[63] = '\0'; + buf2[63] = '\0'; + + (void)sprintf(buf1,"%.0"sPRIfldbl,(long double)0.6L); + (void)sprintf(buf2,"%.0f",(double)0.6); + if (strcmp(buf1,buf2)) { + exit(1); + } + (void)sprintf(buf1,"%.0"sPRIfldbl,(long double)-0.6L); + (void)sprintf(buf2,"%.0f",(double)-0.6); + if (strcmp(buf1,buf2)) { + exit(1); + } else { + exit(0); + } +} + +EOP + + set try + if eval $compile && $run ./try; then + rm -f try try.* >/dev/null + else + rm -f try try.* core a.out >/dev/null + ccflags="$ccflags -DHAS_LDBL_SPRINTF_BUG" + cppflags="$cppflags -DHAS_LDBL_SPRINTF_BUG" + + echo " " >try.c + $cat >>try.c <<EOP +#include <stdio.h> + +#define sPRIfldbl $sPRIfldbl + +#define I_STDLIB $i_stdlib +#ifdef I_STDLIB +#include <stdlib.h> +#endif + +int main() +{ + char buf1[64]; + char buf2[64]; + buf1[63] = '\0'; + buf2[63] = '\0'; + + (void)sprintf(buf1,"%.0"sPRIfldbl,(long double)1.6L); + (void)sprintf(buf2,"%.0f",(double)1.6); + if (strcmp(buf1,buf2)) { + exit(1); + } + (void)sprintf(buf1,"%.0"sPRIfldbl,(long double)-1.6L); + (void)sprintf(buf2,"%.0f",(double)-1.6); + if (strcmp(buf1,buf2)) { + exit(1); + } else { + exit(0); + } +} + +EOP + + set try + if eval $compile && $run ./try; then + rm -f try try.c >/dev/null + ccflags="$ccflags -DHAS_LDBL_SPRINTF_BUG_LESS1" + cppflags="$cppflags -DHAS_LDBL_SPRINTF_BUG_LESS1" + else + rm -f try try.c core try.o a.out >/dev/null + fi + fi +;; +*) # Can't tell! + ccflags="$ccflags -DHAS_LDBL_SPRINTF_BUG" + cppflags="$cppflags -DHAS_LDBL_SPRINTF_BUG" + ;; +esac + +# end of case statement for how to print ldbl with 'f' +;; +*) ;; esac +# end of case statement for whether to do long doubles + +EOCBU + # Helmut Jarausch reports that Perl's malloc is rather unusable # with IRIX, and SGI confirms the problem. usemymalloc=${usemymalloc:-false} diff --git a/hints/linux.sh b/hints/linux.sh index 7dccc1cc07..e152a6a3ce 100644 --- a/hints/linux.sh +++ b/hints/linux.sh @@ -249,7 +249,7 @@ esac cat > UU/usethreads.cbu <<'EOCBU' case "$usethreads" in $define|true|[yY]*) - ccflags="-D_REENTRANT -D_GNU_SOURCE $ccflags" + ccflags="-D_REENTRANT -D_GNU_SOURCE -DTHREADS_HAVE_PIDS $ccflags" set `echo X "$libswanted "| sed -e 's/ c / pthread c /'` shift libswanted="$*" diff --git a/hints/netbsd.sh b/hints/netbsd.sh index 741413ed4f..d246d09fe5 100644 --- a/hints/netbsd.sh +++ b/hints/netbsd.sh @@ -144,3 +144,28 @@ case "$rpathflag" in done ;; esac + +case `uname -m` in +alpha) + echo 'int main() {}' > try.c + gcc=`${cc:-cc} -v -c try.c 2>&1|grep 'gcc version egcs-2'` + case "$gcc" in + '' | "gcc version egcs-2.95."[3-9]*) ;; # 2.95.3 or better okay + *) cat >&4 <<EOF +*** +*** Your gcc ($gcc) is known to be +*** too buggy on netbsd/alpha to compile Perl with optimization. +*** It is suggested you install the lang/gcc package which should +*** have at least gcc 2.95.3 which should work okay: use for example +*** Configure -Dcc=/usr/pkg/gcc-2.95.3/bin/cc. You could also +*** Configure -Doptimize=-O0 to compile Perl without any optimization +*** but that is not recommended. +*** +EOF + exit 1 + ;; + esac + rm -f try.* + ;; +esac + diff --git a/hints/os400.sh b/hints/os400.sh new file mode 100644 index 0000000000..16eec2fbe2 --- /dev/null +++ b/hints/os400.sh @@ -0,0 +1,24 @@ +# +# We will just reuse the AIX hints since we support only building +# for the PASE and the PASE hints are merged with the AIX hints. +# + +case "$PASE" in +'') cat >&4 <<EOF +*** +*** This build process only works with the PASE environment (not ILE). +*** You must supply the -DPASE parameter to the Configure script, +*** please read the file README.os400. Exiting now. +*** +EOF + exit 1 + ;; +*) cat >&4 <<EOF +*** +*** Using the AIX hints file, $src/hints/aix.sh. +*** +EOF + osname=aix + . $src/hints/aix.sh + ;; +esac diff --git a/installperl b/installperl index 9e06145df7..f71028d6cc 100755 --- a/installperl +++ b/installperl @@ -474,12 +474,14 @@ if ($Config{installusrbinperl} && $Config{installusrbinperl} eq 'define' && # Make links to ordinary names if installbin directory isn't current directory. if (!$Is_NetWare) { - if (!$versiononly && ! samepath($installbin, 'x2p')) { - safe_unlink("$installbin/a2p$exe_ext"); - copy("x2p/a2p$exe_ext", "$installbin/a2p$exe_ext"); - strip("$installbin/a2p$exe_ext"); - chmod(0755, "$installbin/a2p$exe_ext"); - } + if (! samepath($installbin, 'x2p')) { + my $base = 'a2p'; + $base .= $ver if $versiononly; + safe_unlink("$installbin/$base$exe_ext"); + copy("x2p/a2p$exe_ext", "$installbin/$base$exe_ext"); + strip("$installbin/$base$exe_ext"); + chmod(0755, "$installbin/$base$exe_ext"); + } } # cppstdin is just a script, but it is architecture-dependent, so diff --git a/intrpvar.h b/intrpvar.h index f98e3484f7..c64b838a3c 100644 --- a/intrpvar.h +++ b/intrpvar.h @@ -522,7 +522,10 @@ PERLVAR(Iutf8_idcont, SV *) PERLVAR(Isort_RealCmp, SVCOMPARE_t) +PERLVARI(Icheckav_save, AV*, Nullav) /* save CHECK{}s when compiling */ + +PERLVARI(Iclocktick, long, 0) /* this many times() ticks in a second */ + /* New variables must be added to the very end for binary compatibility. * XSUB.h provides wrapper functions via perlapi.h that make this * irrelevant, but not all code may be expected to #include XSUB.h. */ - diff --git a/keywords.h b/keywords.h index 744330f526..767f356da5 100644 --- a/keywords.h +++ b/keywords.h @@ -6,6 +6,9 @@ * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. * + * !!!!!!! DO NOT EDIT THIS FILE !!!!!!! + * This file is built by keywords.pl from its data. Any changes made here + * will be lost! */ #define KEY_NULL 0 #define KEY___FILE__ 1 diff --git a/keywords.pl b/keywords.pl index 00c067c40a..02f3ff8ff6 100755 --- a/keywords.pl +++ b/keywords.pl @@ -13,6 +13,9 @@ print <<EOM; * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. * + * !!!!!!! DO NOT EDIT THIS FILE !!!!!!! + * This file is built by keywords.pl from its data. Any changes made here + * will be lost! */ EOM diff --git a/lib/Attribute/Handlers.pm b/lib/Attribute/Handlers.pm index 4199d9db01..a26ed180b5 100644 --- a/lib/Attribute/Handlers.pm +++ b/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; @@ -108,7 +108,7 @@ sub AUTOLOAD { sub DESTROY {} -my $builtin = qr/lvalue|method|locked/; +my $builtin = qr/lvalue|method|locked|unique|shared/; sub _gen_handler_AH_() { return sub { @@ -217,8 +217,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 +602,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/lib/Attribute/Handlers/Changes b/lib/Attribute/Handlers/Changes index d2dcce6839..563776adf1 100644 --- a/lib/Attribute/Handlers/Changes +++ b/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
\ No newline at end of file diff --git a/lib/Attribute/Handlers/README b/lib/Attribute/Handlers/README index 2931c35238..b5247e9fda 100644 --- a/lib/Attribute/Handlers/README +++ b/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/lib/AutoLoader.pm b/lib/AutoLoader.pm index b42d5ff4b6..4352d8b1fb 100644 --- a/lib/AutoLoader.pm +++ b/lib/AutoLoader.pm @@ -1,7 +1,9 @@ package AutoLoader; +use strict; use 5.006_001; -our(@EXPORT, @EXPORT_OK, $VERSION); + +our($VERSION, $AUTOLOAD); my $is_dosish; my $is_epoc; @@ -9,14 +11,11 @@ my $is_vms; my $is_macos; BEGIN { - require Exporter; - @EXPORT = @EXPORT = (); - @EXPORT_OK = @EXPORT_OK = qw(AUTOLOAD); $is_dosish = $^O eq 'dos' || $^O eq 'os2' || $^O eq 'MSWin32' || $^O eq 'NetWare'; $is_epoc = $^O eq 'epoc'; $is_vms = $^O eq 'VMS'; $is_macos = $^O eq 'MacOS'; - $VERSION = '5.59'; + $VERSION = '5.60'; } AUTOLOAD { @@ -93,22 +92,24 @@ AUTOLOAD { eval { local $SIG{__DIE__}; require $filename }; if ($@) { if (substr($sub,-9) eq '::DESTROY') { + no strict 'refs'; *$sub = sub {}; - } else { + $@ = undef; + } elsif ($@ =~ /^Can't locate/) { # The load might just have failed because the filename was too # long for some old SVR3 systems which treat long names as errors. - # If we can succesfully truncate a long name then it's worth a go. + # If we can successfully truncate a long name then it's worth a go. # There is a slight risk that we could pick up the wrong file here # but autosplit should have warned about that when splitting. if ($filename =~ s/(\w{12,})\.al$/substr($1,0,11).".al"/e){ eval { local $SIG{__DIE__}; require $filename }; } - if ($@){ - $@ =~ s/ at .*\n//; - my $error = $@; - require Carp; - Carp::croak($error); - } + } + if ($@){ + $@ =~ s/ at .*\n//; + my $error = $@; + require Carp; + Carp::croak($error); } } $@ = $save; @@ -124,8 +125,9 @@ sub import { # if ($pkg eq 'AutoLoader') { - local $Exporter::ExportLevel = 1; - Exporter::import $pkg, @_; + no strict 'refs'; + *{ $callpkg . '::AUTOLOAD' } = \&AUTOLOAD + if @_ and $_[0] =~ /^&?AUTOLOAD$/; } # @@ -166,8 +168,12 @@ sub import { } sub unimport { - my $callpkg = caller; - eval "package $callpkg; sub AUTOLOAD;"; + my $callpkg = caller; + + no strict 'refs'; + my $symname = $callpkg . '::AUTOLOAD'; + undef *{ $symname } if \&{ $symname } == \&AUTOLOAD; + *{ $symname } = \&{ $symname }; } 1; diff --git a/lib/AutoLoader.t b/lib/AutoLoader.t index f2fae7f309..2db1d60ed1 100755 --- a/lib/AutoLoader.t +++ b/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 => 13; # 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" } @@ -47,82 +52,83 @@ close(BAZ); # Let's define the package package Foo; require AutoLoader; -@ISA=qw(AutoLoader); +AutoLoader->import( 'AUTOLOAD' ); sub new { bless {}, shift }; package main; -$foo = new Foo; - -print "not " unless $foo->foo eq 'foo'; # autoloaded first time -print "ok 1\n"; +my $foo = new Foo; -print "not " unless $foo->foo eq 'foo'; # regular call -print "ok 2\n"; +is( $foo->foo, 'foo', 'autoloaded first time' ); +is( $foo->foo, 'foo', 'regular call' ); -# 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"; +'foo' =~ /(\w+)/; -print "not " unless $foo->bar($1) eq 'foo'; -print "ok 6\n"; - -print "not " unless $foo->bar($1) eq 'foo'; -print "ok 7\n"; - -print "not " unless $foo->bazmarkhianish($1) eq 'foo'; -print "ok 8\n"; - -print "not " unless $foo->bazmarkhianish($1) eq 'foo'; -print "ok 9\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)' ); # 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 $fulldir; } diff --git a/lib/Benchmark.pm b/lib/Benchmark.pm index cda764f6ca..2907e69c1c 100644 --- a/lib/Benchmark.pm +++ b/lib/Benchmark.pm @@ -50,6 +50,9 @@ Benchmark - benchmark running times of Perl code $count = $t->iters ; print "$count loops of other code took:",timestr($t),"\n"; + # enable hires wallclock timing if possible + use Benchmark ':hireswallclock'; + =head1 DESCRIPTION The Benchmark module encapsulates a number of routines to help you @@ -196,7 +199,7 @@ Clear the cached time for COUNT rounds of the null loop. Clear all cached times. -=item cmpthese ( COUT, CODEHASHREF, [ STYLE ] ) +=item cmpthese ( COUNT, CODEHASHREF, [ STYLE ] ) =item cmpthese ( RESULTSHASHREF, [ STYLE ] ) @@ -273,6 +276,15 @@ for passing to timestr(). =back +=head2 :hireswallclock + +If the Time::HiRes module has been installed, you can specify the +special tag C<:hireswallclock> for Benchmark (if Time::HiRes is not +available, the tag will be silently ignored). This tag will cause the +wallclock time to be measured in microseconds, instead of integer +seconds. Note though that the speed computations are still conducted +in CPU time, not wallclock time. + =head1 NOTES The data is stored as a list of values from the time and times @@ -395,6 +407,8 @@ style in. (so that 'none' will suppress output). Make sub new dump its debugging output to STDERR, to be consistent with everything else. All bugs found while writing a regression test. +September, 2002; by Jarkko Hietaniemi: add ':hireswallclock' special tag. + =cut # evaluate something in a clean lexical environment @@ -412,10 +426,32 @@ use Exporter; clearcache clearallcache disablecache enablecache); %EXPORT_TAGS=( all => [ @EXPORT, @EXPORT_OK ] ) ; -$VERSION = 1.04; +$VERSION = 1.0501; + +# --- ':hireswallclock' special handling + +my $hirestime; + +sub mytime () { time } &init; +sub BEGIN { + if (eval 'require Time::HiRes') { + import Time::HiRes qw(time); + $hirestime = \&Time::HiRes::time; + } +} + +sub import { + my $class = shift; + if (grep { $_ eq ":hireswallclock" } @_) { + @_ = grep { $_ ne ":hireswallclock" } @_; + *mytime = $hirestime if defined $hirestime; + } + Benchmark->export_to_level(1, $class, @_); +} + sub init { $debug = 0; $min_count = 4; @@ -440,7 +476,7 @@ sub disablecache { $cache = 0; } # --- Functions to process the 'time' data type -sub new { my @t = (time, times, @_ == 2 ? $_[1] : 0); +sub new { my @t = (mytime, times, @_ == 2 ? $_[1] : 0); print STDERR "new=@t\n" if $debug; bless \@t; } @@ -480,11 +516,12 @@ sub timestr { return '' if $style eq 'none'; $style = ($ct>0) ? 'all' : 'noc' if $style eq 'auto'; my $s = "@t $style"; # default for unknown style - $s=sprintf("%2d wallclock secs (%$f usr %$f sys + %$f cusr %$f csys = %$f CPU)", + my $w = $hirestime ? "%2g" : "%2d"; + $s=sprintf("$w wallclock secs (%$f usr %$f sys + %$f cusr %$f csys = %$f CPU)", $r,$pu,$ps,$cu,$cs,$tt) if $style eq 'all'; - $s=sprintf("%2d wallclock secs (%$f usr + %$f sys = %$f CPU)", + $s=sprintf("$w wallclock secs (%$f usr + %$f sys = %$f CPU)", $r,$pu,$ps,$pt) if $style eq 'noc'; - $s=sprintf("%2d wallclock secs (%$f cusr + %$f csys = %$f CPU)", + $s=sprintf("$w wallclock secs (%$f cusr + %$f csys = %$f CPU)", $r,$cu,$cs,$ct) if $style eq 'nop'; $s .= sprintf(" @ %$f/s (n=$n)", $n / ( $pu + $ps )) if $n && $pu+$ps; $s; @@ -713,7 +750,9 @@ sub timethese{ } sub cmpthese{ - my ($results, $style) = ref $_[0] ? @_ : ( timethese( @_[0,1,2] ), $_[2] ) ; + my ($results, $style) = + ref $_ [0] ? @_ + : (timethese (@_ [0, 1], @_ > 2 ? $_ [2] : "none"), $_ [2]); $style = "" unless defined $style; diff --git a/lib/Benchmark.t b/lib/Benchmark.t index d7533c3d97..60caf434e6 100644 --- a/lib/Benchmark.t +++ b/lib/Benchmark.t @@ -8,7 +8,7 @@ BEGIN { use warnings; use strict; use vars qw($foo $bar $baz $ballast); -use Test::More tests => 159; +use Test::More tests => 173; use Benchmark qw(:all); @@ -346,7 +346,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"); @@ -364,6 +364,28 @@ sub check_graph { 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); +} + { $foo = $bar = 0; select(OUT); diff --git a/lib/Class/Struct.pm b/lib/Class/Struct.pm index bad4f78165..ec080a1526 100644 --- a/lib/Class/Struct.pm +++ b/lib/Class/Struct.pm @@ -14,7 +14,7 @@ require Exporter; @ISA = qw(Exporter); @EXPORT = qw(struct); -$VERSION = '0.61'; +$VERSION = '0.63'; ## Tested on 5.002 and 5.003 without class membership tests: my $CHECK_CLASS_MEMBERSHIP = ($] >= 5.003_95); @@ -456,26 +456,26 @@ See Example 3 below for an example of initialization. =item Example 1 Giving a struct element a class type that is also a struct is how -structs are nested. Here, C<timeval> represents a time (seconds and -microseconds), and C<rusage> has two elements, each of which is of -type C<timeval>. +structs are nested. Here, C<Timeval> represents a time (seconds and +microseconds), and C<Rusage> has two elements, each of which is of +type C<Timeval>. use Class::Struct; - struct( rusage => { - ru_utime => timeval, # seconds - ru_stime => timeval, # microseconds + struct( Rusage => { + ru_utime => 'Timeval', # user time used + ru_stime => 'Timeval', # system time used }); - struct( timeval => [ - tv_secs => '$', - tv_usecs => '$', + struct( Timeval => [ + tv_secs => '$', # seconds + tv_usecs => '$', # microseconds ]); # create an object: - my $t = new rusage; + my $t = Rusage->new(ru_utime=>Timeval->new(), ru_stime=>Timeval->new()); - # $t->ru_utime and $t->ru_stime are objects of type timeval. + # $t->ru_utime and $t->ru_stime are objects of type Timeval. # set $t->ru_utime to 100.0 sec and $t->ru_stime to 5.0 sec. $t->ru_utime->tv_secs(100); $t->ru_utime->tv_usecs(0); @@ -500,10 +500,10 @@ accessor accordingly. my $self = shift; if ( @_ ) { die 'count must be nonnegative' if $_[0] < 0; - $self->{'count'} = shift; + $self->{'MyObj::count'} = shift; warn "Too many args to count" if @_; } - return $self->{'count'}; + return $self->{'MyObj::count'}; } package main; diff --git a/lib/Config.t b/lib/Config.t index afc3c4a41c..f13b40208d 100644 --- a/lib/Config.t +++ b/lib/Config.t @@ -1,10 +1,12 @@ +#!./perl + BEGIN { chdir 't' if -d 't'; @INC = '../lib'; require "./test.pl"; } -plan tests => 23; +plan tests => 34; 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=$Config{osname}/, "myconfig"); +like(Config::config_sh(), qr/osname='$Config{osname}'/, "config_sh"); +like(join("\n", Config::config_re('c.*')), + qr/^c.*?=/, 'config_re' ); + my $out = tie *STDOUT, 'FakeOut'; Config::config_vars('cc'); diff --git a/lib/Cwd.pm b/lib/Cwd.pm index 8b00543e1e..7f8ef6543b 100644 --- a/lib/Cwd.pm +++ b/lib/Cwd.pm @@ -192,7 +192,16 @@ foreach my $try (qw(/bin/pwd /usr/bin/pwd)) { last; } } -$pwd_cmd ||= 'pwd'; +unless ($pwd_cmd) { + if (-x '/QOpenSys/bin/pwd') { # OS/400 PASE. + $pwd_cmd = '/QOpenSys/bin/pwd' ; + } else { + # Isn't this wrong? _backtick_pwd() will fail if somenone has + # pwd in their path but it is not /bin/pwd or /usr/bin/pwd? + # See [perl #16774]. --jhi + $pwd_cmd = 'pwd'; + } +} # The 'natural and safe form' for UNIX (pwd may be setuid root) sub _backtick_pwd { diff --git a/lib/Exporter.pm b/lib/Exporter.pm index 8b8d4c4939..753ea6aab2 100644 --- a/lib/Exporter.pm +++ b/lib/Exporter.pm @@ -9,7 +9,8 @@ require 5.006; our $Debug = 0; our $ExportLevel = 0; our $Verbose ||= 0; -our $VERSION = '5.566'; +our $VERSION = '5.567'; +our (%Cache); $Carp::Internal{Exporter} = 1; sub as_heavy { @@ -30,10 +31,10 @@ sub import { my $callpkg = caller($ExportLevel); # We *need* to treat @{"$pkg\::EXPORT_FAIL"} since Carp uses it :-( - my($exports, $export_cache, $fail) - = (\@{"$pkg\::EXPORT"}, \%{"$pkg\::EXPORT"}, \@{"$pkg\::EXPORT_FAIL"}); + my($exports, $fail) = (\@{"$pkg\::EXPORT"}, \@{"$pkg\::EXPORT_FAIL"}); return export $pkg, $callpkg, @_ if $Verbose or $Debug or @$fail > 1; + my $export_cache = ($Cache{$pkg} ||= {}); my $args = @_ or @_ = @$exports; local $_; diff --git a/lib/Exporter.t b/lib/Exporter.t index d2a9289c61..54150685a7 100644 --- a/lib/Exporter.t +++ b/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/lib/Exporter/Heavy.pm b/lib/Exporter/Heavy.pm index 3bdc4b4f20..53341a2c1a 100644 --- a/lib/Exporter/Heavy.pm +++ b/lib/Exporter/Heavy.pm @@ -27,6 +27,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 +60,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#^[/!:]#){ @@ -127,10 +133,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 +161,7 @@ sub heavy_export { } my($fail, $fail_cache) = (\@{"${pkg}::EXPORT_FAIL"}, - \%{"${pkg}::EXPORT_FAIL"}); + $Exporter::FailCache{$pkg} ||= {}); if (@$fail) { if (!%$fail_cache) { diff --git a/lib/ExtUtils/Constant.pm b/lib/ExtUtils/Constant.pm index 1268ce02ba..9730d91073 100644 --- a/lib/ExtUtils/Constant.pm +++ b/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/lib/ExtUtils/MM_Unix.pm b/lib/ExtUtils/MM_Unix.pm index bb76013380..c5bb19eb64 100644 --- a/lib/ExtUtils/MM_Unix.pm +++ b/lib/ExtUtils/MM_Unix.pm @@ -1426,7 +1426,7 @@ sub init_dirscan { # --- File and Directory Lists (.xs .pm .pod etc) my($ispod)=0; if (open(FH,"<$name")) { while (<FH>) { - if (/^=head1\s+\w+/) { + if (/^=\w/) { $ispod=1; last; } @@ -1455,7 +1455,7 @@ sub init_dirscan { # --- File and Directory Lists (.xs .pm .pod etc) my($ispod)=0; if (open(FH,"<$name")) { while (<FH>) { - if (/^=head1\s+\w+/) { + if (/^=\w/) { $ispod=1; last; } diff --git a/lib/ExtUtils/t/Constant.t b/lib/ExtUtils/t/Constant.t index 25d705585e..4e5819d78e 100644 --- a/lib/ExtUtils/t/Constant.t +++ b/lib/ExtUtils/t/Constant.t @@ -1,7 +1,5 @@ #!/usr/bin/perl -w -print "1..51\n"; - BEGIN { if( $ENV{PERL_CORE} ) { chdir 't' if -d 't'; @@ -14,178 +12,334 @@ 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 +348,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); -print FH << 'EOT'; + 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 + + 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 +586,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 +610,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 +639,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 +655,7 @@ if (\$rfc1149 != 1149) { EOT -print FH <<'EOT'; +$test_body .= <<'EOT'; # test macro=>1 my $open = OPEN; if ($open eq '/*') { @@ -402,26 +664,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); + + $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*"; + } -# 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') + 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}, + ); -print FH <<'EOT'; +=pod -# I can see that this child test program might be about to use parts of -# Test::Builder +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 +753,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 +773,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 +792,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 +819,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"; + end_tests("utf8 tests", \@items, [], "#define perl \"rules\"\n", $test_body); } +# 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 -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"; -} - -if ($^O eq 'VMS') { $make =~ s{ all}{}; } - -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 { - print "ok 4\n"; + # Error expected. + $test_body .= <<"EOT"; + if (\$error) { + print "ok $dummytest # error='\$error' (as expected)\n"; + } else { + 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/lib/ExtUtils/t/Installed.t b/lib/ExtUtils/t/Installed.t index d62afba434..968c4187c6 100644 --- a/lib/ExtUtils/t/Installed.t +++ b/lib/ExtUtils/t/Installed.t @@ -80,11 +80,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 +228,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/lib/ExtUtils/typemap b/lib/ExtUtils/typemap index 1124eb6483..2a53b62abf 100644 --- a/lib/ExtUtils/typemap +++ b/lib/ExtUtils/typemap @@ -14,6 +14,7 @@ const char * T_PV caddr_t T_PV wchar_t * T_PV wchar_t T_IV +# bool_t is defined in <rpc/rpc.h> bool_t T_IV size_t T_UV ssize_t T_IV diff --git a/lib/File/Basename.pm b/lib/File/Basename.pm index f2ef495cdd..1c9a419313 100644 --- a/lib/File/Basename.pm +++ b/lib/File/Basename.pm @@ -169,7 +169,7 @@ sub fileparse { my($fullname,@suffices) = @_; unless (defined $fullname) { require Carp; - Carp::croak "fileparse(): need a valid pathname"; + Carp::croak("fileparse(): need a valid pathname"); } my($fstype,$igncase) = ($Fileparse_fstype, $Fileparse_igncase); my($dirpath,$tail,$suffix,$basename); diff --git a/lib/File/Find/t/find.t b/lib/File/Find/t/find.t index c28183348f..4e5a217caa 100644 --- a/lib/File/Find/t/find.t +++ b/lib/File/Find/t/find.t @@ -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; diff --git a/lib/File/Spec/Unix.pm b/lib/File/Spec/Unix.pm index 87ee505102..d9615c06b4 100644 --- a/lib/File/Spec/Unix.pm +++ b/lib/File/Spec/Unix.pm @@ -88,7 +88,7 @@ complete path ending with a filename sub catfile { my $self = shift; - my $file = pop @_; + my $file = File::Spec->canonpath(pop @_); return $file unless @_; my $dir = $self->catdir(@_); $dir .= "/" unless substr($dir,-1) eq "/"; diff --git a/lib/File/Spec/VMS.pm b/lib/File/Spec/VMS.pm index f21ff5ecee..54fcee15ec 100644 --- a/lib/File/Spec/VMS.pm +++ b/lib/File/Spec/VMS.pm @@ -164,6 +164,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 +212,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) { diff --git a/lib/File/Spec/Win32.pm b/lib/File/Spec/Win32.pm index 186052bb4d..7c2275811d 100644 --- a/lib/File/Spec/Win32.pm +++ b/lib/File/Spec/Win32.pm @@ -95,7 +95,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 "\\"; @@ -113,11 +113,16 @@ 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 @@ -125,6 +130,38 @@ sub canonpath { $path =~ s|^(\.\\)+||s unless $path eq ".\\"; # .\xx -> xx $path =~ s|\\\Z(?!\n)|| 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 + return $path if $orig_path =~ m|^\Q/../\E| + and $orig_path =~ m|\/$|; # don't do /../dirs/ + # when called from rel2abs() + # for ../dirs/ + 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; } diff --git a/lib/File/Spec/t/Spec.t b/lib/File/Spec/t/Spec.t index 3f18a35277..b6331cec66 100644 --- a/lib/File/Spec/t/Spec.t +++ b/lib/File/Spec/t/Spec.t @@ -50,7 +50,11 @@ if ($^O eq 'MacOS') { @tests = ( # [ Function , Expected , Platform ] -[ "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('./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 +91,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('/.')", '/' ], @@ -184,7 +186,12 @@ if ($^O eq 'MacOS') { [ "Win32->catdir('A:/d1','B:/d2','d3','')", 'A:\\d1\\B:\\d2\\d3' ], [ "Win32->catdir('A:/')", 'A:\\' ], -[ "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('.\\a','b','c')", 'a\\b\\c' ], +[ "Win32->catfile('c')", 'c' ], +[ "Win32->catfile('.\\c')", 'c' ], + [ "Win32->canonpath('')", '' ], [ "Win32->canonpath('a:')", 'A:' ], @@ -195,8 +202,12 @@ if ($^O eq 'MacOS') { [ "Win32->canonpath('////')", '\\\\\\' ], [ "Win32->canonpath('//')", '\\' ], [ "Win32->canonpath('/.')", '\\.' ], -[ "Win32->canonpath('//a/b/../../c')", '\\\\a\\b\\..\\..\\c' ], -[ "Win32->canonpath('//a/../../c')", '\\\\a\\..\\..\\c' ], +[ "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' ], ## 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 @@ -219,12 +230,18 @@ if ($^O eq 'MacOS') { [ "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('../','C:/')", 'C:\\' ], +[ "Win32->rel2abs('../','C:/a')", 'C:\\' ], [ "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('temp','//prague_main/work')", '\\\\prague_main\\work\\temp' ], -[ "Win32->rel2abs('../','//prague_main/work')", '\\\\prague_main\\work\\..' ], +[ "Win32->rel2abs('../','//prague_main/work')", '\\\\prague_main\\work' ], + +[ "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],' ], @@ -294,7 +311,12 @@ if ($^O eq 'MacOS') { [ "VMS->rel2abs('[t1]','[t1.t2.t3]')", '[t1]' ], [ "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' ], [ "Mac->catpath('','','')", '' ], diff --git a/lib/Hash/Util.pm b/lib/Hash/Util.pm index f6dcd7e0a7..90a8e5aaa5 100644 --- a/lib/Hash/Util.pm +++ b/lib/Hash/Util.pm @@ -17,7 +17,7 @@ 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); @@ -59,10 +59,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 +111,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. diff --git a/lib/Locale/Codes/t/languages.t b/lib/Locale/Codes/t/languages.t index c643f3a307..92ccf4d27e 100644 --- a/lib/Locale/Codes/t/languages.t +++ b/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/lib/Locale/Country.pm b/lib/Locale/Country.pm index 07ae83325c..2563a6466a 100644 --- a/lib/Locale/Country.pm +++ b/lib/Locale/Country.pm @@ -267,6 +267,7 @@ sub _code2codeset my ($alpha2, $alpha3, $numeric); my ($country, @countries); + local $_; while (<DATA>) { diff --git a/lib/Locale/Currency.pm b/lib/Locale/Currency.pm index 34b85917dd..3424e2c5a6 100644 --- a/lib/Locale/Currency.pm +++ b/lib/Locale/Currency.pm @@ -108,6 +108,7 @@ sub all_currency_names my $code; my $currency; + local $_; while (<DATA>) { diff --git a/lib/Locale/Language.pm b/lib/Locale/Language.pm index f47e523fc2..627923cb09 100644 --- a/lib/Locale/Language.pm +++ b/lib/Locale/Language.pm @@ -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/lib/Locale/Script.pm b/lib/Locale/Script.pm index d5b6751a1a..c045ffc299 100644 --- a/lib/Locale/Script.pm +++ b/lib/Locale/Script.pm @@ -160,6 +160,7 @@ sub all_script_names my ($alpha2, $alpha3, $numeric); my $script; + local $_; while (<DATA>) { diff --git a/lib/Math/BigFloat.pm b/lib/Math/BigFloat.pm index a12cf28a84..4e93a2ffb7 100644 --- a/lib/Math/BigFloat.pm +++ b/lib/Math/BigFloat.pm @@ -12,12 +12,10 @@ package Math::BigFloat; # _p: precision # _f: flags, used to signal MBI not to touch our private parts -$VERSION = '1.35'; +$VERSION = '1.38'; 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/; @@ -307,9 +305,10 @@ sub bsstr 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 +343,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 +409,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} !~ /^[+-]$/) { @@ -656,7 +661,7 @@ sub blog 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; @@ -915,7 +920,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 @@ -931,10 +935,12 @@ sub bdiv # shortcut to not run trough _find_round_parameters again if (defined $params[1]) { + $x->{_a} = undef; # clear before round $x->bround($params[1],$params[3]); # then round accordingly } else { + $x->{_p} = undef; # clear before round $x->bfround($params[2],$params[3]); # then round accordingly } if ($fallback) @@ -1066,7 +1072,8 @@ sub bsqrt my @params = $x->_find_round_parameters($a,$p,$r); # no rounding at all, so must use fallback - if (scalar @params == 1) + if ((scalar @params == 1) || + (!defined($params[1] || $params[2]))) { # simulate old behaviour $params[1] = $self->div_scale(); # and round to it as accuracy @@ -1078,7 +1085,7 @@ sub bsqrt { # 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[1] || $params[2]) + 4; # take whatever is defined } # when user set globals, they would interfere with our calculation, so @@ -1095,7 +1102,6 @@ sub bsqrt my $xas = $x->as_number(); my $gs = $xas->copy()->bsqrt(); # some guess -# 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? @@ -1120,29 +1126,37 @@ sub bsqrt ${"$self\::accuracy"} = $ab; ${"$self\::precision"} = $pb; return $x; } - $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'); + + # 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). + $y1->bmul(10) if $x->{_e}->is_odd(); + # now calculate how many digits the result of sqrt(y1) would have + my $digits = int($y1->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. + $x->{_m} = $y1; + # gs->length() is the number of digits before the dot. Since gs is always + # truncated (9.99 => 9), it is always right (if gs was rounded, it would be + # '10' and thus gs->length() == 2, which would be wrong). + $x->{_e} = $MBI->new(- $y1->length() + $gs->length()); - my $rem; - while ($diff->bacmp($e) >= 0) - { - $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(); - } - # copy over to modify $x - $x->{_m} = $rem->{_m}; $x->{_e} = $rem->{_e}; - # shortcut to not run trough _find_round_parameters again if (defined $params[1]) { @@ -1210,7 +1224,7 @@ sub _pow2 } # 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; @@ -1320,7 +1334,7 @@ sub _pow } # 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; @@ -1752,7 +1766,6 @@ sub import my $lib = ''; my @a; 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 @@ -1852,7 +1865,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 { diff --git a/lib/Math/BigInt.pm b/lib/Math/BigInt.pm index 5a1385d519..478a1e7045 100644 --- a/lib/Math/BigInt.pm +++ b/lib/Math/BigInt.pm @@ -18,8 +18,7 @@ package Math::BigInt; my $class = "Math::BigInt"; require 5.005; -# This is a patched v1.60, containing a fix for the "1234567890\n" bug -$VERSION = '1.60'; +$VERSION = '1.63'; use Exporter; @ISA = qw( Exporter ); @EXPORT_OK = qw( objectify _swap bgcd blcm); @@ -413,7 +412,7 @@ sub new my $ref = \$wanted; if ($wanted =~ /^[+-]/) { - # remove sign without touching wanted + # remove sign without touching wanted to make it work with constants my $t = $wanted; $t =~ s/^[+-]//; $ref = \$t; } $self->{value} = $CALC->_new($ref); @@ -663,9 +662,7 @@ sub bsstr return 'inf'; # +inf } my ($m,$e) = $x->parts(); - # e can only be positive - my $sign = 'e+'; - # MBF: my $s = $e->{sign}; $s = '' if $s eq '-'; my $sep = 'e'.$s; + my $sign = 'e+'; # e can only be positive return $m->bstr().$sign.$e->bstr(); } @@ -688,7 +685,8 @@ sub numify { # Make a "normal" scalar from a BigInt object my $x = shift; $x = $class->new($x) unless ref $x; - return $x->{sign} if $x->{sign} !~ /^[+-]$/; + + return $x->bstr() if $x->{sign} !~ /^[+-]$/; my $num = $CALC->_num($x->{value}); return -$num if $x->{sign} eq '-'; $num; @@ -871,6 +869,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 @@ -913,6 +914,9 @@ sub bacmp ($self,$x,$y) = objectify(2,@_); } + return $upgrade->bacmp($x,$y) if defined $upgrade && + ((!$x->isa($self)) || (!$y->isa($self))); + if (($x->{sign} !~ /^[+-]$/) || ($y->{sign} !~ /^[+-]$/)) { # handle +-inf and NaN @@ -1481,25 +1485,25 @@ sub bmod sub bmodinv { - # modular inverse. given a number which is (hopefully) relatively + # Modular inverse. given a number which is (hopefully) relatively # prime to the modulus, calculate its inverse using Euclid's - # alogrithm. if the number is not relatively prime to the modulus + # alogrithm. If the number is not relatively prime to the modulus # (i.e. their gcd is not one) then NaN is returned. # set up parameters my ($self,$x,$y,@r) = (ref($_[0]),@_); - # objectify is costly, so avoid it + # objectify is costly, so avoid it if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) { ($self,$x,$y,@r) = objectify(2,@_); - } + } return $x if $x->modify('bmodinv'); return $x->bnan() - if ($y->{sign} ne '+' # -, NaN, +inf, -inf - || $x->is_zero() # or num == 0 - || $x->{sign} !~ /^[+-]$/ # or num NaN, inf, -inf + if ($y->{sign} ne '+' # -, NaN, +inf, -inf + || $x->is_zero() # or num == 0 + || $x->{sign} !~ /^[+-]$/ # or num NaN, inf, -inf ); # put least residue into $x if $x was negative, and thus make it positive @@ -1507,11 +1511,14 @@ sub bmodinv if ($CALC->can('_modinv')) { - $x->{value} = $CALC->_modinv($x->{value},$y->{value}); - $x->bnan() if !defined $x->{value} ; # in case there was none + my $sign; + ($x->{value},$sign) = $CALC->_modinv($x->{value},$y->{value}); + $x->bnan() if !defined $x->{value}; # in case no GCD found + return $x if !defined $sign; # already real result + $x->{sign} = $sign; # flip/flop see below + $x->bmod($y); # calc real result return $x; } - my ($u, $u1) = ($self->bzero(), $self->bone()); my ($a, $b) = ($y->copy(), $x->copy()); @@ -1521,21 +1528,37 @@ sub bmodinv # a case with 28 loops still gains about 3% with this layout. my $q; ($a, $q, $b) = ($b, $a->bdiv($b)); # step #1 - # Euclid's Algorithm - while (!$b->is_zero()) + # Euclid's Algorithm (calculate GCD of ($a,$b) in $a and also calculate + # two values in $u and $u1, we use only $u1 afterwards) + my $sign = 1; # flip-flop + while (!$b->is_zero()) # found GCD if $b == 0 { - ($u, $u1) = ($u1, $u->bsub($u1->copy()->bmul($q))); # step #2 + # the original algorithm had: + # ($u, $u1) = ($u1, $u->bsub($u1->copy()->bmul($q))); # step #2 + # The following creates exact the same sequence of numbers in $u1, + # except for the sign ($u1 is now always positive). Since formerly + # the sign of $u1 was alternating between '-' and '+', the $sign + # flip-flop will take care of that, so that at the end of the loop + # we have the real sign of $u1. Keeping numbers positive gains us + # speed since badd() is faster than bsub() and makes it possible + # to have the algorithmn in Calc for even more speed. + + ($u, $u1) = ($u1, $u->badd($u1->copy()->bmul($q))); # step #2 + $sign = - $sign; # flip sign + ($a, $q, $b) = ($b, $a->bdiv($b)); # step #1 again } - # if the gcd is not 1, then return NaN! It would be pointless to - # have called bgcd to check this first, because we would then be performing - # the same Euclidean Algorithm *twice* + # If the gcd is not 1, then return NaN! It would be pointless to + # have called bgcd to check this first, because we would then be + # performing the same Euclidean Algorithm *twice*. return $x->bnan() unless $a->is_one(); - $u1->bmod($y); - $x->{value} = $u1->{value}; - $x->{sign} = $u1->{sign}; + $u1->bneg() if $sign != 1; # need to flip? + + $u1->bmod($y); # calc result + $x->{value} = $u1->{value}; # and copy over to $x + $x->{sign} = $u1->{sign}; # to modify in place $x; } @@ -2012,11 +2035,11 @@ sub bsqrt my $lastlast = $x+$two; while ($last != $x && $lastlast != $x) { - $lastlast = $last; $last = $x; - $x += $y / $x; - $x /= $two; + $lastlast = $last; $last = $x->copy(); + $x->badd($y / $x); + $x->bdiv($two); } - $x-- if $x * $x > $y; # overshot? + $x->bdec() if $x * $x > $y; # overshot? $x->round(@r); } @@ -2133,6 +2156,11 @@ sub bround # we have fewer digits than we want to scale to my $len = $x->length(); + # convert $scale to a scalar in case it is an object (put's a limit on the + # number length, but this would already limited by memory constraints), makes + # it faster + $scale = $scale->numify() if ref ($scale); + # scale < 0, but > -len (not >=!) if (($scale < 0 && $scale < -$len-1) || ($scale >= $len)) { @@ -2149,7 +2177,7 @@ sub bround my $xs = $CALC->_str($x->{value}); my $pl = -$pad-1; - + # pad: 123: 0 => -1, at 1 => -2, at 2 => -3, at 3 => -4 # pad+1: 123: 0 => 0, at 1 => -1, at 2 => -2, at 3 => -3 $digit_round = '0'; $digit_round = substr($$xs,$pl,1) if $pad <= $len; @@ -2187,7 +2215,7 @@ sub bround if ($round_up) # what gave test above? { $put_back = 1; - $pad = $len, $$xs = '0'x$pad if $scale < 0; # tlr: whack 0.51=>1.0 + $pad = $len, $$xs = '0' x $pad if $scale < 0; # tlr: whack 0.51=>1.0 # we modify directly the string variant instead of creating a number and # adding it, since that is faster (we already have the string) @@ -2544,10 +2572,12 @@ sub _split # 2.1234 # 0.12 # 1 # 1E1 # 2.134E1 # 434E-10 # 1.02009E-2 # .2 # 1_2_3.4_5_6 # 1.4E1_2_3 # 1e3 # +.2 - return if $$x =~ /[Ee].*[Ee]/; # more than one E => error + #return if $$x =~ /[Ee].*[Ee]/; # more than one E => error - my ($m,$e) = split /[Ee]/,$$x; + my ($m,$e,$last) = split /[Ee]/,$$x; + return if defined $last; # last defined => 1e2E3 or others $e = '0' if !defined $e || $e eq ""; + # sign,value for exponent,mantint,mantfrac my ($es,$ev,$mis,$miv,$mfv); # valid exponent? @@ -2556,8 +2586,8 @@ sub _split $es = $1; $ev = $2; # valid mantissa? return if $m eq '.' || $m eq ''; - my ($mi,$mf,$last) = split /\./,$m; - return if defined $last; # last defined => 1.2.3 or others + my ($mi,$mf,$lastf) = split /\./,$m; + return if defined $lastf; # last defined => 1.2.3 or others $mi = '0' if !defined $mi; $mi .= '0' if $mi =~ /^[\-\+]?$/; $mf = '0' if !defined $mf || $mf eq ''; @@ -2713,104 +2743,109 @@ Math::BigInt - Arbitrary size integer math package $one = Math::BigInt->bone(); # create a +1 $one = Math::BigInt->bone('-'); # create a -1 - # Testing - $x->is_zero(); # true if arg is +0 - $x->is_nan(); # true if arg is NaN - $x->is_one(); # true if arg is +1 - $x->is_one('-'); # true if arg is -1 - $x->is_odd(); # true if odd, false for even - $x->is_even(); # true if even, false for odd - $x->is_positive(); # true if >= 0 - $x->is_negative(); # true if < 0 - $x->is_inf(sign); # true if +inf, or -inf (sign is default '+') - $x->is_int(); # true if $x is an integer (not a float) - - $x->bcmp($y); # compare numbers (undef,<0,=0,>0) - $x->bacmp($y); # compare absolutely (undef,<0,=0,>0) - $x->sign(); # return the sign, either +,- or NaN - $x->digit($n); # return the nth digit, counting from right - $x->digit(-$n); # return the nth digit, counting from left + # Testing (don't modify their arguments) + # (return true if the condition is met, otherwise false) + + $x->is_zero(); # if $x is +0 + $x->is_nan(); # if $x is NaN + $x->is_one(); # if $x is +1 + $x->is_one('-'); # if $x is -1 + $x->is_odd(); # if $x is odd + $x->is_even(); # if $x is even + $x->is_positive(); # if $x >= 0 + $x->is_negative(); # if $x < 0 + $x->is_inf(sign); # if $x is +inf, or -inf (sign is default '+') + $x->is_int(); # if $x is an integer (not a float) + + # comparing and digit/sign extration + $x->bcmp($y); # compare numbers (undef,<0,=0,>0) + $x->bacmp($y); # compare absolutely (undef,<0,=0,>0) + $x->sign(); # return the sign, either +,- or NaN + $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: - # set - $x->bzero(); # set $x to 0 - $x->bnan(); # set $x to NaN - $x->bone(); # set $x to +1 - $x->bone('-'); # set $x to -1 - $x->binf(); # set $x to inf - $x->binf('-'); # set $x to -inf - - $x->bneg(); # negation - $x->babs(); # absolute value - $x->bnorm(); # normalize (no-op) - $x->bnot(); # two's complement (bit wise not) - $x->binc(); # increment x by 1 - $x->bdec(); # decrement x by 1 + $x->bzero(); # set $x to 0 + $x->bnan(); # set $x to NaN + $x->bone(); # set $x to +1 + $x->bone('-'); # set $x to -1 + $x->binf(); # set $x to inf + $x->binf('-'); # set $x to -inf + + $x->bneg(); # negation + $x->babs(); # absolute value + $x->bnorm(); # normalize (no-op in BigInt) + $x->bnot(); # two's complement (bit wise not) + $x->binc(); # increment $x by 1 + $x->bdec(); # decrement $x by 1 - $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 $x to quotient - # return (quo,rem) or quo if scalar - - $x->bmod($y); # modulus (x % y) - $x->bmodpow($exp,$mod); # modular exponentation (($num**$exp) % $mod)) - $x->bmodinv($mod); # the inverse of $x in the given modulus $mod - - $x->bpow($y); # power of arguments (x ** y) - $x->blsft($y); # left shift - $x->brsft($y); # right shift - $x->blsft($y,$n); # left shift, by base $n (like 10) - $x->brsft($y,$n); # right shift, by base $n (like 10) + $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 $x to quotient + # return (quo,rem) or quo if scalar + + $x->bmod($y); # modulus (x % y) + $x->bmodpow($exp,$mod); # modular exponentation (($num**$exp) % $mod)) + $x->bmodinv($mod); # the inverse of $x in the given modulus $mod + + $x->bpow($y); # power of arguments (x ** y) + $x->blsft($y); # left shift + $x->brsft($y); # right shift + $x->blsft($y,$n); # left shift, by base $n (like 10) + $x->brsft($y,$n); # right shift, by base $n (like 10) - $x->band($y); # bitwise and - $x->bior($y); # bitwise inclusive or - $x->bxor($y); # bitwise exclusive or - $x->bnot(); # bitwise not (two's complement) + $x->band($y); # bitwise and + $x->bior($y); # bitwise inclusive or + $x->bxor($y); # bitwise exclusive or + $x->bnot(); # bitwise not (two's complement) - $x->bsqrt(); # calculate square-root - $x->bfac(); # factorial of $x (1*2*3*4*..$x) + $x->bsqrt(); # calculate square-root + $x->bfac(); # factorial of $x (1*2*3*4*..$x) - $x->round($A,$P,$round_mode); # round to accuracy or precision using mode $r - $x->bround($N); # accuracy: preserve $N digits - $x->bfround($N); # round to $Nth digit, no-op for BigInts + $x->round($A,$P,$mode); # round to accuracy or precision using mode $r + $x->bround($N); # accuracy: preserve $N digits + $x->bfround($N); # round to $Nth digit, no-op for BigInts - # The following do not modify their arguments in BigInt, but do in BigFloat: - $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 in BigInt, + # but do so in BigFloat: + + $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 (no OO style) - blcm(@values); # lowest common multiplicator (no OO style) + bgcd(@values); # greatest common divisor (no OO style) + blcm(@values); # lowest common multiplicator (no OO style) - $x->length(); # return number of digits in number - ($x,$f) = $x->length(); # length of number and length of fraction part, - # latter is always 0 digits long for BigInt's - - $x->exponent(); # return exponent as BigInt - $x->mantissa(); # return (signed) mantissa as BigInt - $x->parts(); # return (mantissa,exponent) as BigInt - $x->copy(); # make a true copy of $x (unlike $y = $x;) - $x->as_number(); # return as BigInt (in BigInt: same as copy()) + $x->length(); # return number of digits in number + ($x,$f) = $x->length(); # length of number and length of fraction part, + # latter is always 0 digits long for BigInt's + + $x->exponent(); # return exponent as BigInt + $x->mantissa(); # return (signed) mantissa as BigInt + $x->parts(); # return (mantissa,exponent) as BigInt + $x->copy(); # make a true copy of $x (unlike $y = $x;) + $x->as_number(); # return as BigInt (in BigInt: same as copy()) - # conversation to string - $x->bstr(); # normalized string - $x->bsstr(); # normalized string in scientific notation - $x->as_hex(); # as signed hexadecimal string with prefixed 0x - $x->as_bin(); # as signed binary string with prefixed 0b + # conversation to string (do not modify their argument) + $x->bstr(); # normalized string + $x->bsstr(); # normalized string in scientific notation + $x->as_hex(); # as signed hexadecimal string with prefixed 0x + $x->as_bin(); # as signed binary string with prefixed 0b - Math::BigInt->config(); # return hash containing configuration/version # precision and accuracy (see section about rounding for more) - $x->precision(); # return P of $x (or global, if P of $x undef) - $x->precision($n); # set P of $x to $n - $x->accuracy(); # return A of $x (or global, if A of $x undef) - $x->accuracy($n); # set A $x to $n + $x->precision(); # return P of $x (or global, if P of $x undef) + $x->precision($n); # set P of $x to $n + $x->accuracy(); # return A of $x (or global, if A of $x undef) + $x->accuracy($n); # set A $x to $n - Math::BigInt->precision(); # get/set global P for all BigInt objects - Math::BigInt->accuracy(); # get/set global A for all BigInt objects + # Global methods + Math::BigInt->precision(); # get/set global P for all BigInt objects + Math::BigInt->accuracy(); # get/set global A for all BigInt objects + Math::BigInt->config(); # return hash containing configuration =head1 DESCRIPTION @@ -2836,12 +2871,9 @@ zeros suppressed. =item Input Input values to these routines may be either Math::BigInt objects or -strings of the form C</^[+-]?[\d]+\.?[\d]*E?[+-]?[\d]*$/>. +strings of the form C</^\s*[+-]?[\d]+\.?[\d]*E?[+-]?[\d]*$/>. -You can include one underscore between any two digits. The input string may -have leading and trailing whitespace, which will be ignored. In later -versions, a more strict (no whitespace at all) or more lax (whitespace -allowed everywhere) input checking will also be possible. +You can include one underscore between any two digits. This means integer values like 1.01E2 or even 1000E-2 are also accepted. Non integer values result in NaN. @@ -2865,27 +2897,60 @@ return either undef, <0, 0 or >0 and are suited for sort. =head1 METHODS -Each of the methods below accepts three additional parameters. These arguments -$A, $P and $R are accuracy, precision and round_mode. Please see more in the -section about ACCURACY and ROUNDIND. +Each of the methods below (except config(), accuracy() and precision()) +accepts three additional parameters. These arguments $A, $P and $R are +accuracy, precision and round_mode. Please see the section about +L<ACCURACY and PRECISION> for more information. =head2 config use Data::Dumper; print Dumper ( Math::BigInt->config() ); + print Math::BigInt->config()->{lib},"\n"; Returns a hash containing the configuration, e.g. the version number, lib -loaded etc. +loaded etc. The following hash keys are currently filled in with the +appropriate information. + + key Description + Example + ============================================================ + lib Name of the Math library + Math::BigInt::Calc + lib_version Version of 'lib' + 0.30 + class The class of config you just called + Math::BigInt + upgrade To which class numbers are upgraded + Math::BigFloat + downgrade To which class numbers are downgraded + undef + precision Global precision + undef + accuracy Global accuracy + undef + round_mode Global round mode + even + version version number of the class you used + 1.61 + div_scale Fallback acccuracy for div + 40 + +It is currently not supported to set the configuration parameters by passing +a hash ref to C<config()>. =head2 accuracy $x->accuracy(5); # local for $x - $class->accuracy(5); # global for all members of $class + CLASS->accuracy(5); # global for all members of CLASS + $A = $x->accuracy(); # read out + $A = CLASS->accuracy(); # read out Set or get the global or local accuracy, aka how many significant digits the -results have. Please see the section about L<ACCURACY AND PRECISION> for -further details. +results have. + +Please see the section about L<ACCURACY AND PRECISION> for further details. Value must be greater than zero. Pass an undef value to disable it: @@ -2906,6 +2971,45 @@ represents the accuracy that will be in effect for $x: print $x->accuracy(),"\n"; # still 4 print $y->accuracy(),"\n"; # 5, since global is 5 +Note: Works also for subclasses like Math::BigFloat. Each class has it's own +globals separated from Math::BigInt, but it is possible to subclass +Math::BigInt and make the globals of the subclass aliases to the ones from +Math::BigInt. + +=head2 precision + + $x->precision(-2); # local for $x, round right of the dot + $x->precision(2); # ditto, but round left of the dot + CLASS->accuracy(5); # global for all members of CLASS + CLASS->precision(-5); # ditto + $P = CLASS->precision(); # read out + $P = $x->precision(); # read out + +Set or get the global or local precision, aka how many digits the result has +after the dot (or where to round it when passing a positive number). In +Math::BigInt, passing a negative number precision has no effect since no +numbers have digits after the dot. + +Please see the section about L<ACCURACY AND PRECISION> for further details. + +Value must be greater than zero. Pass an undef value to disable it: + + $x->precision(undef); + Math::BigInt->precision(undef); + +Returns the current precision. For C<$x->precision()> it will return either the +local precision of $x, or if not defined, the global. This means the return +value represents the accuracy that will be in effect for $x: + + $y = Math::BigInt->new(1234567); # unrounded + print Math::BigInt->precision(4),"\n"; # set 4, print 4 + $x = Math::BigInt->new(123456); # will be automatically rounded + +Note: Works also for subclasses like Math::BigFloat. Each class has it's own +globals separated from Math::BigInt, but it is possible to subclass +Math::BigInt and make the globals of the subclass aliases to the ones from +Math::BigInt. + =head2 brsft $x->brsft($y,$n); @@ -3055,44 +3159,44 @@ numbers. =head2 bnorm - $x->bnorm(); # normalize (no-op) + $x->bnorm(); # normalize (no-op) =head2 bnot - $x->bnot(); # two's complement (bit wise not) + $x->bnot(); # two's complement (bit wise not) =head2 binc - $x->binc(); # increment x by 1 + $x->binc(); # increment x by 1 =head2 bdec - $x->bdec(); # decrement x by 1 + $x->bdec(); # decrement x by 1 =head2 badd - $x->badd($y); # addition (add $y to $x) + $x->badd($y); # addition (add $y to $x) =head2 bsub - $x->bsub($y); # subtraction (subtract $y from $x) + $x->bsub($y); # subtraction (subtract $y from $x) =head2 bmul - $x->bmul($y); # multiplication (multiply $x by $y) + $x->bmul($y); # multiplication (multiply $x by $y) =head2 bdiv - $x->bdiv($y); # divide, set $x to quotient - # return (quo,rem) or quo if scalar + $x->bdiv($y); # divide, set $x to quotient + # return (quo,rem) or quo if scalar =head2 bmod - $x->bmod($y); # modulus (x % y) + $x->bmod($y); # modulus (x % y) =head2 bmodinv - $num->bmodinv($mod); # modular inverse + num->bmodinv($mod); # modular inverse Returns the inverse of C<$num> in the given modulus C<$mod>. 'C<NaN>' is returned unless C<$num> is relatively prime to C<$mod>, i.e. unless @@ -3100,74 +3204,78 @@ C<bgcd($num, $mod)==1>. =head2 bmodpow - $num->bmodpow($exp,$mod); # modular exponentation ($num**$exp % $mod) + $num->bmodpow($exp,$mod); # modular exponentation + # ($num**$exp % $mod) Returns the value of C<$num> taken to the power C<$exp> in the modulus C<$mod> using binary exponentation. C<bmodpow> is far superior to writing - $num ** $exp % $mod + $num ** $exp % $mod because C<bmodpow> is much faster--it reduces internal variables into the modulus whenever possible, so it operates on smaller numbers. C<bmodpow> also supports negative exponents. - bmodpow($num, -1, $mod) + bmodpow($num, -1, $mod) is exactly equivalent to - bmodinv($num, $mod) + bmodinv($num, $mod) =head2 bpow - $x->bpow($y); # power of arguments (x ** y) + $x->bpow($y); # power of arguments (x ** y) =head2 blsft - $x->blsft($y); # left shift - $x->blsft($y,$n); # left shift, by base $n (like 10) + $x->blsft($y); # left shift + $x->blsft($y,$n); # left shift, in base $n (like 10) =head2 brsft - $x->brsft($y); # right shift - $x->brsft($y,$n); # right shift, by base $n (like 10) + $x->brsft($y); # right shift + $x->brsft($y,$n); # right shift, in base $n (like 10) =head2 band - $x->band($y); # bitwise and + $x->band($y); # bitwise and =head2 bior - $x->bior($y); # bitwise inclusive or + $x->bior($y); # bitwise inclusive or =head2 bxor - $x->bxor($y); # bitwise exclusive or + $x->bxor($y); # bitwise exclusive or =head2 bnot - $x->bnot(); # bitwise not (two's complement) + $x->bnot(); # bitwise not (two's complement) =head2 bsqrt - $x->bsqrt(); # calculate square-root + $x->bsqrt(); # calculate square-root =head2 bfac - $x->bfac(); # factorial of $x (1*2*3*4*..$x) + $x->bfac(); # factorial of $x (1*2*3*4*..$x) =head2 round - $x->round($A,$P,$round_mode); # round to accuracy or precision using mode $r + $x->round($A,$P,$round_mode); + +Round $x to accuracy C<$A> or precision C<$P> using the round mode +C<$round_mode>. =head2 bround - $x->bround($N); # accuracy: preserve $N digits + $x->bround($N); # accuracy: preserve $N digits =head2 bfround - $x->bfround($N); # round to $Nth digit, no-op for BigInts + $x->bfround($N); # round to $Nth digit, no-op for BigInts =head2 bfloor @@ -3185,11 +3293,11 @@ does change $x in BigFloat. =head2 bgcd - bgcd(@values); # greatest common divisor (no OO style) + bgcd(@values); # greatest common divisor (no OO style) =head2 blcm - blcm(@values); # lowest common multiplicator (no OO style) + blcm(@values); # lowest common multiplicator (no OO style) head2 length @@ -3214,31 +3322,31 @@ Return the signed mantissa of $x as BigInt. =head2 parts - $x->parts(); # return (mantissa,exponent) as BigInt + $x->parts(); # return (mantissa,exponent) as BigInt =head2 copy - $x->copy(); # make a true copy of $x (unlike $y = $x;) + $x->copy(); # make a true copy of $x (unlike $y = $x;) =head2 as_number - $x->as_number(); # return as BigInt (in BigInt: same as copy()) + $x->as_number(); # return as BigInt (in BigInt: same as copy()) =head2 bsrt - $x->bstr(); # normalized string + $x->bstr(); # return normalized string =head2 bsstr - $x->bsstr(); # normalized string in scientific notation + $x->bsstr(); # normalized string in scientific notation =head2 as_hex - $x->as_hex(); # as signed hexadecimal string with prefixed 0x + $x->as_hex(); # as signed hexadecimal string with prefixed 0x =head2 as_bin - $x->as_bin(); # as signed binary string with prefixed 0b + $x->as_bin(); # as signed binary string with prefixed 0b =head1 ACCURACY and PRECISION diff --git a/lib/Math/BigInt/Calc.pm b/lib/Math/BigInt/Calc.pm index eb20e69b9f..44e4c9b89b 100644 --- a/lib/Math/BigInt/Calc.pm +++ b/lib/Math/BigInt/Calc.pm @@ -8,7 +8,7 @@ require Exporter; use vars qw/@ISA $VERSION/; @ISA = qw(Exporter); -$VERSION = '0.30'; +$VERSION = '0.32'; # Package to store unsigned big integers in decimal and do math with them @@ -368,7 +368,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 +384,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 +430,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) @@ -494,10 +457,6 @@ sub _mul_use_mul # 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) { @@ -576,9 +535,6 @@ sub _mul_use_div # 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) { @@ -908,48 +864,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 +910,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 @@ -1166,6 +1109,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) + { + # 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) @@ -1276,7 +1227,6 @@ sub _fac my $n = _copy($c,$cx); $cx = [$last]; - #$cx = _one(); while (!(@$n == 1 && $n->[0] == $step)) { _mul($c,$cx,$n); _dec($c,$n); @@ -1284,21 +1234,21 @@ sub _fac $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 (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 +1257,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 +1275,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 +1292,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 +1309,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? @@ -1600,38 +1549,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 diff --git a/lib/Math/BigInt/Scalar.pm b/lib/Math/BigInt/Scalar.pm new file mode 100644 index 0000000000..44bab5d53f --- /dev/null +++ b/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/lib/Math/BigInt/t/bare_mbf.t b/lib/Math/BigInt/t/bare_mbf.t index fbf8f055b9..9548fe80c6 100644 --- a/lib/Math/BigInt/t/bare_mbf.t +++ b/lib/Math/BigInt/t/bare_mbf.t @@ -27,7 +27,7 @@ BEGIN } print "# INC = @INC\n"; - plan tests => 1627; + plan tests => 1643; } use Math::BigFloat lib => 'BareCalc'; diff --git a/lib/Math/BigInt/t/bare_mbi.t b/lib/Math/BigInt/t/bare_mbi.t index c725e5af55..b2d5446ba8 100644 --- a/lib/Math/BigInt/t/bare_mbi.t +++ b/lib/Math/BigInt/t/bare_mbi.t @@ -26,7 +26,7 @@ BEGIN } print "# INC = @INC\n"; - plan tests => 2552; + plan tests => 2527; } 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/lib/Math/BigInt/t/bare_mif.t b/lib/Math/BigInt/t/bare_mif.t index faaef9db33..15a1448e0a 100644 --- a/lib/Math/BigInt/t/bare_mif.t +++ b/lib/Math/BigInt/t/bare_mif.t @@ -28,7 +28,7 @@ BEGIN } print "# INC = @INC\n"; - plan tests => 617 + plan tests => 669 + 1; # our onw tests } diff --git a/lib/Math/BigInt/t/bigfltpm.inc b/lib/Math/BigInt/t/bigfltpm.inc index 67bd54e164..774e26e208 100644 --- a/lib/Math/BigInt/t/bigfltpm.inc +++ b/lib/Math/BigInt/t/bigfltpm.inc @@ -2,6 +2,8 @@ ok ($class->config()->{lib},$CL); +use strict; + while (<DATA>) { chomp; @@ -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") { @@ -158,8 +156,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 +187,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 +208,26 @@ $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); - -ok ($class->new(15129)->bdiv(123),123); -ok ($class->bdiv(15129,123),123); -ok ($class->bdiv(15129,$class->new(123)),123); - -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); +{ + no strict; + $try = + '@args' . " = $class" . "::objectify(2,$class,4,5);".'join(" ",@args);'; + $ans = eval $try; + ok ($ans,"$class 4 5"); +} 1; # all done @@ -329,17 +306,56 @@ 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 &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 +374,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 diff --git a/lib/Math/BigInt/t/bigfltpm.t b/lib/Math/BigInt/t/bigfltpm.t index 33614039bd..bab134f25f 100755 --- a/lib/Math/BigInt/t/bigfltpm.t +++ b/lib/Math/BigInt/t/bigfltpm.t @@ -26,7 +26,7 @@ BEGIN } print "# INC = @INC\n"; - plan tests => 1627 + plan tests => 1643 + 2; # own tests } diff --git a/lib/Math/BigInt/t/bigintc.t b/lib/Math/BigInt/t/bigintc.t index 26530ca6e1..22e64c5f2c 100644 --- a/lib/Math/BigInt/t/bigintc.t +++ b/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 => 276; } -# 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,7 +187,12 @@ $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'); @@ -136,12 +206,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 +251,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); @@ -180,9 +280,38 @@ 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) +# __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); +} -exit if $Math::BigInt::Calc::VERSION < 0.19; +############################################################################### +# _to_large and _to_small (last since they toy with BASE_LEN etc) $C->_base_len(5,7); $x = [ qw/67890 12345 67890 12345/ ]; $C->_to_large($x); ok (@$x,3); diff --git a/lib/Math/BigInt/t/bigintpm.inc b/lib/Math/BigInt/t/bigintpm.inc index fa5b6f0de1..9f3a1abc5c 100644 --- a/lib/Math/BigInt/t/bigintpm.inc +++ b/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") { @@ -430,6 +429,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 +503,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 @@ -736,86 +759,6 @@ 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 123:123 # binary input 0babc:NaN @@ -1102,10 +1045,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 @@ -1499,6 +1454,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 diff --git a/lib/Math/BigInt/t/bigintpm.t b/lib/Math/BigInt/t/bigintpm.t index b4c4f111dd..be3e3596c9 100755 --- a/lib/Math/BigInt/t/bigintpm.t +++ b/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 => 2527; } use Math::BigInt; diff --git a/lib/Math/BigInt/t/bigints.t b/lib/Math/BigInt/t/bigints.t new file mode 100644 index 0000000000..fb9b2f49f6 --- /dev/null +++ b/lib/Math/BigInt/t/bigints.t @@ -0,0 +1,109 @@ +#!/usr/bin/perl -w + +use strict; +use Test; + +BEGIN + { + $| = 1; + # chdir 't' if -d 't'; + unshift @INC, '../lib'; # for running manually + 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/lib/Math/BigInt/t/calling.t b/lib/Math/BigInt/t/calling.t index b905385344..3b0ff41dd4 100644 --- a/lib/Math/BigInt/t/calling.t +++ b/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/lib/Math/BigInt/t/constant.t b/lib/Math/BigInt/t/constant.t index 2f14de2a81..4e5a17eaa7 100644 --- a/lib/Math/BigInt/t/constant.t +++ b/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/lib/Math/BigInt/t/mbimbf.inc b/lib/Math/BigInt/t/mbimbf.inc index d33d6b5447..a00183f0ec 100644 --- a/lib/Math/BigInt/t/mbimbf.inc +++ b/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); } ############################################################################### @@ -251,6 +321,25 @@ $mbf->round_mode('even'); $x = $mbf->new('740.7')->fdiv('6',4,undef,'zero'); ok ($x,'123.4'); ############################################################################### +# 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 ok ($mbi->new(12)->bfac(),'479001600'); @@ -293,7 +382,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 +400,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 +424,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 +592,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 +633,21 @@ 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 + + ${"$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 +} ############################################################################### # test whether bone/bzero take additional A & P, or reset it etc @@ -592,16 +702,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/lib/Math/BigInt/t/mbimbf.t b/lib/Math/BigInt/t/mbimbf.t index 4a63296023..67645ef244 100644 --- a/lib/Math/BigInt/t/mbimbf.t +++ b/lib/Math/BigInt/t/mbimbf.t @@ -31,12 +31,12 @@ BEGIN } print "# INC = @INC\n"; - plan tests => 617 + plan tests => 669 + 16; # 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/; diff --git a/lib/Math/BigInt/t/sub_mbf.t b/lib/Math/BigInt/t/sub_mbf.t index 93c2dbf1d8..dbd68f10d4 100755 --- a/lib/Math/BigInt/t/sub_mbf.t +++ b/lib/Math/BigInt/t/sub_mbf.t @@ -26,7 +26,7 @@ BEGIN } print "# INC = @INC\n"; - plan tests => 1627 + plan tests => 1643 + 6; # + our own tests } diff --git a/lib/Math/BigInt/t/sub_mbi.t b/lib/Math/BigInt/t/sub_mbi.t index a68113d4f4..9953f4b802 100755 --- a/lib/Math/BigInt/t/sub_mbi.t +++ b/lib/Math/BigInt/t/sub_mbi.t @@ -26,7 +26,7 @@ BEGIN } print "# INC = @INC\n"; - plan tests => 2552 + plan tests => 2527 + 5; # +5 own tests } diff --git a/lib/Math/BigInt/t/sub_mif.t b/lib/Math/BigInt/t/sub_mif.t index 3db96ff97a..365fe617d7 100644 --- a/lib/Math/BigInt/t/sub_mif.t +++ b/lib/Math/BigInt/t/sub_mif.t @@ -28,7 +28,7 @@ BEGIN } print "# INC = @INC\n"; - plan tests => 617; + plan tests => 669; } use Math::BigInt::Subclass; diff --git a/lib/Math/BigInt/t/upgrade.inc b/lib/Math/BigInt/t/upgrade.inc index fc70873e0c..4bb5d35fd3 100644 --- a/lib/Math/BigInt/t/upgrade.inc +++ b/lib/Math/BigInt/t/upgrade.inc @@ -212,6 +212,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; diff --git a/lib/Math/BigInt/t/upgrade.t b/lib/Math/BigInt/t/upgrade.t index 28d2ce1dac..6c087a5348 100644 --- a/lib/Math/BigInt/t/upgrade.t +++ b/lib/Math/BigInt/t/upgrade.t @@ -26,7 +26,7 @@ BEGIN } print "# INC = @INC\n"; - plan tests => 2068 + plan tests => 2072 + 2; # our own tests } diff --git a/lib/Math/BigInt/t/with_sub.t b/lib/Math/BigInt/t/with_sub.t index f70b9baced..226533252e 100644 --- a/lib/Math/BigInt/t/with_sub.t +++ b/lib/Math/BigInt/t/with_sub.t @@ -28,7 +28,7 @@ BEGIN } print "# INC = @INC\n"; - plan tests => 1627 + plan tests => 1643 + 1; } diff --git a/lib/Math/BigRat.pm b/lib/Math/BigRat.pm index 41c4e10c56..f33fcf13de 100644 --- a/lib/Math/BigRat.pm +++ b/lib/Math/BigRat.pm @@ -1,6 +1,6 @@ # -# "Tax the rat farms." +# "Tax the rat farms." - Lord Vetinari # # The following hash values are used: @@ -9,7 +9,7 @@ # _n : numeraotr (value = _n/_d) # _a : accuracy # _p : precision -# _f : flags, used by MBR to flag parts of a rational as untouchable +# _f : flags, used by MBR to flag parts of a rationale as untouchable package Math::BigRat; @@ -24,7 +24,7 @@ use vars qw($VERSION @ISA $PACKAGE @EXPORT_OK $upgrade $downgrade @ISA = qw(Exporter Math::BigFloat); @EXPORT_OK = qw(); -$VERSION = '0.07'; +$VERSION = '0.09'; use overload; # inherit from Math::BigFloat @@ -51,14 +51,13 @@ sub isa sub _new_from_float { - # turn a single float input into a rational (like '0.1') + # turn a single float input into a rationale (like '0.1') my ($self,$f) = @_; return $self->bnan() if $f->is_nan(); 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} = '+'; @@ -102,7 +101,7 @@ sub new } if ($n->isa('Math::BigInt::Lite')) { - $self->{_n} = $MBI->new($$n); # "mantissa" = $n + $self->{_n} = $MBI->new($$n,undef,undef); # "mantissa" = $n $self->{_d} = $MBI->bone(); $self->{sign} = $self->{_n}->{sign}; $self->{_n}->{sign} = '+'; return $self->bnorm(); @@ -112,7 +111,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(); @@ -127,9 +126,14 @@ sub new if (($n =~ /[\.eE]/) || ($d =~ /[\.eE]/)) { # one of them looks like 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->_new_from_float(Math::BigFloat->new($n)); # now correct $self->{_n} due to $n - my $f = Math::BigFloat->new($d); + my $f = Math::BigFloat->new($d,undef,undef); if ($f->{_e}->{sign} eq '-') { # 10 / 0.1 => 100/1 @@ -142,8 +146,9 @@ sub new } else { - $self->{_n} = $MBI->new($n); - $self->{_d} = $MBI->new($d); + # both d and n are (big)ints + $self->{_n} = $MBI->new($n,undef,undef); + $self->{_d} = $MBI->new($d,undef,undef); return $self->bnan() if $self->{_n}->is_nan() || $self->{_d}->is_nan(); # inf handling is missing here @@ -158,14 +163,17 @@ sub new # 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->_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} = '+'; return $self->bnan() if $self->{sign} eq 'NaN'; @@ -203,7 +211,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 @@ -242,6 +250,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()) @@ -265,7 +275,7 @@ sub _bnan 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; $self->{_n} = $MBI->bzero(); $self->{_d} = $MBI->bzero(); @@ -273,7 +283,7 @@ sub _binf 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 +291,7 @@ sub _bone 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; $self->{_n} = $MBI->bzero(); $self->{_d} = $MBI->bone(); @@ -292,28 +302,38 @@ sub _bzero sub badd { - # add two rationals - my ($self,$x,$y,$a,$p,$r) = objectify(2,@_); + # add two rationales + + # 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,13 +342,20 @@ 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,@_); + # subtract two rationales + + # 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 = $class->new($x) unless $x->isa($class); $y = $class->new($y) unless $y->isa($class); @@ -336,20 +363,20 @@ sub bsub 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,13 +385,20 @@ 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,@_); + # multiply two rationales + + # 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 = $class->new($x) unless $x->isa($class); $y = $class->new($y) unless $y->isa($class); @@ -392,20 +426,30 @@ 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,@_); + } $x = $class->new($x) unless $x->isa($class); $y = $class->new($y) unless $y->isa($class); @@ -421,13 +465,16 @@ 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; } @@ -459,8 +506,6 @@ sub bdec } } $x->bnorm()->round(@r); - - #$x->bsub($self->bone())->round(@r); } sub binc @@ -488,8 +533,6 @@ sub binc $x->{_n}->badd($x->{_d}); # 5/2 => 7/2 } $x->bnorm()->round(@r); - - #$x->badd($self->bone())->round(@r); } ############################################################################## @@ -501,7 +544,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; } @@ -639,7 +682,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 +757,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 @@ -812,6 +862,19 @@ 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 + + my $t = Math::BigFloat->new($x->{_n}); + $t->bneg() if $x->is_negative(); + $t->bdiv($x->{_d}); + $t->numify(); + } + sub as_number { my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_); @@ -904,20 +967,21 @@ __END__ =head1 NAME -Math::BigRat - arbitrarily big rationals +Math::BigRat - arbitrarily big rationales =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 rationales. =head2 MATH LIBRARY @@ -936,15 +1000,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 +1025,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,6 +1055,9 @@ BigInts. =head2 as_number() + $x = Math::BigRat->new('13/7'); + print $x->as_number(),"\n"; # '1' + Returns a copy of the object as BigInt by truncating it to integer. =head2 bfac() @@ -993,7 +1069,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 +1079,79 @@ Is not yet implemented. Are not yet implemented. +=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. =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 +1163,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/lib/Math/BigRat/t/big_ap.t b/lib/Math/BigRat/t/big_ap.t new file mode 100644 index 0000000000..c91684a4e5 --- /dev/null +++ b/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/lib/Math/BigRat/t/bigrat.t b/lib/Math/BigRat/t/bigrat.t index b59d9f0aa7..dd289f241f 100755 --- a/lib/Math/BigRat/t/bigrat.t +++ b/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 => 151; } # testing of Math::BigRat @@ -164,6 +164,12 @@ $x = $cr->new('144/9')->bsqrt(); ok ($x,'4'); # 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 +196,28 @@ $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'); + +############################################################################## # done 1; diff --git a/lib/Math/BigRat/t/bigratpm.inc b/lib/Math/BigRat/t/bigratpm.inc index 0f77c33add..fbf8338064 100644 --- a/lib/Math/BigRat/t/bigratpm.inc +++ b/lib/Math/BigRat/t/bigratpm.inc @@ -51,11 +51,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 diff --git a/lib/Net/Ping.pm b/lib/Net/Ping.pm index 815bb75843..1192663238 100644 --- a/lib/Net/Ping.pm +++ b/lib/Net/Ping.pm @@ -1,22 +1,23 @@ package Net::Ping; -# $Id: Ping.pm,v 1.6 2002/06/19 15:23:48 rob Exp $ +# $Id: Ping.pm,v 1.33 2002/10/19 05:02:43 rob Exp $ require 5.002; require Exporter; use strict; use vars qw(@ISA @EXPORT $VERSION - $def_timeout $def_proto $max_datasize $pingstring $hires $source_verify); -use FileHandle; -use Socket qw( SOCK_DGRAM SOCK_STREAM SOCK_RAW PF_INET + $def_timeout $def_proto $max_datasize $pingstring $hires $source_verify $syn_forking); +use Fcntl qw( F_GETFL F_SETFL O_NONBLOCK ); +use Socket qw( SOCK_DGRAM SOCK_STREAM SOCK_RAW PF_INET SOL_SOCKET inet_aton inet_ntoa sockaddr_in ); +use POSIX qw( ECONNREFUSED EINPROGRESS WNOHANG ); +use FileHandle; use Carp; -use POSIX qw(ECONNREFUSED); @ISA = qw(Exporter); @EXPORT = qw(pingecho); -$VERSION = "2.20"; +$VERSION = "2.23"; # Constants @@ -26,13 +27,19 @@ $max_datasize = 1024; # Maximum data bytes in a packet # The data we exchange with the server for the stream protocol $pingstring = "pingschwingping!\n"; $source_verify = 1; # Default is to verify source endpoint +$syn_forking = 0; if ($^O =~ /Win32/i) { # Hack to avoid this Win32 spewage: # Your vendor has not defined POSIX macro ECONNREFUSED *ECONNREFUSED = sub {10061;}; # "Unknown Error" Special Win32 Response? + $syn_forking = 1; }; +# h2ph "asm/socket.h" +# require "asm/socket.ph"; +sub SO_BINDTODEVICE {25;} + # Description: The pingecho() subroutine is provided for backward # compatibility with the original Net::Ping. It accepts a host # name/IP and an optional timeout in seconds. Create a tcp ping @@ -61,7 +68,8 @@ sub new my ($this, $proto, # Optional protocol to use for pinging $timeout, # Optional timeout in seconds - $data_size # Optional additional bytes of data + $data_size, # Optional additional bytes of data + $device, # Optional device to use ) = @_; my $class = ref($this) || $this; my $self = {}; @@ -72,8 +80,8 @@ sub new bless($self, $class); $proto = $def_proto unless $proto; # Determine the protocol - croak('Protocol for ping must be "icmp", "udp", "tcp", "stream", or "external"') - unless $proto =~ m/^(icmp|udp|tcp|stream|external)$/; + croak('Protocol for ping must be "icmp", "udp", "tcp", "syn", "stream", or "external"') + unless $proto =~ m/^(icmp|udp|tcp|syn|stream|external)$/; $self->{"proto"} = $proto; $timeout = $def_timeout unless $timeout; # Determine the timeout @@ -81,6 +89,8 @@ sub new if $timeout <= 0; $self->{"timeout"} = $timeout; + $self->{"device"} = $device; + $min_datasize = ($proto eq "udp") ? 1 : 0; # Determine data size $data_size = $min_datasize unless defined($data_size) && $proto ne "tcp"; croak("Data for ping must be from $min_datasize to $max_datasize bytes") @@ -96,6 +106,8 @@ sub new $self->{"local_addr"} = undef; # Don't bind by default + $self->{"tcp_econnrefused"} = undef; # Default Connection refused behavior + $self->{"seq"} = 0; # For counting packets if ($self->{"proto"} eq "udp") # Open a socket { @@ -107,16 +119,24 @@ sub new socket($self->{"fh"}, PF_INET, SOCK_DGRAM, $self->{"proto_num"}) || croak("udp socket error - $!"); + if ($self->{'device'}) { + setsockopt($self->{"fh"}, SOL_SOCKET, SO_BINDTODEVICE(), pack("Z*", $self->{'device'})) + or croak "error binding to device $self->{'device'} $!"; + } } elsif ($self->{"proto"} eq "icmp") { - croak("icmp ping requires root privilege") if ($> and $^O ne 'VMS'); + croak("icmp ping requires root privilege") if ($> and $^O ne 'VMS' and $^O ne 'cygwin'); $self->{"proto_num"} = (getprotobyname('icmp'))[2] || croak("Can't get icmp protocol by name"); $self->{"pid"} = $$ & 0xffff; # Save lower 16 bits of pid $self->{"fh"} = FileHandle->new(); socket($self->{"fh"}, PF_INET, SOCK_RAW, $self->{"proto_num"}) || croak("icmp socket error - $!"); + if ($self->{'device'}) { + setsockopt($self->{"fh"}, SOL_SOCKET, SO_BINDTODEVICE(), pack("Z*", $self->{'device'})) + or croak "error binding to device $self->{'device'} $!"; + } } elsif ($self->{"proto"} eq "tcp" || $self->{"proto"} eq "stream") { @@ -126,6 +146,28 @@ sub new croak("Can't get tcp echo port by name"); $self->{"fh"} = FileHandle->new(); } + elsif ($self->{"proto"} eq "syn") + { + $self->{"proto_num"} = (getprotobyname('tcp'))[2] || + croak("Can't get tcp protocol by name"); + $self->{"port_num"} = (getservbyname('echo', 'tcp'))[2] || + croak("Can't get tcp echo port by name"); + if ($syn_forking) { + $self->{"fork_rd"} = FileHandle->new(); + $self->{"fork_wr"} = FileHandle->new(); + pipe($self->{"fork_rd"}, $self->{"fork_wr"}); + $self->{"fh"} = FileHandle->new(); + } else { + $self->{"wbits"} = ""; + $self->{"bad"} = {}; + } + $self->{"syn"} = {}; + $self->{"stop_time"} = 0; + } + elsif ($self->{"proto"} eq "external") + { + # No preliminary work needs to be done. + } return($self); } @@ -175,6 +217,17 @@ sub source_verify ($source_verify = ((defined $self) && (ref $self)) ? shift() : $self); } +# Description: Set whether or not the tcp connect +# behavior should enforce remote service availability +# as well as reachability. + +sub tcp_service_check +{ + my $self = shift; + $self->{"tcp_econnrefused"} = 1 unless defined + ($self->{"tcp_econnrefused"} = shift()); +} + # Description: allows the module to use milliseconds as returned by # the Time::HiRes module @@ -231,6 +284,9 @@ sub ping } elsif ($self->{"proto"} eq "stream") { $ret = $self->ping_stream($ip, $timeout); + } + elsif ($self->{"proto"} eq "syn") { + $ret = $self->ping_syn($host, $ip, $ping_time, $ping_time+$timeout); } else { croak("Unknown protocol \"$self->{proto}\" in ping()"); } @@ -385,7 +441,10 @@ sub ping_tcp $@ = ""; $! = 0; $ret = $self -> tcp_connect( $ip, $timeout); - $ret = 1 if $! == ECONNREFUSED; # Connection refused + if (!$self->{"tcp_econnrefused"} && + $! == ECONNREFUSED) { + $ret = 1; # "Connection refused" means reachable + } $self->{"fh"}->close(); return $ret; } @@ -409,6 +468,10 @@ sub tcp_connect !CORE::bind($self->{"fh"}, sockaddr_in(0, $self->{"local_addr"}))) { croak("tcp bind error - $!"); } + if ($self->{'device'}) { + setsockopt($self->{"fh"}, SOL_SOCKET, SO_BINDTODEVICE(), pack("Z*", $self->{'device'})) + or croak("error binding to device $self->{'device'} $!"); + } }; my $do_connect = sub { eval { @@ -451,13 +514,12 @@ sub tcp_connect my $patience = &time() + $timeout; - require POSIX; my ($child); $? = 0; # Wait up to the timeout # And clean off the zombie do { - $child = waitpid($pid, &POSIX::WNOHANG); + $child = waitpid($pid, &WNOHANG()); $! = $? >> 8; $@ = $!; select(undef, undef, undef, 0.1); @@ -481,11 +543,11 @@ sub tcp_connect &{ $do_socket }(); - $SIG{'ALRM'} = sub { die "Timed out!"; }; - alarm($timeout); # Interrupt connect() if we have to + local $SIG{'ALRM'} = sub { die "Timed out!"; }; + my $old = alarm($timeout); # Interrupt connect() if we have to &{ $do_connect }(); - alarm(0); + alarm($old); } return $ret; @@ -667,14 +729,318 @@ sub ping_udp return $ret; } -# Description: Close the connection unless we are using the tcp -# protocol, since it will already be closed. +# Description: Send a TCP SYN packet to host specified. +sub ping_syn +{ + my $self = shift; + my $host = shift; + my $ip = shift; + my $start_time = shift; + my $stop_time = shift; + + if ($syn_forking) { + return $self->ping_syn_fork($host, $ip, $start_time, $stop_time); + } + + my $fh = FileHandle->new(); + my $saddr = sockaddr_in($self->{"port_num"}, $ip); + + # Create TCP socket + if (!socket ($fh, PF_INET, SOCK_STREAM, $self->{"proto_num"})) { + croak("tcp socket error - $!"); + } + + if (defined $self->{"local_addr"} && + !CORE::bind($fh, sockaddr_in(0, $self->{"local_addr"}))) { + croak("tcp bind error - $!"); + } + + if ($self->{'device'}) { + setsockopt($fh, SOL_SOCKET, SO_BINDTODEVICE(), pack("Z*", $self->{'device'})) + or croak("error binding to device $self->{'device'} $!"); + } + + # Set O_NONBLOCK property on filehandle + if (my $flags = fcntl($fh, F_GETFL, 0)) { + fcntl($fh, F_SETFL, $flags | O_NONBLOCK); + } else { + croak("fcntl F_GETFL: $!"); + } + + # Attempt the non-blocking connect + # by just sending the TCP SYN packet + if (connect($fh, $saddr)) { + # Non-blocking, yet still connected? + # Must have connected very quickly. + # Can this ever really happen? + } + else { + # Error occurred connecting. + # Hopefully the connection is just still in progress. + if ($! != EINPROGRESS) { + # If not, then it really is something bad. + $self->{"bad"}->{$host} = $!; + return undef; + } + } + + my $entry = [ $host, $ip, $fh, $start_time, $stop_time ]; + $self->{"syn"}->{$fh->fileno} = $entry; + if ($self->{"stop_time"} < $stop_time) { + $self->{"stop_time"} = $stop_time; + } + vec($self->{"wbits"}, $fh->fileno, 1) = 1; + + return 1; +} + +sub ping_syn_fork { + my ($self, $host, $ip, $start_time, $stop_time) = @_; + + # Buggy Winsock API doesn't allow nonblocking connect. + # Hence, if our OS is Windows, we need to create a separate + # process to do the blocking connect attempt. + my $pid = fork(); + if (defined $pid) { + if ($pid) { + # Parent process + my $entry = [ $host, $ip, $pid, $start_time, $stop_time ]; + $self->{"syn"}->{$pid} = $entry; + if ($self->{"stop_time"} < $stop_time) { + $self->{"stop_time"} = $stop_time; + } + } else { + # Child process + my $saddr = sockaddr_in($self->{"port_num"}, $ip); + + # Create TCP socket + if (!socket ($self->{"fh"}, PF_INET, SOCK_STREAM, $self->{"proto_num"})) { + croak("tcp socket error - $!"); + } + + if (defined $self->{"local_addr"} && + !CORE::bind($self->{"fh"}, sockaddr_in(0, $self->{"local_addr"}))) { + croak("tcp bind error - $!"); + } + + if ($self->{'device'}) { + setsockopt($self->{"fh"}, SOL_SOCKET, SO_BINDTODEVICE(), pack("Z*", $self->{'device'})) + or croak("error binding to device $self->{'device'} $!"); + } + + $!=0; + # Try to connect (could take a long time) + connect($self->{"fh"}, $saddr); + # Notify parent of connect error status + my $err = $!+0; + my $wrstr = "$$ $err"; + # Force to 10 chars including \n + $wrstr .= " "x(9 - length $wrstr). "\n"; + syswrite($self->{"fork_wr"}, $wrstr); + exit; + } + } else { + # fork() failed? + die "fork: $!"; + } + return 1; +} + +# Description: Wait for TCP ACK from host specified +# from ping_syn above. If no host is specified, wait +# for TCP ACK from any of the hosts in the SYN queue. +sub ack +{ + my $self = shift; + + if ($self->{"proto"} eq "syn") { + if ($syn_forking) { + my @answer = $self->ack_unfork(shift); + return wantarray ? @answer : $answer[0]; + } + my $wbits = ""; + my $stop_time = 0; + if (my $host = shift) { + # Host passed as arg + if (exists $self->{"bad"}->{$host}) { + return (); + } + my $host_fd = undef; + foreach my $fd (keys %{ $self->{"syn"} }) { + my $entry = $self->{"syn"}->{$fd}; + if ($entry->[0] eq $host) { + $host_fd = $fd; + $stop_time = $entry->[4] + || croak("Corrupted SYN entry for [$host]"); + last; + } + } + croak("ack called on [$host] without calling ping first!") + unless defined $host_fd; + vec($wbits, $host_fd, 1) = 1; + } else { + # No $host passed so scan all hosts + # Use the latest stop_time + $stop_time = $self->{"stop_time"}; + # Use all the bits + $wbits = $self->{"wbits"}; + } + + while ($wbits !~ /^\0*$/) { + my $timeout = $stop_time - &time(); + # Force a minimum of 10 ms timeout. + $timeout = 0.01 if $timeout <= .01; + if (my $nfound = select(undef, (my $wout=$wbits), undef, $timeout)) { + # Done waiting for one of the ACKs + my $fd = 0; + # Determine which one + while (length $wout && + !vec($wout, $fd, 1)) { + $fd++; + } + if (my $entry = $self->{"syn"}->{$fd}) { + if (getpeername($entry->[2])) { + # Connection established to remote host + delete $self->{"syn"}->{$fd}; + vec($self->{"wbits"}, $fd, 1) = 0; + return wantarray ? + ($entry->[0], &time() - $entry->[3], inet_ntoa($entry->[1])) + : $entry->[0]; + } else { + # TCP ACK will never come from this host + # because there was an error connecting. + + # Wipe it from future scanning. + delete $self->{"syn"}->{$fd}; + vec($self->{"wbits"}, $fd, 1) = 0; + vec($wbits, $fd, 1) = 0; + + # This should set $! to the correct error. + my $char; + read($entry->[2],$char,1); + # Store the excuse why the connection failed. + $self->{"bad"}->{$entry->[0]} = $!; + if (!$self->{"tcp_econnrefused"} && + $! == ECONNREFUSED) { + # "Connection refused" means reachable + return wantarray ? + ($entry->[0], &time() - $entry->[3], inet_ntoa($entry->[1])) + : $entry->[0]; + } + # Try another socket... + } + } else { + warn "Corrupted SYN entry: unknown fd [$fd] ready!"; + vec($wbits, $fd, 1) = 0; + vec($self->{"wbits"}, $fd, 1) = 0; + } + } elsif (defined $nfound) { + # Timed out waiting for ACK + foreach my $fd (keys %{ $self->{"syn"} }) { + if (vec($wbits, $fd, 1)) { + my $entry = $self->{"syn"}->{$fd}; + $self->{"bad"}->{$entry->[0]} = "Timed out"; + vec($wbits, $fd, 1) = 0; + vec($self->{"wbits"}, $fd, 1) = 0; + delete $self->{"syn"}->{$fd}; + } + } + } else { + # Weird error occurred with select() + warn("select: $!"); + $self->{"syn"} = {}; + $wbits = ""; + } + } + } + return (); +} + +sub ack_unfork { + my $self = shift; + my $stop_time = $self->{"stop_time"}; + if (my $host = shift) { + # Host passed as arg + warn "Cannot specify host for ack on win32\n"; + } + + my $rbits = ""; + my $timeout; + if (keys %{ $self->{"syn"} }) { + # Scan all hosts that are left + vec($rbits, fileno($self->{"fork_rd"}), 1) = 1; + $timeout = $stop_time - &time(); + } else { + # No hosts left to wait for + $timeout = 0; + } + + if ($timeout > 0) { + if (my $nfound = select((my $rout=$rbits), undef, undef, $timeout)) { + # Done waiting for one of the ACKs + if (!sysread($self->{"fork_rd"}, $_, 10)) { + # Socket closed, which means all children are done. + return (); + } + my ($pid, $how) = split; + if ($pid) { + # Flush the zombie + waitpid($pid, 0); + if (my $entry = $self->{"syn"}->{$pid}) { + # Connection attempt to remote host is done + delete $self->{"syn"}->{$pid}; + if (!$how || # If there was no error connecting + (!$self->{"tcp_econnrefused"} && + $how == ECONNREFUSED)) { # "Connection refused" means reachable + return ($entry->[0], &time() - $entry->[3], inet_ntoa($entry->[1])); + } + } else { + # Should never happen + die "Unknown ping from pid [$pid]"; + } + } else { + die "Empty response from status socket?"; + } + } elsif (defined $nfound) { + # Timed out waiting for ACK status + } else { + # Weird error occurred with select() + warn("select: $!"); + } + } + if (my @synners = keys %{ $self->{"syn"} }) { + # Kill all the synners + kill 9, @synners; + foreach my $pid (@synners) { + # Wait for the deaths to finish + # Then flush off the zombie + waitpid($pid, 0); + } + } + $self->{"syn"} = {}; + return (); +} + +# Description: Tell why the ack() failed +sub nack { + my $self = shift; + my $host = shift || croak('Usage> nack($failed_ack_host)'); + return $self->{"bad"}->{$host} || undef; +} + +# Description: Close the connection. sub close { my ($self) = @_; - $self->{"fh"}->close() unless $self->{"proto"} eq "tcp"; + if ($self->{"proto"} eq "syn") { + delete $self->{"syn"}; + } elsif ($self->{"proto"} eq "tcp") { + # The connection will already be closed + } else { + $self->{"fh"}->close(); + } } @@ -685,7 +1051,7 @@ __END__ Net::Ping - check a remote host for reachability -$Id: Ping.pm,v 1.6 2002/06/19 15:23:48 rob Exp $ +$Id: Ping.pm,v 1.33 2002/10/19 05:02:43 rob Exp $ =head1 SYNOPSIS @@ -717,6 +1083,16 @@ $Id: Ping.pm,v 1.6 2002/06/19 15:23:48 rob Exp $ } undef($p); + # Like tcp protocol, but with many hosts + $p = Net::Ping->new("syn"); + $p->{port_num} = getservbyname("http", "tcp"); + foreach $host (@host_array) { + $p->ping($host); + } + while (($host,$rtt,$ip) = $p->ack) { + print "HOST: $host [$ip] ACKed in $rtt seconds.\n"; + } + # High precision syntax (requires Time::HiRes) $p = Net::Ping->new(); $p->hires(); @@ -735,10 +1111,10 @@ hosts on a network. A ping object is first created with optional parameters, a variable number of hosts may be pinged multiple times and then the connection is closed. -You may choose one of four different protocols to use for the -ping. The "udp" protocol is the default. Note that a live remote host +You may choose one of six different protocols to use for the +ping. The "tcp" protocol is the default. Note that a live remote host may still fail to be pingable by one or more of these protocols. For -example, www.microsoft.com is generally alive but not pingable. +example, www.microsoft.com is generally alive but not "icmp" pingable. With the "tcp" protocol the ping() method attempts to establish a connection to the remote host's echo port. If the connection is @@ -770,15 +1146,32 @@ utility to perform the ping, and generally produces relatively accurate results. If C<Net::Ping::External> if not installed on your system, specifying the "external" protocol will result in an error. +If the "syn" protocol is specified, the ping() method will only +send a TCP SYN packet to the remote host then immediately return. +If the syn packet was sent successfully, it will return a true value, +otherwise it will return false. NOTE: Unlike the other protocols, +the return value does NOT determine if the remote host is alive or +not since the full TCP three-way handshake may not have completed +yet. The remote host is only considered reachable if it receives +a TCP ACK within the timeout specifed. To begin waiting for the +ACK packets, use the ack() method as explained below. Use the +"syn" protocol instead the "tcp" protocol to determine reachability +of multiple destinations simultaneously by sending parallel TCP +SYN packets. It will not block while testing each remote host. +demo/fping is provided in this distribution to demonstrate the +"syn" protocol as an example. +This protocol does not require any special privileges. + =head2 Functions =over 4 -=item Net::Ping->new([$proto [, $def_timeout [, $bytes]]]); +=item Net::Ping->new([$proto [, $def_timeout [, $bytes [, $device ]]]]); Create a new ping object. All of the parameters are optional. $proto specifies the protocol to use when doing a ping. The current choices -are "tcp", "udp" or "icmp". The default is "udp". +are "tcp", "udp", "icmp", "stream", "syn", or "external". +The default is "tcp". If a default timeout ($def_timeout) in seconds is provided, it is used when a timeout is not given to the ping() method (below). The timeout @@ -791,6 +1184,10 @@ default) number of data bytes is 1 if the protocol is "udp" and 0 otherwise. The maximum number of data bytes that can be specified is 1024. +If $device is given, this device is used to bind the source endpoint +before sending the ping packet. I beleive this only works with +superuser privileges and with udp and icmp protocols at this time. + =item $p->ping($host [, $timeout]); Ping the remote host and wait for a response. $host can be either the @@ -801,7 +1198,8 @@ hostname cannot be found or there is a problem with the IP number, the success flag returned will be undef. Otherwise, the success flag will be 1 if the host is reachable and 0 if it is not. For most practical purposes, undef and 0 and can be treated as the same case. In array -context, the elapsed time is also returned. The elapsed time value will +context, the elapsed time as well as the string form of the ip the +host resolved to are also returned. The elapsed time value will be a float, as retuned by the Time::HiRes::time() function, if hires() has been previously called, otherwise it is returned as an integer. @@ -815,6 +1213,27 @@ This only affects udp and icmp protocol pings. This is enabled by default. +=item $p->tcp_service_check( { 0 | 1 } ); + +Set whether or not the tcp connect behavior should enforce +remote service availability as well as reachability. Normally, +if the remote server reported ECONNREFUSED, it must have been +reachable because of the status packet that it reported. +With this option enabled, the full three-way tcp handshake +must have been established successfully before it will +claim it is reachable. NOTE: It still does nothing more +than connect and disconnect. It does not speak any protocol +(i.e., HTTP or FTP) to ensure the remote server is sane in +any way. The remote server CPU could be grinding to a halt +and unresponsive to any clients connecting, but if the kernel +throws the ACK packet, it is considered alive anyway. To +really determine if the server is responding well would be +application specific and is beyond the scope of Net::Ping. + +This only affects "tcp" and "syn" protocols. + +This is disabled by default. + =item $p->hires( { 0 | 1 } ); Causes this module to use Time::HiRes module, allowing milliseconds @@ -838,7 +1257,7 @@ object. =item $p->open($host); -When you are using the stream protocol, this call pre-opens the +When you are using the "stream" protocol, this call pre-opens the tcp socket. It's only necessary to do this if you want to provide a different timeout when creating the connection, or remove the overhead of establishing the connection from the @@ -847,6 +1266,31 @@ automatically opened the first time C<ping()> is called. This call simply does nothing if you are using any protocol other than stream. +=item $p->ack( [ $host ] ); + +When using the "syn" protocol, use this method to determine +the reachability of the remote host. This method is meant +to be called up to as many times as ping() was called. Each +call returns the host (as passed to ping()) that came back +with the TCP ACK. The order in which the hosts are returned +may not necessarily be the same order in which they were +SYN queued using the ping() method. If the timeout is +reached before the TCP ACK is received, or if the remote +host is not listening on the port attempted, then the TCP +connection will not be established and ack() will return +undef. In list context, the host, the ack time, and the +dotted ip string will be returned instead of just the host. +If the optional $host argument is specified, the return +value will be partaining to that host only. +This call simply does nothing if you are using any protocol +other than syn. + +=item $p->nack( $failed_ack_host ); + +The reason that host $failed_ack_host did not receive a +valid ACK. Useful to find out why when ack( $fail_ack_host ) +returns a false value. + =item $p->close(); Close the network connection for this ping object. The network @@ -905,7 +1349,7 @@ kinds of ICMP packets. The latest source tree is available via cvs: - cvs -z3 -q -d :pserver:anonymous@cvs.roobik.com.:/usr/local/cvsroot/freeware co Net-Ping + cvs -z3 -q -d :pserver:anonymous@cvs.roobik.com.:/usr/local/cvsroot/freeware checkout Net-Ping cd Net-Ping The tarball can be created as follows: diff --git a/lib/Net/Ping/t/110_icmp_inst.t b/lib/Net/Ping/t/110_icmp_inst.t index b0ee1b74f3..cdb7219af9 100644 --- a/lib/Net/Ping/t/110_icmp_inst.t +++ b/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/lib/Net/Ping/t/150_syn_inst.t b/lib/Net/Ping/t/150_syn_inst.t new file mode 100644 index 0000000000..df85d460fe --- /dev/null +++ b/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/lib/Net/Ping/t/200_ping_tcp.t b/lib/Net/Ping/t/200_ping_tcp.t index 591c25166f..2ac2236acf 100644 --- a/lib/Net/Ping/t/200_ping_tcp.t +++ b/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/lib/Net/Ping/t/400_ping_syn.t b/lib/Net/Ping/t/400_ping_syn.t new file mode 100644 index 0000000000..3b84af78b1 --- /dev/null +++ b/lib/Net/Ping/t/400_ping_syn.t @@ -0,0 +1,94 @@ +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 servers are on + "www.geocities.com." => 1, + "www.freeservers.com." => 1, + "yahoo.com." => 1, + "www.yahoo.com." => 1, + "www.about.com." => 1, + "www.microsoft.com." => 1, +}; + +use strict; +use Test; +use Net::Ping; +plan tests => ((keys %{ $webs }) * 2 + 3); + +# Everything loaded fine +ok 1; + +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 + if ($p -> ping($host)) { + ok 1; + } else { + print STDERR "CANNOT RESOLVE $host\n"; + ok 0; + } +} + +while (my $host = $p->ack()) { + if ($webs->{$host}) { + ok 1; + } else { + print STDERR "SUPPOSED TO BE DOWN: http://$host/\n"; + ok 0; + } + delete $webs->{$host}; +} + +foreach my $host (keys %{ $webs }) { + if ($webs->{$host}) { + print STDERR "DOWN: http://$host/\n"; + ok 0; + } else { + ok 1; + } +} diff --git a/lib/Net/Ping/t/450_service.t b/lib/Net/Ping/t/450_service.t new file mode 100644 index 0000000000..7d19c76bb5 --- /dev/null +++ b/lib/Net/Ping/t/450_service.t @@ -0,0 +1,213 @@ +# Testing tcp_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; +use IO::Socket; + +# 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 => 37; + +# Everything loaded fine +ok 1; + +"0" =~ /(0)/; # IO::Socket::INET ephemeral buttwag hack + +# Start a tcp listen server on ephemeral port +my $sock1 = new IO::Socket::INET + LocalAddr => "127.1.1.1", + Proto => "tcp", + Listen => 8, + Reuse => 1, + Type => SOCK_STREAM, + ; + +# Make sure it worked. +ok !!$sock1; + +"0" =~ /(0)/; # IO::Socket::INET ephemeral buttwag hack + +# Start listening on another ephemeral port +my $sock2 = new IO::Socket::INET + LocalAddr => "127.2.2.2", + Proto => "tcp", + Listen => 8, + Reuse => 1, + Type => SOCK_STREAM, + ; + +# 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); + +# This is how it should be: +# 127.1.1.1:$port1 - service ON +# 127.2.2.2:$port2 - service ON +# 127.1.1.1:$port2 - service OFF +# 127.2.2.2:$port1 - 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->tcp_service_check(0); + +# Try on the first port +$p->{port_num} = $port1; + +# Make sure IP1 is reachable +ok $p -> ping("127.1.1.1"); + +# Make sure IP2 is reachable +ok $p -> ping("127.2.2.2"); + +# Try on the other port +$p->{port_num} = $port2; + +# Make sure IP1 is reachable +ok $p -> ping("127.1.1.1"); + +# Make sure IP2 is reachable +ok $p -> ping("127.2.2.2"); + + +# Enable service checking +$p->tcp_service_check(1); + +# Try on the first port +$p->{port_num} = $port1; + +# Make sure service on IP1 +ok $p -> ping("127.1.1.1"); + +# Make sure not service on IP2 +ok !$p -> ping("127.2.2.2"); + +# Try on the other port +$p->{port_num} = $port2; + +# Make sure not service on IP1 +ok !$p -> ping("127.1.1.1"); + +# Make sure service on IP2 +ok $p -> ping("127.2.2.2"); + + +##### +# Lastly, we test using the "syn" protocol. +$p = new Net::Ping "syn", 2; + +# new() worked? +ok !!$p; + +# Disable service checking +$p->tcp_service_check(0); + +# Try on the first port +$p->{port_num} = $port1; + +# Send SYN to both IPs +ok $p -> ping("127.1.1.1"); +ok $p -> ping("127.2.2.2"); + +# Both IPs should be reachable +ok $p -> ack(); +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->tcp_service_check(0); + +# Try on the other port +$p->{port_num} = $port2; + +# Send SYN to both IPs +ok $p -> ping("127.1.1.1"); +ok $p -> ping("127.2.2.2"); + +# Both IPs should be reachable +ok $p -> ack(); +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->tcp_service_check(1); + +# Try on the first port +$p->{port_num} = $port1; + +# Send SYN to both IPs +ok $p -> ping("127.1.1.1"); +ok $p -> ping("127.2.2.2"); + +# Only IP1 should have service +ok "127.1.1.1",$p -> ack(); +# 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->tcp_service_check(1); + +# Try on the other port +$p->{port_num} = $port2; + +# Send SYN to both IPs +ok $p -> ping("127.1.1.1"); +ok $p -> ping("127.2.2.2"); + +# Only IP2 should have service +ok "127.2.2.2",$p -> ack(); +# No more good sockets? +ok !$p -> ack(); diff --git a/lib/Net/hostent.pm b/lib/Net/hostent.pm index 04cbee35a7..7cff370be6 100644 --- a/lib/Net/hostent.pm +++ b/lib/Net/hostent.pm @@ -70,7 +70,7 @@ Net::hostent - by-name interface to Perl's built-in gethost*() functions =head1 SYNOPSIS - use Net::hostnet; + use Net::hostent; =head1 DESCRIPTION diff --git a/lib/Net/t/hostname.t b/lib/Net/t/hostname.t index e085591754..7e94b23234 100644 --- a/lib/Net/t/hostname.t +++ b/lib/Net/t/hostname.t @@ -32,11 +32,11 @@ else { print "not ok 1\n"; } -# This check thats hostanme does not overwrite $_ +# This checks that hostname does not overwrite $_ my @domain = qw(foo.example.com bar.example.jp); my @copy = @domain; -my @dummy = grep { hostname eq $_ } @domain; +my @dummy = grep { hostname && $_ } @domain; ($domain[0] && $domain[0] eq $copy[0]) ? print "ok 2\n" diff --git a/lib/Pod/Functions.pm b/lib/Pod/Functions.pm index 7f7e15060a..99727b7fe9 100644 --- a/lib/Pod/Functions.pm +++ b/lib/Pod/Functions.pm @@ -7,7 +7,7 @@ Pod::Functions - Group Perl's functions a la perlfunc.pod =head1 SYNOPSIS - use Pod:Functions; + use Pod::Functions; my @misc_ops = @{ $Kinds{ 'Misc' } }; my $misc_dsc = $Type_Description{ 'Misc' }; @@ -54,6 +54,9 @@ L<perlfunc/"Perl Functions by Category"> section. =head1 CHANGES +1.02 20020813 <abe@ztreet.demon.nl> + de-typo in the SYNOPSIS section (thanks Mike Castle for noticing) + 1.01 20011229 <abe@ztreet.demon.nl> fixed some bugs that slipped in after 5.6.1 added the pod @@ -64,7 +67,7 @@ L<perlfunc/"Perl Functions by Category"> section. =cut -our $VERSION = '1.01'; +our $VERSION = '1.02'; require Exporter; diff --git a/lib/Pod/Html.pm b/lib/Pod/Html.pm index eebc4dbf3b..61152afef3 100644 --- a/lib/Pod/Html.pm +++ b/lib/Pod/Html.pm @@ -1336,23 +1336,25 @@ sub process_pre { my $any = "${ltrs}${gunk}${punc}"; $rest =~ s{ - \b # start at word boundary - ( # begin $1 { - $urls : # need resource and a colon - (?!:) # Ignore File::, among others. - [$any] +? # followed by one or more of any valid - # character, but be conservative and - # take only what you need to.... - ) # end $1 } - (?= # look-ahead non-consumptive assertion - [$punc]* # either 0 or more punctuation - (?: # followed - [^$any] # by a non-url char - | # or - $ # end of the string - ) # - | # or else - $ # then end of the string + \b # start at word boundary + ( # begin $1 { + $urls : # need resource and a colon + (?!:) # Ignore File::, among others. + [$any] +? # followed by one or more of any valid + # character, but be conservative and + # take only what you need to.... + ) # end $1 } + (?= + " > # maybe pre-quoted '<a href="...">' + | # or: + [$punc]* # 0 or more punctuation + (?: # followed + [^$any] # by a non-url char + | # or + $ # end of the string + ) # + | # or else + $ # then end of the string ) }{<a href="$1">$1</a>}igox; diff --git a/lib/Pod/Text.pm b/lib/Pod/Text.pm index 3325e950cc..1028f2e9e1 100644 --- a/lib/Pod/Text.pm +++ b/lib/Pod/Text.pm @@ -1,5 +1,5 @@ # Pod::Text -- Convert POD data to formatted ASCII text. -# $Id: Text.pm,v 2.20 2002/07/15 05:46:00 eagle Exp $ +# $Id: Text.pm,v 2.21 2002/08/04 03:34:58 eagle Exp $ # # Copyright 1999, 2000, 2001, 2002 by Russ Allbery <rra@stanford.edu> # @@ -43,7 +43,7 @@ use vars qw(@ISA @EXPORT %ESCAPES $VERSION); # Don't use the CVS revision as the version, since this module is also in Perl # core and too many things could munge CVS magic revision strings. This # number should ideally be the same as the CVS revision in podlators, however. -$VERSION = 2.20; +$VERSION = 2.21; ############################################################################## @@ -177,6 +177,7 @@ sub initialize { $$self{alt} = 0 unless defined $$self{alt}; $$self{indent} = 4 unless defined $$self{indent}; + $$self{margin} = 0 unless defined $$self{margin}; $$self{loose} = 0 unless defined $$self{loose}; $$self{sentence} = 0 unless defined $$self{sentence}; $$self{width} = 76 unless defined $$self{width}; @@ -195,8 +196,11 @@ sub initialize { croak qq(Invalid quote specification "$$self{quotes}"); } - $$self{INDENTS} = []; # Stack of indentations. - $$self{MARGIN} = $$self{indent}; # Current left margin in spaces. + # Stack of indentations. + $$self{INDENTS} = []; + + # Current left margin. + $$self{MARGIN} = $$self{indent} + $$self{margin}; $self->SUPER::initialize; @@ -496,10 +500,12 @@ sub heading { $text = $self->interpolate ($text, $line); if ($$self{alt}) { my $closemark = reverse (split (//, $marker)); - $self->output ("\n" . "$marker $text $closemark" . "\n\n"); + my $margin = ' ' x $$self{margin}; + $self->output ("\n" . "$margin$marker $text $closemark" . "\n\n"); } else { $text .= "\n" if $$self{loose}; - $self->output (' ' x $indent . $text . "\n"); + my $margin = ' ' x ($$self{margin} + $indent); + $self->output ($margin . $text . "\n"); } } @@ -526,12 +532,12 @@ sub item { undef $$self{ITEM}; my $indent = $$self{INDENTS}[-1]; unless (defined $indent) { $indent = $$self{indent} } - my $space = ' ' x $indent; - $space =~ s/^ /:/ if $$self{alt}; + my $margin = ' ' x $$self{margin}; if (!$_ || /^\s+$/ || ($$self{MARGIN} - $indent < length ($tag) + 1)) { - my $margin = $$self{MARGIN}; + my $realindent = $$self{MARGIN}; $$self{MARGIN} = $indent; my $output = $self->reformat ($tag); + $output =~ s/^$margin /$margin:/ if ($$self{alt} && $indent > 0); $output =~ s/\n*$/\n/; # If the text is just whitespace, we have an empty item paragraph; @@ -541,11 +547,13 @@ sub item { $output .= "\n" if $_ && $_ =~ /^\s*$/; $self->output ($output); - $$self{MARGIN} = $margin; + $$self{MARGIN} = $realindent; $self->output ($self->reformat ($_)) if $_ && /\S/; } else { + my $space = ' ' x $indent; + $space =~ s/^$margin /$margin:/ if $$self{alt}; $_ = $self->reformat ($_); - s/^ /:/ if ($$self{alt} && $indent > 0); + s/^$margin /$margin:/ if ($$self{alt} && $indent > 0); my $tagspace = ' ' x length $tag; s/^($space)$tagspace/$1$tag/ or warn "Bizarre space in item"; $self->output ($_); @@ -716,6 +724,13 @@ 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 margin + +The width of the left margin in spaces. Defaults to 0. This is the margin +for all text, including headings, not the amount by which regular text is +indented; for the latter, see the I<indent> option. To set the right +margin, see the I<width> option. + =item quotes Sets the quote marks used to surround CE<lt>> text. If the value is a diff --git a/lib/Pod/Text/Overstrike.pm b/lib/Pod/Text/Overstrike.pm index 503f4003ad..8ba918396c 100644 --- a/lib/Pod/Text/Overstrike.pm +++ b/lib/Pod/Text/Overstrike.pm @@ -1,5 +1,5 @@ # Pod::Text::Overstrike -- Convert POD data to formatted overstrike text -# $Id: Overstrike.pm,v 1.9 2002/07/15 05:46:00 eagle Exp $ +# $Id: Overstrike.pm,v 1.10 2002/08/04 03:35:01 eagle Exp $ # # Created by Joe Smith <Joe.Smith@inwap.com> 30-Nov-2000 # (based on Pod::Text::Color by Russ Allbery <rra@stanford.edu>) @@ -36,7 +36,7 @@ use vars qw(@ISA $VERSION); # Don't use the CVS revision as the version, since this module is also in Perl # core and too many things could munge CVS magic revision strings. This # number should ideally be the same as the CVS revision in podlators, however. -$VERSION = 1.09; +$VERSION = 1.10; ############################################################################## @@ -85,7 +85,8 @@ sub heading { my ($self, $text, $line, $indent, $marker) = @_; $self->item ("\n\n") if defined $$self{ITEM}; $text .= "\n" if $$self{loose}; - $self->output (' ' x $indent . $text . "\n"); + my $margin = ' ' x ($$self{margin} + $indent); + $self->output ($margin . $text . "\n"); } # Fix the various formatting codes. diff --git a/lib/Pod/Usage.pm b/lib/Pod/Usage.pm index 771cff451c..9898a97c00 100644 --- a/lib/Pod/Usage.pm +++ b/lib/Pod/Usage.pm @@ -506,7 +506,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/lib/Pod/t/basic.t b/lib/Pod/t/basic.t index eb6db54f30..a61b4bf07f 100644 --- a/lib/Pod/t/basic.t +++ b/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/lib/Pod/t/htmlview.pod b/lib/Pod/t/htmlview.pod index 62ac71ced4..3ac378987e 100644 --- a/lib/Pod/t/htmlview.pod +++ b/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/lib/Pod/t/htmlview.t b/lib/Pod/t/htmlview.t index a36b58aee3..689f6d5039 100644 --- a/lib/Pod/t/htmlview.t +++ b/lib/Pod/t/htmlview.t @@ -163,6 +163,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 <a href="<a href="http://perl.org">http://perl.org</a>"> Perl </a></pre> <p> </p> <hr /> diff --git a/lib/Pod/t/text-options.t b/lib/Pod/t/text-options.t new file mode 100644 index 0000000000..b398fcf922 --- /dev/null +++ b/lib/Pod/t/text-options.t @@ -0,0 +1,144 @@ +#!/usr/bin/perl -w +# $Id: text-options.t,v 1.2 2002/08/04 03:38:24 eagle 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/lib/Shell.pm b/lib/Shell.pm index 9762a3aa0b..81b25985a5 100644 --- a/lib/Shell.pm +++ b/lib/Shell.pm @@ -30,6 +30,7 @@ sub AUTOLOAD { $cmd =~ s/^.*:://; eval <<"*END*"; sub $AUTOLOAD { + shift if ref \$_[0] && \$_[0]->isa( 'Shell' ); if (\@_ < 1) { \$Shell::capture_stderr ? `$cmd 2>&1` : `$cmd`; } elsif ('$^O' eq 'os2') { diff --git a/lib/Shell.t b/lib/Shell.t index b2d3d67aa0..c7c45d3f2c 100644 --- a/lib/Shell.t +++ b/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 :( # 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/lib/Term/Cap.pm b/lib/Term/Cap.pm index 03d2573d85..1deadc5504 100644 --- a/lib/Term/Cap.pm +++ b/lib/Term/Cap.pm @@ -6,7 +6,7 @@ use strict; use vars qw($VERSION $VMS_TERMCAP); use vars qw($termpat $state $first $entry); -$VERSION = '1.07'; +$VERSION = '1.08'; # Version undef: Thu Dec 14 20:02:42 CST 1995 by sanders@bsdi.com # Version 1.00: Thu Nov 30 23:34:29 EST 2000 by schwern@pobox.com @@ -29,6 +29,8 @@ $VERSION = '1.07'; # Version 1.07: Wed Jan 2 21:35:09 GMT 2002 # Sanity check on infocmp output from Norton Allen # Repaired INSTALLDIRS thanks to Michael Schwern +# Version 1.08: Fri Aug 30 14:15:55 CEST 2002 +# Cope with comments lines from 'infocmp' from Brendan O'Dea # TODO: # support Berkeley DB termcaps @@ -217,9 +219,9 @@ sub Tgetent { ## public -- static method } else { if ( grep { -x "$_/infocmp" } split /:/, $ENV{PATH} ) { - eval - { + eval { my $tmp = `infocmp -C 2>/dev/null`; + $tmp =~ s/^#.*\n//gm; # remove comments if (( $tmp !~ m%^/%s ) && ( $tmp =~ /(^|\|)${termpat}[:|]/s)) { $entry = $tmp; diff --git a/lib/Term/ReadLine.pm b/lib/Term/ReadLine.pm index 8c58694fd8..477aa43eef 100644 --- a/lib/Term/ReadLine.pm +++ b/lib/Term/ReadLine.pm @@ -1,7 +1,7 @@ =head1 NAME -Term::ReadLine - Perl interface to various C<readline> packages. If -no real package is found, substitutes stubs instead of basic functions. +Term::ReadLine - Perl interface to various C<readline> packages. +If no real package is found, substitutes stubs instead of basic functions. =head1 SYNOPSIS diff --git a/lib/Test.pm b/lib/Test.pm index d497217ff1..f0410f9e13 100644 --- a/lib/Test.pm +++ b/lib/Test.pm @@ -1,12 +1,13 @@ -package Test; require 5.004; +package Test; +# Time-stamp: "2002-10-11 17:38:48 MDT" 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.23'; 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 verison $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 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/lib/Test/Builder.pm b/lib/Test/Builder.pm index 06543e696e..6f3edd8cce 100644 --- a/lib/Test/Builder.pm +++ b/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/lib/Test/More.pm b/lib/Test/More.pm index 9be5ea8b92..d82f81d0fe 100644 --- a/lib/Test/More.pm +++ b/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/lib/Test/Simple.pm b/lib/Test/Simple.pm index 464fffd782..563528bc15 100644 --- a/lib/Test/Simple.pm +++ b/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/lib/Test/Simple/Changes b/lib/Test/Simple/Changes index 0591a7e435..272b07e649 100644 --- a/lib/Test/Simple/Changes +++ b/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/lib/Test/Simple/t/details.t b/lib/Test/Simple/t/details.t new file mode 100644 index 0000000000..65dcf8d154 --- /dev/null +++ b/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/lib/Test/Simple/t/exit.t b/lib/Test/Simple/t/exit.t index 1367bbfdcd..0ba76ba5de 100644 --- a/lib/Test/Simple/t/exit.t +++ b/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/lib/Test/Simple/t/fork.t b/lib/Test/Simple/t/fork.t new file mode 100644 index 0000000000..ca103b1ca6 --- /dev/null +++ b/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/lib/Test/Simple/t/has_plan.t b/lib/Test/Simple/t/has_plan.t new file mode 100644 index 0000000000..d3f888f2a5 --- /dev/null +++ b/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/lib/Test/Simple/t/has_plan2.t b/lib/Test/Simple/t/has_plan2.t new file mode 100644 index 0000000000..2b9ac499da --- /dev/null +++ b/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/lib/Test/Simple/t/ok_obj.t b/lib/Test/Simple/t/ok_obj.t new file mode 100644 index 0000000000..8678dbff8d --- /dev/null +++ b/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/lib/Test/Simple/t/plan.t b/lib/Test/Simple/t/plan.t index c2bf27a37e..fa46744b06 100644 --- a/lib/Test/Simple/t/plan.t +++ b/lib/Test/Simple/t/plan.t @@ -1,3 +1,5 @@ +#!/usr/bin/perl -w + BEGIN { if( $ENV{PERL_CORE} ) { chdir 't'; diff --git a/lib/Test/Simple/t/threads.t b/lib/Test/Simple/t/threads.t index 4212cccb77..5670bda25b 100644 --- a/lib/Test/Simple/t/threads.t +++ b/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/lib/Test/Tutorial.pod b/lib/Test/Tutorial.pod index e07ca325f3..a57d04769e 100644 --- a/lib/Test/Tutorial.pod +++ b/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/lib/Test/t/fail.t b/lib/Test/t/fail.t index ce37464d04..9051a1f481 100644 --- a/lib/Test/t/fail.t +++ b/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/lib/Test/t/mix.t b/lib/Test/t/mix.t index a746ba66b5..5298338318 100644 --- a/lib/Test/t/mix.t +++ b/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/lib/Test/t/todo.t b/lib/Test/t/todo.t index 2f179e4547..74f9aefb8b 100644 --- a/lib/Test/t/todo.t +++ b/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/lib/Text/TabsWrap/t/wrap.t b/lib/Text/TabsWrap/t/wrap.t index fee6ce070d..369512d27e 100755 --- a/lib/Text/TabsWrap/t/wrap.t +++ b/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/lib/Text/Wrap.pm b/lib/Text/Wrap.pm index 8dd1f6c251..2327666038 100644 --- a/lib/Text/Wrap.pm +++ b/lib/Text/Wrap.pm @@ -34,6 +34,7 @@ sub wrap my $t = expand(join("", (map { /\s+\z/ ? ( $_ ) : ($_, ' ') } @t), $tail)); my $lead = $ip; my $ll = $columns - length(expand($ip)) - 1; + $ll = 0 if $ll < 0; my $nll = $columns - length(expand($xp)) - 1; my $nl = ""; my $remainder = ""; @@ -144,7 +145,7 @@ B<Example 3> C<Text::Wrap::wrap()> is a very simple paragraph formatter. It formats a single paragraph at a time by breaking lines at word boundries. Indentation is controlled for the first line (C<$initial_tab>) and -all subsquent lines (C<$subsequent_tab>) independently. Please note: +all subsequent lines (C<$subsequent_tab>) independently. Please note: C<$initial_tab> and C<$subsequent_tab> are the literal strings that will be used: it is unlikley you would want to pass in a number. diff --git a/lib/Tie/Array.pm b/lib/Tie/Array.pm index 6fdd258953..53c1ba759b 100644 --- a/lib/Tie/Array.pm +++ b/lib/Tie/Array.pm @@ -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/lib/Unicode/Collate.pm b/lib/Unicode/Collate.pm index 51c290ec87..5193559105 100644 --- a/lib/Unicode/Collate.pm +++ b/lib/Unicode/Collate.pm @@ -14,7 +14,11 @@ use File::Spec; require Exporter; -our $VERSION = '0.12'; +# Supporting on EBCDIC platform is not tested. +# Tester(s) welcome! +our $IsEBCDIC = ord("A") != 0x41; + +our $VERSION = '0.23'; our $PACKAGE = __PACKAGE__; our @ISA = qw(Exporter); @@ -36,7 +40,6 @@ unless ($@) { 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'; @@ -46,55 +49,146 @@ else { # XXX, Perl 5.6.1 } } -our $getCombinClass; # coderef for combining class from Unicode::Normalize - -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 - +# 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 $getCombinClass; + +# Minimum weights at level 2 and 3, respectively +use constant Min2 => 0x20; +use constant Min3 => 0x02; + +# Shifted weight at 4th level +use constant Shift4 => 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 Var1 => -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'; + +# Unicode encoding of strings to be collated +# TODO: 'N*' for UTF-32BE, 'V*' for UTF-32LE. +use constant UTF_TEMPLATE => 'U*'; + +# 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 + +# Logical_Order_Exception in PropList.txt +# TODO: synchronization with change of PropList.txt. our $DefaultRearrange = [ 0x0E40..0x0E44, 0x0EC0..0x0EC4 ]; -sub UCA_Version { "8.0" } +sub UCA_Version { "9" } sub Base_Unicode_Version { $UNICODE_VERSION || 'unknown' } -## -## constructor -## -sub new -{ - my $class = shift; - my $self = bless { @_ }, $class; - - # alternate lowercased - $self->{alternate} = - ! exists $self->{alternate} ? 'shifted' : lc($self->{alternate}); - - 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'; - - # collation level - $self->{level} ||= 4; +my (%AlternateOK); +@AlternateOK{ qw/ + blanked non-ignorable shifted shift-trimmed + / } = (); + +our @ChangeOK = qw/ + alternate backwards level normalization rearrange + katakana_before_hiragana upper_before_lower + overrideHangul overrideCJK preprocess UCA_Version + /; + +our @ChangeNG = qw/ + entry entries table combining maxlength + ignoreChar ignoreName undefChar undefName + versionTable alternateTable backwardsTable forwardsTable rearrangeTable + derivCode normCode rearrangeHash L3_ignorable + /; +# The hash key 'ignored' is deleted at VERSION 0.21. +# The hash key 'isShift' are deleted at VERSION 0.23. + +my (%ChangeOK, %ChangeNG); +@ChangeOK{ @ChangeOK } = (); +@ChangeNG{ @ChangeNG } = (); + +sub change { + my $self = shift; + my %hash = @_; + my %old; + 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 checkCollator { + my $self = shift; 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}; - # overrideHangul and -CJK - # If true: CODEREF used; '': default; undef: derived elements - $self->{overrideHangul} = '' - if ! exists $self->{overrideHangul}; - $self->{overrideCJK} = '' - if ! exists $self->{overrideCJK}; + $self->{derivCode} = + $self->{UCA_Version} == 8 ? \&_derivCE_8 : + $self->{UCA_Version} == 9 ? \&_derivCE_9 : + croak "Illegal UCA version (passed $self->{UCA_Version})."; - # normalization form - $self->{normalization} = 'D' - if ! exists $self->{normalization}; - $self->{UNF} = undef; + $self->{alternate} = lc($self->{alternate}); + croak "$PACKAGE unknown alternate tag name: $self->{alternate}" + unless exists $AlternateOK{ $self->{alternate} }; + + $self->{backwards} = [] + if ! defined $self->{backwards}; + $self->{backwards} = [ $self->{backwards} ] + if ! ref $self->{backwards}; + + $self->{rearrange} = [] + if ! defined $self->{rearrange}; + croak "$PACKAGE: A list for rearrangement must be store in an ARRAYREF" + if ! ref $self->{rearrange}; + + # keys of $self->{rearrangeHash} are $self->{rearrange}. + $self->{rearrangeHash} = undef; + + if (@{ $self->{rearrange} }) { + @{ $self->{rearrangeHash} }{ @{ $self->{rearrange} } } = (); + } + + $self->{normCode} = undef; if (defined $self->{normalization}) { eval { require Unicode::Normalize }; @@ -105,7 +199,7 @@ sub new $getCombinClass = \&Unicode::Normalize::getCombinClass if ! $getCombinClass; - $self->{UNF} = + $self->{normCode} = $self->{normalization} =~ /^(?:NF)?C$/ ? \&NFC : $self->{normalization} =~ /^(?:NF)?D$/ ? \&NFD : $self->{normalization} =~ /^(?:NF)?KC$/ ? \&NFKC : @@ -113,37 +207,39 @@ sub new croak "$PACKAGE unknown normalization form name: " . $self->{normalization}; } + 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} ||= 4; + $self->{UCA_Version} ||= UCA_Version(); - # rearrange - $self->{rearrange} = $DefaultRearrange + $self->{overrideHangul} = '' + if ! exists $self->{overrideHangul}; + $self->{overrideCJK} = '' + if ! exists $self->{overrideCJK}; + $self->{normalization} = 'D' + if ! exists $self->{normalization}; + $self->{alternate} = $self->{alternateTable} || 'shifted' + if ! exists $self->{alternate}; + $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 +255,20 @@ 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 (/^\s*\@alternate\s+(\S*)/) { + $self->{alternateTable} ||= $1; } - elsif (/^\@alternate\s+(.*)/) { - $self->{alternate} ||= $1; + elsif (/^\s*\@backwards\s+(\S*)/) { + push @{ $self->{backwardsTable} }, $1; } - elsif (/^\@backwards\s+(.*)/) { - push @{ $self->{backwards} }, $1; + elsif (/^\s*\@forwards\s+(\S*)/) { # parhaps no use + push @{ $self->{forwardsTable} }, $1; } - elsif (/^\@rearrange\s+(.*)/) { - push @{ $self->{rearrange} }, _getHexArray($1); + elsif (/^\s*\@rearrange\s+(.*)/) { # (\S*) is NG + push @{ $self->{rearrangeTable} }, _getHexArray($1); } next; } @@ -186,7 +285,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 +299,138 @@ 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 + + if (defined $self->{undefChar} || defined $self->{ignoreChar}) { + # Do not use UTF_TEMPLATE; Perl' RE is only for utf8. + my $ele = $IsEBCDIC + ? pack('U*', map utf8::unicode_to_native($_), @uv) + : pack('U*', @uv); + + # regarded as if it were not entried in the table + return + if defined $self->{undefChar} && $ele =~ /$self->{undefChar}/; - # get sort key - if (defined $self->{ignoreName} && $name =~ /$self->{ignoreName}/ || - defined $self->{ignoreChar} && $ele =~ /$self->{ignoreChar}/) - { - $self->{entries}{$ele} = $self->{ignored}{$ele} = 1; + # 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 $combining = TRUE; # primary = 0, secondary != 0; + my $is_L3_ignorable; + + 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); + $combining = FALSE + unless $wt[0] == 0 && $wt[1] != 0; + $is_L3_ignorable = TRUE + if $wt[0] + $wt[1] + $wt[2] == 0; + # if $arr !~ /[1-9A-Fa-f]/; NG + # Conformance Test shows L3-ignorable is completely ignorable. } - $self->{maxlength}{ord $ele} = scalar @e if @e > 1; -} + $self->{entries}{$entry} = \@key; + + $self->{combining}{$entry} = TRUE + if $combining; + + # The key is a string representing a numeral code point. + + $self->{L3_ignorable}{$uv[0]} = TRUE + if @uv == 1 && $is_L3_ignorable; + + # Contraction is to be considered in the range of this maxlength. + $self->{maxlength}{$uv[0]} = scalar @uv + if @uv > 1; +} ## -## arrayref CE = altCE(bool variable?, list[num] weights) +## arrayref[weights] = altCE(bool variable?, list[num] weights) ## sub altCE { my $self = shift; - my $var = shift; - my @c = @_; + my($var, @wt) = unpack(VCE_TEMPLATE, shift); $self->{alternate} eq 'blanked' ? - $var ? [0,0,0,$c[3]] : \@c : + $var ? [Var1, 0, 0, $wt[3]] : \@wt : $self->{alternate} eq 'non-ignorable' ? - \@c : + \@wt : $self->{alternate} eq 'shifted' ? - $var ? [0,0,0,$c[0] ] : [ @c[0..2], $c[0]+$c[1]+$c[2] ? 0xFFFF : 0 ] : + $var ? [Var1, 0, 0, $wt[0] ] + : [ @wt[0..2], $wt[0]+$wt[1]+$wt[2] ? Shift4 : 0 ] : $self->{alternate} eq 'shift-trimmed' ? - $var ? [0,0,0,$c[0] ] : [ @c[0..2], 0 ] : + $var ? [Var1, 0, 0, $wt[0] ] : [ @wt[0..2], 0 ] : croak "$PACKAGE unknown alternate name: $self->{alternate}"; } -## -## string hex_sortkey = splitCE(string arg) -## sub viewSortKey { my $self = shift; + my $ver = $self->{UCA_Version}; + my $key = $self->getSortKey(@_); - my $view = join " ", map sprintf("%04X", $_), unpack 'n*', $key; - $view =~ s/ ?0000 ?/|/g; + my $view = join " ", map sprintf("%04X", $_), unpack(KEY_TEMPLATE, $key); + + if ($ver <= 8) { + $view =~ s/ ?0000 ?/|/g; + } else { + $view =~ s/\b0000\b/|/g; + } return "[$view]"; } ## -## list[strings] elements = splitCE(string arg) +## arrayref of JCPS = splitCE(string to be collated) +## arrayref of arrayref[JCPS, ini_pos, fin_pos] = splitCE(string, true) ## sub splitCE { my $self = shift; + my $wLen = $_[1]; + my $code = $self->{preprocess}; - my $norm = $self->{UNF}; + my $norm = $self->{normCode}; my $ent = $self->{entries}; my $max = $self->{maxlength}; my $reH = $self->{rearrangeHash}; + my $ign = $self->{L3_ignorable}; + my $ver9 = $self->{UCA_Version} > 8; - my $str = ref $code ? &$code(shift) : shift; - $str = &$norm($str) if ref $norm; + my ($str, @buf); - my @src = unpack('U*', $str); - my @buf; + 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; + } - # rearrangement - if ($reH) { + # get array of Unicode code point of string. + my @src = $IsEBCDIC + ? map(utf8::native_to_unicode($_), unpack UTF_TEMPLATE, $str) + : unpack(UTF_TEMPLATE, $str); + + # 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,168 +439,104 @@ 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 $ce = $src[$i]; + + if ($max->{$ce}) { # contract + my $temp_ce = $ce; + + for (my $p = $i + 1; $p < @src; $p++) { + next if ! defined $src[$p]; + $temp_ce .= CODE_SEP . $src[$p]; + if ($ent->{$temp_ce}) { + $ce = $temp_ce; + $i = $p; + } + } + } + + # with Combining Char (UTS#10, 4.2.1). + # requires Unicode::Normalize. + # Not be $wLen, as not croaked due to $norm. + if ($getCombinClass) { + for (my $p = $i + 1; $p < @src; $p++) { + next if ! defined $src[$p]; + last unless $getCombinClass->($src[$p]); + my $tail = CODE_SEP . $src[$p]; + if ($ent->{$ce.$tail}) { + $ce .= $tail; + $src[$p] = undef; + } } - } 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 ? [$ce, $i_orig, $i + 1] : $ce; } - 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 $ce = 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 $der = $self->{derivCode}; + + return if !defined $ce; + return map($self->altCE($_), @{ $ent->{$ce} }) + if $ent->{$ce}; + + # CE must not be a contraction, then it's a code point. + my $u = $ce; + + if (0xAC00 <= $u && $u <= 0xD7A3) { # is Hangul Syllale + return map $self->altCE($_), + $hang + ? map(pack(VCE_TEMPLATE, NON_VAR, @$_), &$hang($u)) + : defined $hang + ? map({ + $ent->{$_} ? @{ $ent->{$_} } : $der->($_); + } _decompHangul($u)) + : $der->($u); } 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)); + 0x20000 <= $u && $u <= 0x2A6D6) { # CJK Ideograph + return map $self->altCE($_), + $cjk + ? map(pack(VCE_TEMPLATE, NON_VAR, @$_), &$cjk($u)) + : defined $cjk && $self->{UCA_Version} <= 8 && $u < 0x10000 + ? pack(VCE_TEMPLATE, NON_VAR, $u, Min2, Min3, $u) + : $der->($u); } else { - return map($self->altCE(0,@$_), _derivCE($u)); + return map $self->altCE($_), $der->($u); } } -## -## int = index(string, substring) -## -sub index -{ - 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 @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]; - - # /*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". - - # 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 @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; - } - } - 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]; - } - } - 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) @@ -456,16 +545,30 @@ sub getSortKey { my $self = shift; my $lev = $self->{level}; - my $rCE = $self->splitCE(shift); # get an arrayref + my $rCE = $self->splitCE(shift); # get an arrayref of JCPS + my $ver9 = $self->{UCA_Version} > 8; + my $v2i = $self->{alternate} ne 'non-ignorable'; # weight arrays - my @buf = grep defined(), map $self->getWt($_), @$rCE; + my (@buf, $last_is_variable); + + foreach my $wt (map $self->getWt($_), @$rCE) { + if ($v2i && $ver9) { + if ($wt->[0] == 0) { # ignorable + next if $last_is_variable; + } else { + $last_is_variable = ($wt->[0] == Var1); + } + } + push @buf, $wt; + } # 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} }) { @@ -488,7 +591,7 @@ sub getSortKey elsif (0x0D <= $_ && $_ <= 0x0E) { $_ += 5 } # hiragana } } - join "\0\0", map pack('n*', @$_), @ret; + join LEVEL_SEP, map pack(KEY_TEMPLATE, @$_), @ret; } @@ -514,16 +617,30 @@ sub sort { map [ $obj->getSortKey($_), $_ ], @_; } -## -## list[arrayrefs] CE = _derivCE(int codepoint) -## -sub _derivCE { + +sub _derivCE_9 { + my $u = shift; + my $base = + (0x4E00 <= $u && $u <= 0x9FA5) + ? 0xFB40 : # CJK + (0x3400 <= $u && $u <= 0x4DB5 || 0x20000 <= $u && $u <= 0x2A6D6) + ? 0xFB80 # CJK ext. + : 0xFBC0; # others + + my $aaaa = $base + ($u >> 15); + my $bbbb = ($u & 0x7FFF) | 0x8000; + return + pack(VCE_TEMPLATE, NON_VAR, $aaaa, Min2, Min3, $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); } ## @@ -532,7 +649,7 @@ sub _derivCE { 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 { @@ -548,6 +665,253 @@ sub _decompHangul { ); } +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 + ; +} + + +## +## bool _nonIgnorAtLevel(arrayref weights, int level) +## +sub _nonIgnorAtLevel($$) +{ + my $wt = shift; + return if ! defined $wt; + my $lv = shift; + return grep($wt->[$_] != 0, 0..$lv-1) ? 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 $subCE = $self->splitCE(shift); + my $pos = @_ ? shift : 0; + $pos = 0 if $pos < 0; + my $grob = shift; + + my $comb = $self->{combining}; + my $lev = $self->{level}; + my $ver9 = $self->{UCA_Version} > 8; + my $v2i = $self->{alternate} ne 'non-ignorable'; + + if (! @$subCE) { + 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 $strCE = $self->splitCE($pos ? substr($str, $pos) : $str, TRUE); + if (! @$strCE) { + return wantarray ? () : NOMATCHPOS; + } + my $last_is_variable; + my(@strWt, @iniPos, @finPos, @subWt, @g_ret); + + $last_is_variable = FALSE; + for my $wt (map $self->getWt($_), @$subCE) { + 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] == Var1); + } + } + + if (@subWt && $wt->[0] == 0) { + push @{ $subWt[-1] }, $wt if $to_be_pushed; + } else { + $wt->[0] = 0 if $wt->[0] == Var1; + push @subWt, [ $wt ]; + } + } + + my $count = 0; + my $end = @$strCE - 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($strCE->[$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] == Var1); + } + } + + if (@strWt && $wt->[0] == 0) { + push @{ $strWt[-1] }, $wt if $to_be_pushed; + $finPos[-1] = $strCE->[$i][2]; + } elsif ($to_be_pushed) { + $wt->[0] = 0 if $wt->[0] == Var1; + push @strWt, [ $wt ]; + push @iniPos, $found_base ? NOMATCHPOS : $strCE->[$i][1]; + $finPos[-1] = NOMATCHPOS if $found_base; + push @finPos, $strCE->[$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__ @@ -570,11 +934,16 @@ Unicode::Collate - Unicode Collation Algorithm =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( + UCA_Version => $UCA_Version, alternate => $alternate, backwards => $levelNumber, # or \@levelNumbers entry => $element, @@ -597,9 +966,22 @@ The C<new> method returns a collator object. =over 4 +=item UCA_Version + +If the version number of the older UCA is given, +the older behavior of that version is emulated on collating. +If omitted, the return value of C<UCA_Version()> is used. + +The supported version: 8 or 9. + +B<This parameter may be removed in the future version, +as switching the algorithm would affect the performance.> + =item alternate --- see 3.2.2 Alternate Weighting, UTR #10. +-- see 3.2.2 Variable Weighting, UTS #10. + +(the title in UCA version 8: Alternate Weighting) This key allows to alternate weighting for variable collation elements, which are marked with an ASTERISK in the table @@ -610,12 +992,12 @@ which are marked with an ASTERISK in the table These names are case-insensitive. By default (if specification is omitted), 'shifted' is adopted. - 'Blanked' Variable elements are ignorable at levels 1 through 3; + '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 ignorable at levels 1 through 3 + '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. @@ -624,7 +1006,7 @@ By default (if specification is omitted), 'shifted' is adopted. =item backwards --- see 3.1.2 French Accents, UTR #10. +-- see 3.1.2 French Accents, UTS #10. backwards => $levelNumber or \@levelNumbers @@ -633,7 +1015,7 @@ 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 @@ -643,22 +1025,26 @@ 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 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. @@ -674,7 +1060,7 @@ 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). @@ -696,7 +1082,7 @@ see B<CAVEAT>. =item overrideCJK --- see 7.1 Derived Collation Elements, UTR #10. +-- see 7.1 Derived Collation Elements, UTS #10. By default, mapping of CJK Unified Ideographs uses the Unicode codepoint order. @@ -726,7 +1112,7 @@ in table or L<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. @@ -745,7 +1131,7 @@ in table or L<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. @@ -761,7 +1147,7 @@ Then, "the pen" is before "a pencil". =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,9 +1158,12 @@ 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. @@ -803,7 +1192,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 +1208,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. @@ -829,9 +1218,9 @@ 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. +should be same as those mentioned in 7.3.1, UTS #10. If you define your collation elements which violates this, -these tags doesn't work validly. +these tags don't work validly. =back @@ -872,7 +1261,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 +1276,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 + + (If C<UCA_Version> is 8, the output is slightly different.) -=item C<$position = $Collator-E<gt>index($string, $substring)> +=back + +=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 the C<rearrange> tag is neglected.) -=item C<($position, $length) = $Collator-E<gt>index($string, $substring)> +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 --- see 6.8 Searching, UTR #10. +=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 +1319,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,10 +1406,37 @@ is primary equal to C<"m>E<252>C<ss">. =over 4 +=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 + + $Collator->eq("perl", "PERL"); # true; now max level is 2nd. + + $Collator->change(level => 4)->eq("perl", "PERL"); # false + =item UCA_Version -Returns the version number of Unicode Technical Standard 10 -this module consults. +Returns the version number of UTS #10 this module consults. =item Base_Unicode_Version @@ -961,14 +1451,10 @@ 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()?) +Unicode::Collate has not been ported to EBCDIC. +IMHO, use of utf8::unicode_to_native()/utf8::native_to_unicode() +at the proper postions should allow +this module to work on EBCDIC platform... =head2 CAVEAT @@ -979,17 +1465,20 @@ 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(alternate =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 @@ -1006,21 +1495,22 @@ SADAHIRO Tomoyuki, E<lt>SADAHIRO@cpan.orgE<gt> =over 4 -=item http://www.unicode.org/unicode/reports/tr10/ +=item http://www.unicode.org/reports/tr10/ -Unicode Collation Algorithm - UTR #10 +Unicode Collation Algorithm - UTS #10 -=item http://www.unicode.org/unicode/reports/tr10/allkeys.txt +=item http://www.unicode.org/reports/tr10/allkeys.txt The Default Unicode Collation Element Table -=item http://www.unicode.org/unicode/reports/tr15/ +=item http://www.unicode.org/reports/tr10/CollationTest.html +http://www.unicode.org/reports/tr10/CollationTest.zip -Unicode Normalization Forms - UAX #15 +The latest versions of the conformance test for the UCA -=item http://www.unicode.org/unicode/reports/tr18 +=item http://www.unicode.org/reports/tr15/ -Unicode Regular Expression Guidelines - UTR #18 +Unicode Normalization Forms - UAX #15 =item L<Unicode::Normalize> diff --git a/lib/Unicode/Collate/Changes b/lib/Unicode/Collate/Changes index 997117c670..3e60f0bf79 100644 --- a/lib/Unicode/Collate/Changes +++ b/lib/Unicode/Collate/Changes @@ -1,5 +1,30 @@ Revision history for Perl extension Unicode::Collate. +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. - test fix: removed the needless requirement of Unicode::Normalize. diff --git a/lib/Unicode/Collate/README b/lib/Unicode/Collate/README index 4d4f12ce97..d829c77490 100644 --- a/lib/Unicode/Collate/README +++ b/lib/Unicode/Collate/README @@ -1,17 +1,9 @@ -Unicode/Collate version 0.12 +Unicode/Collate version 0.23 =============================== -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,14 +31,26 @@ 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/ diff --git a/lib/Unicode/Collate/keys.txt b/lib/Unicode/Collate/keys.txt index 5fe3ebef62..aaa2d2a5a7 100644 --- a/lib/Unicode/Collate/keys.txt +++ b/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/lib/Unicode/Collate/t/index.t b/lib/Unicode/Collate/t/index.t new file mode 100644 index 0000000000..75fcccf29f --- /dev/null +++ b/lib/Unicode/Collate/t/index.t @@ -0,0 +1,399 @@ + +BEGIN { + if (ord("A") == 193) { + print "1..0 # Unicode::Collate not ported to EBCDIC\n"; + exit 0; + } +} + +BEGIN { + if ($ENV{PERL_CORE}) { + chdir('t') if -d 't'; + @INC = qw(../lib); + } +} + +use Test; +BEGIN { plan tests => 65 }; +use Unicode::Collate; + +our $IsEBCDIC = ord("A") != 0x41; + +######################### + +ok(1); # If we made it this far, we're ok. + +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/lib/Unicode/Collate/t/test.t b/lib/Unicode/Collate/t/test.t index f5a7012ea9..971ad6768c 100644 --- a/lib/Unicode/Collate/t/test.t +++ b/lib/Unicode/Collate/t/test.t @@ -1,7 +1,3 @@ -# 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) { @@ -10,14 +6,24 @@ BEGIN { } } +BEGIN { + if ($ENV{PERL_CORE}) { + chdir('t') if -d 't'; + @INC = qw(../lib); + } +} + use Test; -BEGIN { plan tests => 160 }; +BEGIN { plan tests => 194 }; 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); # If we made it this far, we're ok. + +my $UCA_Version = "9"; ok(Unicode::Collate::UCA_Version, $UCA_Version); ok(Unicode::Collate->UCA_Version, $UCA_Version); @@ -41,36 +47,51 @@ 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); ############## +# Use pack('U'), not chr(), for Perl 5.6.1. +my $A_acute = pack('U', $IsEBCDIC ? 0x65 : 0xC1); +my $a_acute = pack('U', $IsEBCDIC ? 0x45 : 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)); + +############## + eval { require Unicode::Normalize }; -if (!$@) { +if (!$@ && !$IsEBCDIC) { my $NFD = Unicode::Collate->new( - table => 'keys.txt', + table => undef, 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")); @@ -82,7 +103,6 @@ else { ok(1); ok(1); ok(1); - ok(1); } ############## @@ -93,11 +113,13 @@ my $trad = Unicode::Collate->new( ignoreName => qr/HANGUL|HIRAGANA|KATAKANA|BOPOMOFO/, level => 4, 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 +130,8 @@ 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 my $hiragana = "\x{3042}\x{3044}"; my $katakana = "\x{30A2}\x{30A4}"; @@ -120,9 +144,9 @@ ok($trad->eq($katakana, $hiragana)); ############## -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") ); @@ -139,9 +163,9 @@ 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; +$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 +176,7 @@ ok( $Collator->ne($hiragana, $katakana) ); ok( $Collator->gt($hiragana, $katakana) ); ok( $Collator->ge($hiragana, $katakana) ); -$Collator->{upper_before_lower} = 1; +$Collator->change(upper_before_lower => 1); ok( $Collator->cmp("abc", "ABC"), 1); ok( $Collator->ge("abc", "ABC"), 1); @@ -161,12 +185,12 @@ ok( $Collator->cmp($hiragana, $katakana), 1); ok( $Collator->ge($hiragana, $katakana), 1); ok( $Collator->gt($hiragana, $katakana), 1); -$Collator->{katakana_before_hiragana} = 0; +$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") ); @@ -219,92 +243,6 @@ 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); - -############## - # Table is undefined, then no entry is defined. my $undef_table = Unicode::Collate->new( @@ -370,21 +308,41 @@ ok($few_entries->eq("\x{AC00}", "\x{1100}\x{1161}")); ############## -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}")); + +############## + +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 ############## @@ -426,59 +384,41 @@ ok($ignoreHangul->lt("Pe\x{AE00}rl", "Perl")); # 'r' is unassigned. ############## -my $blanked = Unicode::Collate->new( - table => 'keys.txt', - normalization => undef, - alternate => 'Blanked', -); - -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'); ############## @@ -504,19 +444,30 @@ ok($overCJK->lt("a\x{4E03}", "A\x{4E00}")); ############## -# rearranged : 0x0E40..0x0E44, 0x0EC0..0x0EC4 +# rearrange : 0x0E40..0x0E44, 0x0EC0..0x0EC4 (default) -ok($Collator->lt("A", "B")); +my %old_rearrange = $Collator->change(rearrange => undef); + +ok($Collator->gt("\x{0E41}A", "\x{0E40}B")); +ok($Collator->gt("A\x{0E41}A", "A\x{0E40}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")); ############## @@ -534,8 +485,6 @@ ok($no_rearrange->gt("A\x{0E41}A", "A\x{0E40}B")); ############## -# equivalent to $no_rearrange - my $undef_rearrange = Unicode::Collate->new( table => undef, normalization => undef, @@ -593,7 +542,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. @@ -603,3 +551,65 @@ ok($Collator ->gt("\x{4E00}", $hiragana)); ok($Collator ->gt("\x{4E03}", $katakana)); ############## + +# 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); + +############## + +# According to Conformance Test, +# a L3-ignorable is treated as a completely ignorable. + +my $L3ignorable = Unicode::Collate->new( + alternate => 'Non-ignorable', + 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 +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")); diff --git a/lib/bigint.pm b/lib/bigint.pm index 900fe18452..fa59d3bac9 100644 --- a/lib/bigint.pm +++ b/lib/bigint.pm @@ -1,10 +1,11 @@ package bigint; require 5.005; -$VERSION = '0.02'; +$VERSION = '0.03'; use Exporter; -@ISA = qw( Exporter ); -@EXPORT_OK = qw( ); +@ISA = qw( Exporter ); +@EXPORT_OK = qw( ); +@EXPORT = qw( inf NaN ); use strict; use overload; @@ -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 diff --git a/lib/bignum.pm b/lib/bignum.pm index c900c95ea2..235f9d6a64 100644 --- a/lib/bignum.pm +++ b/lib/bignum.pm @@ -1,10 +1,11 @@ package bignum; require 5.005; -$VERSION = '0.11'; +$VERSION = '0.12'; use Exporter; -@ISA = qw( Exporter ); -@EXPORT_OK = qw( ); +@EXPORT_OK = qw( ); +@EXPORT = qw( inf NaN ); +@ISA = qw( Exporter ); use strict; @@ -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 @@ -233,6 +240,29 @@ 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. + +=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 diff --git a/lib/bignum/t/bignum.t b/lib/bignum/t/bignum.t index 32235ea2d5..21a70e39dc 100755 --- a/lib/bignum/t/bignum.t +++ b/lib/bignum/t/bignum.t @@ -35,6 +35,8 @@ ok (2/3,"0.6666666666666666666666666666666666666667"); #ok (2 ** 0.5, 'NaN'); # should be sqrt(2); +print "huh\n"; + ok (12->bfac(),479001600); # see if Math::BigFloat constant works diff --git a/lib/bignum/t/biinfnan.t b/lib/bignum/t/biinfnan.t new file mode 100644 index 0000000000..84d3a71bfa --- /dev/null +++ b/lib/bignum/t/biinfnan.t @@ -0,0 +1,21 @@ +#!/usr/bin/perl -w + +############################################################################### + +use Test; +use strict; + +BEGIN + { + $| = 1; + chdir 't' if -d 't'; + unshift @INC, '../lib'; + plan tests => 26; + } + +use bigint; + +my ($x); + +require "infnan.inc"; + diff --git a/lib/bignum/t/bn_lite.t b/lib/bignum/t/bn_lite.t new file mode 100644 index 0000000000..21247c1ee7 --- /dev/null +++ b/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/lib/bignum/t/bninfnan.t b/lib/bignum/t/bninfnan.t new file mode 100644 index 0000000000..d097215b9e --- /dev/null +++ b/lib/bignum/t/bninfnan.t @@ -0,0 +1,21 @@ +#!/usr/bin/perl -w + +############################################################################### + +use Test; +use strict; + +BEGIN + { + $| = 1; + chdir 't' if -d 't'; + unshift @INC, '../lib'; + plan tests => 26; + } + +use bignum; + +my ($x); + +require "infnan.inc"; + diff --git a/lib/bignum/t/br_lite.t b/lib/bignum/t/br_lite.t new file mode 100644 index 0000000000..2bf77d4037 --- /dev/null +++ b/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/lib/bignum/t/brinfnan.t b/lib/bignum/t/brinfnan.t new file mode 100644 index 0000000000..689a855698 --- /dev/null +++ b/lib/bignum/t/brinfnan.t @@ -0,0 +1,21 @@ +#!/usr/bin/perl -w + +############################################################################### + +use Test; +use strict; + +BEGIN + { + $| = 1; + chdir 't' if -d 't'; + unshift @INC, '../lib'; + plan tests => 26; + } + +use bigrat; + +my ($x); + +require "infnan.inc"; + diff --git a/lib/bignum/t/infnan.inc b/lib/bignum/t/infnan.inc new file mode 100644 index 0000000000..771b94e748 --- /dev/null +++ b/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/lib/bigrat.pm b/lib/bigrat.pm index 54ef91ed30..ddc053426e 100644 --- a/lib/bigrat.pm +++ b/lib/bigrat.pm @@ -1,10 +1,11 @@ package bigrat; require 5.005; -$VERSION = '0.04'; +$VERSION = '0.05'; use Exporter; -@ISA = qw( Exporter ); -@EXPORT_OK = qw( ); +@ISA = qw( Exporter ); +@EXPORT_OK = qw( ); +@EXPORT = qw( inf NaN ); use strict; @@ -141,15 +142,19 @@ 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__ =head1 NAME -bigrat - Transparent BigNumber/BigRational support for Perl +bigrat - Transparent BigNumber/BigRationale support for Perl =head1 SYNOPSIS diff --git a/lib/charnames.pm b/lib/charnames.pm index fc3ad8bf3e..6037ea8af1 100644 --- a/lib/charnames.pm +++ b/lib/charnames.pm @@ -2,7 +2,7 @@ package charnames; use strict; use warnings; use Carp; -our $VERSION = '1.01'; +our $VERSION = '1.02'; use bytes (); # for $bytes::hint_bits $charnames::hint_bits = 0x20000; @@ -38,20 +38,44 @@ 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 = shift; + my $file = -f $arg ? $arg : "unicore/${arg}_alias.pl"; + if (my @alias = do $file) { + 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}; } - 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 $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 +83,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 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 +154,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 +176,25 @@ sub import ## ## fill %h keys with our @_ args. ## - my %h; - @h{@_} = (1) x @_; + my ($promote, %h, @args) = (0); + while (@_ and $_ = shift) { + if ($_ eq ":alias" && @_) { + my $alias = shift; + if (ref $alias) { + ref $alias eq "HASH" or + die "Only HASH reference supported as argument to :alias"; + alias ($alias); + next; + } + if ($alias =~ m{:(\w+)$} and $1 ne "full" && $1 ne "short") { + alias_file ($1) and $promote = 1, next; + } + alias_file ($alias) and 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 +204,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 +221,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 +308,25 @@ 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"; + 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 +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}> string C<CHARNAME> is first looked in the list of standard Unicode names of chars. 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 +384,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 +432,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 +449,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/lib/charnames.t b/lib/charnames.t index 29ee0f39a6..8472abf981 100644 --- a/lib/charnames.t +++ b/lib/charnames.t @@ -12,7 +12,7 @@ BEGIN { $| = 1; -print "1..46\n"; +print "1..69\n"; use charnames ':full'; @@ -264,3 +264,250 @@ 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 = "../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 = + $^O eq "MSWin32" ? `.\\perl -I../lib $switch $tmpfile 2>&1` : + $^O eq "NetWare" ? `perl -I../lib $switch $tmpfile 2>&1` : + $^O eq "MacOS" ? `$^X -I::lib -MMac::err=unix $switch $tmpfile` : + `./perl -I. -I../lib $switch $tmpfile 2>&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__ +# 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 +Unknown charname 'e_ACUTE' 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 +Odd number of elements in anonymous hash 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 +Odd number of elements in anonymous hash at +######## +# alias with bad file +use charnames ":full", ":alias" => "xyzzy"; +"Here: \N{e_ACUTE}\N{a_ACUTE}!\n"; +FILE +#!perl +0; +EXPECT +Odd number of elements in anonymous hash 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/lib/filetest.pm b/lib/filetest.pm index 21252f35a6..7eb58a68b1 100644 --- a/lib/filetest.pm +++ b/lib/filetest.pm @@ -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 @@ -1,13 +1,16 @@ package if; -our $VERSION = '0.01'; +our $VERSION = '0.02'; sub work { my $method = shift() ? 'import' : 'unimport'; return unless shift; # CONDITION - my $p = shift; # PACKAGE + + my $p = $_[0]; # PACKAGE eval "require $p" or die; # Adds .pm etc if needed - $p->$method(@_) if $p->can($method); + + my $m = $p->can($method); + goto &$m if $m; } sub import { shift; unshift @_, 1; goto &work } @@ -5,7 +5,7 @@ BEGIN { @INC = '../lib'; } -use Test::More tests => 4; +use Test::More tests => 5; my $v_plus = $] + 1; my $v_minus = $] - 1; @@ -24,3 +24,6 @@ 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'); + @@ -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/lib/lib_pm.PL b/lib/lib_pm.PL index 6c9ab05bc0..f6bb665dec 100644 --- a/lib/lib_pm.PL +++ b/lib/lib_pm.PL @@ -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; diff --git a/lib/overload.t b/lib/overload.t index 4db647dbee..0798a91b9f 100644 --- a/lib/overload.t +++ b/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,9 @@ 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"; # Last test is: -sub last {226} +sub last {227} diff --git a/lib/sort.pm b/lib/sort.pm index 3db4777c05..e785003f4f 100644 --- a/lib/sort.pm +++ b/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/lib/sort.t b/lib/sort.t index 990376576b..8828083066 100644 --- a/lib/sort.t +++ b/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/lib/strict.pm b/lib/strict.pm index 737cb18b1a..2eb756c938 100644 --- a/lib/strict.pm +++ b/lib/strict.pm @@ -1,5 +1,44 @@ package strict; +$strict::VERSION = "1.02"; + +my %bitmask = ( +refs => 0x00000002, +subs => 0x00000200, +vars => 0x00000400 +); + +sub bits { + my $bits = 0; + my @wrong; + foreach my $s (@_) { + push @wrong, $s unless exists $bitmask{$s}; + $bits |= $bitmask{$s} || 0; + } + if (@wrong) { + my $useno = { + __PACKAGE__.'::import' => 'use', + __PACKAGE__.'::unimport' => 'no' + }->{ (caller(1))[3] }; + require Carp; + Carp::croak("Don't know how to '$useno ".__PACKAGE__." qw(@wrong)'"); + } + $bits; +} + +sub import { + shift; + $^H |= bits(@_ ? @_ : qw(refs subs vars)); +} + +sub unimport { + shift; + $^H &= ~ bits(@_ ? @_ : qw(refs subs vars)); +} + +1; +__END__ + =head1 NAME strict - Perl pragma to restrict unsafe constructs @@ -87,31 +126,4 @@ appears in curly braces or on the left hand side of the "=E<gt>" symbol. See L<perlmodlib/Pragmatic Modules>. - =cut - -$strict::VERSION = "1.02"; - -my %bitmask = ( -refs => 0x00000002, -subs => 0x00000200, -vars => 0x00000400 -); - -sub bits { - my $bits = 0; - foreach my $s (@_){ $bits |= $bitmask{$s} || 0; }; - $bits; -} - -sub import { - shift; - $^H |= bits(@_ ? @_ : qw(refs subs vars)); -} - -sub unimport { - shift; - $^H &= ~ bits(@_ ? @_ : qw(refs subs vars)); -} - -1; diff --git a/lib/strict.t b/lib/strict.t index 02f191b9c5..a95b563f86 100644 --- a/lib/strict.t +++ b/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){ @@ -98,3 +98,19 @@ for (@prgs){ foreach (@temps) { unlink $_ if $_ } } + +eval qq(use strict 'garbage'); +print +($@ =~ /^Don't know how to 'use strict qw\(garbage\)/) + ? "ok ".++$i."\n" : "not ok ".++$i."\t# $@"; + +eval qq(no strict 'garbage'); +print +($@ =~ /^Don't know how to 'no strict qw\(garbage\)/) + ? "ok ".++$i."\n" : "not ok ".++$i."\t# $@"; + +eval qq(use strict qw(foo bar)); +print +($@ =~ /^Don't know how to 'use strict qw\(foo bar\)/) + ? "ok ".++$i."\n" : "not ok ".++$i."\t# $@"; + +eval qq(no strict qw(foo bar)); +print +($@ =~ /^Don't know how to 'no strict qw\(foo bar\)/) + ? "ok ".++$i."\n" : "not ok ".++$i."\t# $@"; diff --git a/lib/utf8_heavy.pl b/lib/utf8_heavy.pl index 1839d2144f..4c5ef27a7f 100644 --- a/lib/utf8_heavy.pl +++ b/lib/utf8_heavy.pl @@ -28,7 +28,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 +50,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,20 +87,17 @@ sub SWASHNEW { ## It could be a user-defined property. ## - if ($type =~ /^I[ns](\w+)$/) { - my @caller = caller(1); - - if (defined $caller[0]) { - my $prop = $caller[0] . "::" . $type; - - if (exists &{$prop}) { - no strict 'refs'; + my $caller = caller(1); - $list = &{$prop}; - last GETFILE; - } - } - } + if (defined $caller && $type =~ /^(?:\w+)$/) { + my $prop = $caller . "::" . ( $wasIs ? "Is" : "" ) . $type; + if (exists &{$prop}) { + no strict 'refs'; + + $list = &{$prop}; + last GETFILE; + } + } ## ## Last attempt -- see if it's a "To" name (e.g. "ToLower") @@ -150,8 +149,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) { diff --git a/lib/warnings.pm b/lib/warnings.pm index 8aa77482b2..0400a17527 100644 --- a/lib/warnings.pm +++ b/lib/warnings.pm @@ -291,7 +291,7 @@ $All = "" ; vec($All, $Offsets{'all'}, 2) = 3 ; sub Croaker { delete $Carp::CarpInternal{'warnings'}; - croak @_ ; + croak(@_); } sub bits diff --git a/lib/warnings.t b/lib/warnings.t index 8e57a6db59..0e65da992b 100644 --- a/lib/warnings.t +++ b/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; diff --git a/makedef.pl b/makedef.pl index 8986296390..1d4812e595 100644 --- a/makedef.pl +++ b/makedef.pl @@ -714,6 +714,10 @@ unless ($define{'PL_OP_SLAB_ALLOC'}) { )]; } +unless ($define{'THREADS_HAVE_PIDS'}) { + skip_symbols [qw(PL_ppid)]; +} + sub readvar { my $file = shift; my $proc = shift || sub { "PL_$_[2]" }; @@ -1132,7 +1132,7 @@ Perl_malloc(register size_t nbytes) DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%"UVxf": (%05lu) malloc %ld bytes\n", - PTR2UV(p), (unsigned long)(PL_an++), + PTR2UV((Malloc_t)(p + CHUNK_SHIFT)), (unsigned long)(PL_an++), (long)size)); #ifdef IGNORE_SMALL_BAD_FREE @@ -693,18 +693,25 @@ Perl_magic_get(pTHX_ SV *sv, MAGIC *mg) getrx: if (i >= 0) { - bool was_tainted = FALSE; - if (PL_tainting) { - was_tainted = PL_tainted; - PL_tainted = FALSE; - } sv_setpvn(sv, s, i); - if (PL_reg_match_utf8 && is_utf8_string((U8*)s, i)) + if (PL_reg_match_utf8 && is_utf8_string((U8*)s, i)) SvUTF8_on(sv); else SvUTF8_off(sv); - if (PL_tainting) - PL_tainted = (was_tainted || RX_MATCH_TAINTED(rx)); + if (PL_tainting) { + if (RX_MATCH_TAINTED(rx)) { + MAGIC* mg = SvMAGIC(sv); + MAGIC* mgt; + PL_tainted = 1; + SvMAGIC(sv) = mg->mg_moremagic; + SvTAINT(sv); + if ((mgt = SvMAGIC(sv))) { + mg->mg_moremagic = mgt; + SvMAGIC(sv) = mg; + } + } else + SvTAINTED_off(sv); + } break; } } @@ -1853,32 +1860,37 @@ Perl_magic_set(pTHX_ SV *sv, MAGIC *mg) DEBUG_x(dump_all()); break; case '\005': /* ^E */ - if (*(mg->mg_ptr+1) == '\0') { + if (*(mg->mg_ptr+1) == '\0') { #ifdef MACOS_TRADITIONAL - gMacPerl_OSErr = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv); + gMacPerl_OSErr = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv); #else # ifdef VMS - set_vaxc_errno(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv)); + set_vaxc_errno(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv)); # else # ifdef WIN32 - SetLastError( SvIV(sv) ); + SetLastError( SvIV(sv) ); # else # ifdef OS2 - os2_setsyserrno(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv)); + os2_setsyserrno(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv)); # else - /* will anyone ever use this? */ - SETERRNO(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv), 4); + /* will anyone ever use this? */ + SETERRNO(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv), 4); # endif # endif # endif #endif - } - else if (strEQ(mg->mg_ptr+1, "NCODING")) { - if (PL_encoding) - sv_setsv(PL_encoding, sv); - else - PL_encoding = newSVsv(sv); - } + } + else if (strEQ(mg->mg_ptr+1, "NCODING")) { + if (PL_encoding) + SvREFCNT_dec(PL_encoding); + if (SvOK(sv) || SvGMAGICAL(sv)) { + PL_encoding = newSVsv(sv); + } + else { + PL_encoding = Nullsv; + } + } + break; case '\006': /* ^F */ PL_maxsysfd = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv); break; @@ -2064,8 +2076,15 @@ Perl_magic_set(pTHX_ SV *sv, MAGIC *mg) STATUS_POSIX_SET(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv)); break; case '!': + { +#ifdef VMS +# define PERL_VMS_BANG vaxc$errno +#else +# define PERL_VMS_BANG 0 +#endif SETERRNO(SvIOK(sv) ? SvIVX(sv) : SvOK(sv) ? sv_2iv(sv) : 0, - (SvIV(sv) == EVMSERR) ? 4 : vaxc$errno); + (SvIV(sv) == EVMSERR) ? 4 : PERL_VMS_BANG); + } break; case '<': PL_uid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv); @@ -33,14 +33,13 @@ struct magic { I32 mg_len; }; -#define MGf_TAINTEDDIR 1 +#define MGf_TAINTEDDIR 1 /* PERL_MAGIC_envelem only */ +#define MGf_MINMATCH 1 /* PERL_MAGIC_regex_global only */ #define MGf_REFCOUNTED 2 #define MGf_GSKIP 4 #define MGf_COPY 8 #define MGf_DUP 16 -#define MGf_MINMATCH 1 - #define MgTAINTEDDIR(mg) (mg->mg_flags & MGf_TAINTEDDIR) #define MgTAINTEDDIR_on(mg) (mg->mg_flags |= MGf_TAINTEDDIR) #define MgTAINTEDDIR_off(mg) (mg->mg_flags &= ~MGf_TAINTEDDIR) @@ -727,6 +727,8 @@ S_mulexp10(NV value, I32 exponent) if (exponent == 0) return value; + if (value == 0) + return 0; /* On OpenVMS VAX we by default use the D_FLOAT double format, * and that format does not have *easy* capabilities [1] for @@ -811,27 +813,43 @@ Perl_my_atof(pTHX_ const char* s) char* Perl_my_atof2(pTHX_ const char* orig, NV* value) { - NV result = 0.0; + NV result[3] = {0.0, 0.0, 0.0}; char* s = (char*)orig; #ifdef USE_PERL_ATOF + UV accumulator[2] = {0,0}; /* before/after dp */ bool negative = 0; char* send = s + strlen(orig) - 1; - bool seendigit = 0; - I32 expextra = 0; + bool seen_digit = 0; + I32 exp_adjust[2] = {0,0}; + I32 exp_acc[2] = {-1, -1}; + /* the current exponent adjust for the accumulators */ I32 exponent = 0; - I32 i; -/* this is arbitrary */ -#define PARTLIM 6 -/* we want the largest integers we can usefully use */ -#if defined(HAS_QUAD) && defined(USE_64_BIT_INT) -# define PARTSIZE ((int)TYPE_DIGITS(U64)-1) - U64 part[PARTLIM]; -#else -# define PARTSIZE ((int)TYPE_DIGITS(U32)-1) - U32 part[PARTLIM]; -#endif - I32 ipart = 0; /* index into part[] */ - I32 offcount; /* number of digits in least significant part */ + I32 seen_dp = 0; + I32 digit = 0; + I32 old_digit = 0; + I32 sig_digits = 0; /* noof significant digits seen so far */ + +/* There is no point in processing more significant digits + * than the NV can hold. Note that NV_DIG is a lower-bound value, + * while we need an upper-bound value. We add 2 to account for this; + * since it will have been conservative on both the first and last digit. + * For example a 32-bit mantissa with an exponent of 4 would have + * exact values in the set + * 4 + * 8 + * .. + * 17179869172 + * 17179869176 + * 17179869180 + * + * where for the purposes of calculating NV_DIG we would have to discount + * both the first and last digit, since neither can hold all values from + * 0..9; but for calculating the value we must examine those two digits. + */ +#define MAX_SIG_DIGITS (NV_DIG+2) + +/* the max number we can accumulate in a UV, and still safely do 10*N+9 */ +#define MAX_ACCUMULATE ( (UV) ((UV_MAX - 9)/10)) /* leading whitespace */ while (isSPACE(*s)) @@ -846,74 +864,79 @@ Perl_my_atof2(pTHX_ const char* orig, NV* value) ++s; } - part[0] = offcount = 0; - if (isDIGIT(*s)) { - seendigit = 1; /* get this over with */ + /* we accumulate digits into an integer; when this becomes too + * large, we add the total to NV and start again */ - /* skip leading zeros */ - while (*s == '0') - ++s; - } + while (1) { + if (isDIGIT(*s)) { + seen_digit = 1; + old_digit = digit; + digit = *s++ - '0'; + if (seen_dp) + exp_adjust[1]++; - /* integer digits */ - while (isDIGIT(*s)) { - if (++offcount > PARTSIZE) { - if (++ipart < PARTLIM) { - part[ipart] = 0; - offcount = 1; /* ++0 */ - } - else { + /* don't start counting until we see the first significant + * digit, eg the 5 in 0.00005... */ + if (!sig_digits && digit == 0) + continue; + + if (++sig_digits > MAX_SIG_DIGITS) { /* limits of precision reached */ - --ipart; - --offcount; - if (*s >= '5') - ++part[ipart]; + if (digit > 5) { + ++accumulator[seen_dp]; + } else if (digit == 5) { + if (old_digit % 2) { /* round to even - Allen */ + ++accumulator[seen_dp]; + } + } + if (seen_dp) { + exp_adjust[1]--; + } else { + exp_adjust[0]++; + } + /* skip remaining digits */ while (isDIGIT(*s)) { - ++expextra; ++s; + if (! seen_dp) { + exp_adjust[0]++; + } } /* warn of loss of precision? */ - break; } - } - part[ipart] = part[ipart] * 10 + (*s++ - '0'); - } - - /* decimal point */ - if (GROK_NUMERIC_RADIX((const char **)&s, send)) { - if (isDIGIT(*s)) - seendigit = 1; /* get this over with */ - - /* decimal digits */ - while (isDIGIT(*s)) { - if (++offcount > PARTSIZE) { - if (++ipart < PARTLIM) { - part[ipart] = 0; - offcount = 1; /* ++0 */ + else { + if (accumulator[seen_dp] > MAX_ACCUMULATE) { + /* add accumulator to result and start again */ + result[seen_dp] = S_mulexp10(result[seen_dp], + exp_acc[seen_dp]) + + (NV)accumulator[seen_dp]; + accumulator[seen_dp] = 0; + exp_acc[seen_dp] = 0; } - else { - /* limits of precision reached */ - --ipart; - --offcount; - if (*s >= '5') - ++part[ipart]; - while (isDIGIT(*s)) - ++s; - /* warn of loss of precision? */ - break; + accumulator[seen_dp] = accumulator[seen_dp] * 10 + digit; + ++exp_acc[seen_dp]; + } + } + else if (!seen_dp && GROK_NUMERIC_RADIX((const char **)&s, send)) { + seen_dp = 1; + if (sig_digits > MAX_SIG_DIGITS) { + ++s; + while (isDIGIT(*s)) { + ++s; } + break; } - --expextra; - part[ipart] = part[ipart] * 10 + (*s++ - '0'); + } + else { + break; } } - /* combine components of mantissa */ - for (i = 0; i <= ipart; ++i) - result += S_mulexp10((NV)part[ipart - i], - i ? offcount + (i - 1) * PARTSIZE : 0); + result[0] = S_mulexp10(result[0], exp_acc[0]) + (NV)accumulator[0]; + if (seen_dp) { + result[1] = S_mulexp10(result[1], exp_acc[1]) + (NV)accumulator[1]; + } - if (seendigit && (*s == 'e' || *s == 'E')) { + if (seen_digit && (*s == 'e' || *s == 'E')) { bool expnegative = 0; ++s; @@ -930,15 +953,22 @@ Perl_my_atof2(pTHX_ const char* orig, NV* value) exponent = -exponent; } + + /* now apply the exponent */ - exponent += expextra; - result = S_mulexp10(result, exponent); + + if (seen_dp) { + result[2] = S_mulexp10(result[0],exponent+exp_adjust[0]) + + S_mulexp10(result[1],exponent-exp_adjust[1]); + } else { + result[2] = S_mulexp10(result[0],exponent+exp_adjust[0]); + } /* now apply the sign */ if (negative) - result = -result; + result[2] = -result[2]; #endif /* USE_PERL_ATOF */ - *value = result; + *value = result[2]; return s; } @@ -104,7 +104,7 @@ S_Slab_Free(pTHX_ void *op) #define CHECKOP(type,o) \ ((PL_op_mask && PL_op_mask[type]) \ ? ( op_free((OP*)o), \ - Perl_croak(aTHX_ "%s trapped by operation mask", PL_op_desc[type]), \ + Perl_croak(aTHX_ "'%s' trapped by operation mask", PL_op_desc[type]), \ Nullop ) \ : CALL_FPTR(PL_check[type])(aTHX_ (OP*)o)) @@ -632,7 +632,8 @@ Perl_pad_swipe(pTHX_ PADOFFSET po) DEBUG_X(PerlIO_printf(Perl_debug_log, "Pad 0x%"UVxf" swipe %"IVdf"\n", PTR2UV(PL_curpad), (IV)po)); #endif /* USE_5005THREADS */ - SvPADTMP_off(PL_curpad[po]); + if (PL_curpad[po]) + SvPADTMP_off(PL_curpad[po]); PL_curpad[po] = NEWSV(1107,0); SvPADTMP_on(PL_curpad[po]); if ((I32)po < PL_padix) @@ -1188,6 +1189,7 @@ Perl_scalarvoid(pTHX_ OP *o) case OP_GGRNAM: case OP_GGRGID: case OP_GETLOGIN: + case OP_PROTOTYPE: func_ops: if (!(o->op_private & (OPpLVAL_INTRO|OPpOUR_INTRO))) useless = OP_DESC(o); @@ -1612,7 +1614,6 @@ Perl_mod(pTHX_ OP *o, I32 type) case OP_AASSIGN: case OP_NEXTSTATE: case OP_DBSTATE: - case OP_CHOMP: PL_modcount = RETURN_UNLIMITED_NUMBER; break; case OP_RV2SV: @@ -2088,19 +2089,19 @@ S_my_kid(pTHX_ OP *o, OP *attrs, OP **imopsp) } else if (type == OP_RV2SV || /* "our" declaration */ type == OP_RV2AV || type == OP_RV2HV) { /* XXX does this let anything illegal in? */ - if (cUNOPo->op_first->op_type != OP_GV) { /* MJD 20011224 */ - yyerror(Perl_form(aTHX_ "Can't declare %s in my", OP_DESC(o))); - } - if (attrs) { - GV *gv = cGVOPx_gv(cUNOPo->op_first); - PL_in_my = FALSE; - PL_in_my_stash = Nullhv; - apply_attrs(GvSTASH(gv), - (type == OP_RV2SV ? GvSV(gv) : - type == OP_RV2AV ? (SV*)GvAV(gv) : - type == OP_RV2HV ? (SV*)GvHV(gv) : (SV*)gv), - attrs, FALSE); - } + if (cUNOPo->op_first->op_type != OP_GV) { /* MJD 20011224 */ + yyerror(Perl_form(aTHX_ "Can't declare %s in %s", + OP_DESC(o), PL_in_my == KEY_our ? "our" : "my")); + } else if (attrs) { + GV *gv = cGVOPx_gv(cUNOPo->op_first); + PL_in_my = FALSE; + PL_in_my_stash = Nullhv; + apply_attrs(GvSTASH(gv), + (type == OP_RV2SV ? GvSV(gv) : + type == OP_RV2AV ? (SV*)GvAV(gv) : + type == OP_RV2HV ? (SV*)GvHV(gv) : (SV*)gv), + attrs, FALSE); + } o->op_private |= OPpOUR_INTRO; return o; } @@ -2140,10 +2141,16 @@ Perl_my_attrs(pTHX_ OP *o, OP *attrs) OP *rops = Nullop; int maybe_scalar = 0; +/* [perl #17376]: this appears to be premature, and results in code such as + C< my(%x); > executing in list mode rather than void mode */ +#if 0 if (o->op_flags & OPf_PARENS) list(o); else maybe_scalar = 1; +#else + maybe_scalar = 1; +#endif if (attrs) SAVEFREEOP(attrs); o = my_kid(o, attrs, &rops); @@ -2375,7 +2382,13 @@ OP * Perl_localize(pTHX_ OP *o, I32 lex) { if (o->op_flags & OPf_PARENS) +/* [perl #17376]: this appears to be premature, and results in code such as + C< our(%x); > executing in list mode rather than void mode */ +#if 0 list(o); +#else + ; +#endif else { if (ckWARN(WARN_PARENTHESIS) && PL_bufptr > PL_oldbufptr && PL_bufptr[-1] == ',') @@ -3306,7 +3319,8 @@ Perl_newPADOP(pTHX_ I32 type, I32 flags, SV *sv) padop->op_padix = pad_alloc(type, SVs_PADTMP); SvREFCNT_dec(PL_curpad[padop->op_padix]); PL_curpad[padop->op_padix] = sv; - SvPADTMP_on(sv); + if (sv) + SvPADTMP_on(sv); padop->op_next = (OP*)padop; padop->op_flags = (U8)flags; if (PL_opargs[type] & OA_RETSCALAR) @@ -3320,7 +3334,8 @@ OP * Perl_newGVOP(pTHX_ I32 type, I32 flags, GV *gv) { #ifdef USE_ITHREADS - GvIN_PAD_on(gv); + if (gv) + GvIN_PAD_on(gv); return newPADOP(type, flags, SvREFCNT_inc(gv)); #else return newSVOP(type, flags, SvREFCNT_inc(gv)); @@ -3886,8 +3901,12 @@ S_new_logop(pTHX_ I32 type, I32 flags, OP** firstp, OP** otherp) } } if (first->op_type == OP_CONST) { - if (ckWARN(WARN_BAREWORD) && (first->op_private & OPpCONST_BARE)) - Perl_warner(aTHX_ packWARN(WARN_BAREWORD), "Bareword found in conditional"); + if (ckWARN(WARN_BAREWORD) && (first->op_private & OPpCONST_BARE)) { + if (first->op_private & OPpCONST_STRICT) + no_bareword_allowed(first); + else + Perl_warner(aTHX_ packWARN(WARN_BAREWORD), "Bareword found in conditional"); + } if ((type == OP_AND) == (SvTRUE(((SVOP*)first)->op_sv))) { op_free(first); *firstp = Nullop; @@ -4396,7 +4415,7 @@ Perl_cv_undef(pTHX_ CV *cv) AV *padlist = CvPADLIST(cv); I32 ix; /* pads may be cleared out already during global destruction */ - if (is_eval && !PL_dirty) { + if ((is_eval && !PL_dirty) || CvSPECIAL(cv)) { /* inner references to eval's cv must be fixed up */ AV *comppad_name = (AV*)AvARRAY(padlist)[0]; AV *comppad = (AV*)AvARRAY(padlist)[1]; @@ -5540,7 +5559,29 @@ Perl_ck_anoncode(pTHX_ OP *o) OP * Perl_ck_bitop(pTHX_ OP *o) { +#define OP_IS_NUMCOMPARE(op) \ + ((op) == OP_LT || (op) == OP_I_LT || \ + (op) == OP_GT || (op) == OP_I_GT || \ + (op) == OP_LE || (op) == OP_I_LE || \ + (op) == OP_GE || (op) == OP_I_GE || \ + (op) == OP_EQ || (op) == OP_I_EQ || \ + (op) == OP_NE || (op) == OP_I_NE || \ + (op) == OP_NCMP || (op) == OP_I_NCMP) o->op_private = (U8)(PL_hints & HINT_PRIVATE_MASK); + if (o->op_type == OP_BIT_OR + || o->op_type == OP_BIT_AND + || o->op_type == OP_BIT_XOR) + { + OPCODE typfirst = cBINOPo->op_first->op_type; + OPCODE typlast = cBINOPo->op_first->op_sibling->op_type; + if (OP_IS_NUMCOMPARE(typfirst) || OP_IS_NUMCOMPARE(typlast)) + if (ckWARN(WARN_PRECEDENCE)) + Perl_warner(aTHX_ packWARN(WARN_PRECEDENCE), + "Possible precedence problem on bitwise %c operator", + o->op_type == OP_BIT_OR ? '|' + : o->op_type == OP_BIT_AND ? '&' : '^' + ); + } return o; } @@ -420,7 +420,7 @@ __END__ # logop - | listop - @ pmop - / # padop/svop - $ padop - # (unused) loop - { # baseop/unop - % loopexop - } filestatop - - -# pvop/svop - " +# pvop/svop - " cop - ; # Other options are: # needs stack mark - m @@ -26,6 +26,18 @@ char *nw_get_sitelib(const char *pl); #include <unistd.h> #endif +#ifdef __BEOS__ +# define HZ 1000000 +#endif + +#ifndef HZ +# ifdef CLK_TCK +# define HZ CLK_TCK +# else +# define HZ 60 +# endif +#endif + #if !defined(STANDARD_C) && !defined(HAS_GETENV_PROTOTYPE) && !defined(PERL_MICRO) char *getenv (char *); /* Usually in <stdlib.h> */ #endif @@ -295,6 +307,14 @@ perl_construct(pTHXx) PL_origenviron = environ; #endif + /* Use sysconf(_SC_CLK_TCK) if available, if not + * available or if the sysconf() fails, use the HZ. */ +#if defined(HAS_SYSCONF) && defined(_SC_CLK_TCK) + PL_clocktick = sysconf(_SC_CLK_TCK); + if (PL_clocktick <= 0) +#endif + PL_clocktick = HZ; + ENTER; } @@ -628,11 +648,13 @@ perl_destruct(pTHXx) SvREFCNT_dec(PL_beginav_save); SvREFCNT_dec(PL_endav); SvREFCNT_dec(PL_checkav); + SvREFCNT_dec(PL_checkav_save); SvREFCNT_dec(PL_initav); PL_beginav = Nullav; PL_beginav_save = Nullav; PL_endav = Nullav; PL_checkav = Nullav; + PL_checkav_save = Nullav; PL_initav = Nullav; /* shortcuts just get cleared */ @@ -1158,7 +1180,7 @@ S_parse_body(pTHX_ char **env, XSINIT_t xsinit) #ifdef MACOS_TRADITIONAL /* ignore -e for Dev:Pseudo argument */ if (argv[1] && !strcmp(argv[1], "Dev:Pseudo")) - break; + break; #endif if (PL_euid != PL_uid || PL_egid != PL_gid) Perl_croak(aTHX_ "No -e allowed in setuid scripts"); @@ -1319,6 +1341,7 @@ print \" \\@INC:\\n @INC\\n\";"); } } switch_end: + sv_setsv(get_sv("/", TRUE), PL_rs); if ( #ifndef SECURE_INTERNAL_GETENV @@ -1504,7 +1527,7 @@ print \" \\@INC:\\n @INC\\n\";"); /* now parse the script */ - SETERRNO(0,SS$_NORMAL); + SETERRNO(0,SS_NORMAL); PL_error_count = 0; #ifdef MACOS_TRADITIONAL if (gMacPerl_SyntaxError = (yyparse() || PL_error_count)) { @@ -1533,12 +1556,6 @@ print \" \\@INC:\\n @INC\\n\";"); PL_e_script = Nullsv; } -/* - Not sure that this is still the right place to do this now that we - no longer use PL_nrs. HVDS 2001/09/09 -*/ - sv_setsv(get_sv("/", TRUE), PL_rs); - if (PL_do_undump) my_unexec(); @@ -3274,6 +3291,9 @@ STATIC void S_find_beginning(pTHX) { register char *s, *s2; +#ifdef MACOS_TRADITIONAL + int maclines = 0; +#endif /* skip forward in input to the real script? */ @@ -3285,16 +3305,16 @@ S_find_beginning(pTHX) if ((s = sv_gets(PL_linestr, PL_rsfp, 0)) == Nullch) { if (!gMacPerl_AlwaysExtract) Perl_croak(aTHX_ "No Perl script found in input\n"); - + if (PL_doextract) /* require explicit override ? */ if (!OverrideExtract(PL_origfilename)) Perl_croak(aTHX_ "User aborted script\n"); else PL_doextract = FALSE; - + /* Pater peccavi, file does not have #! */ PerlIO_rewind(PL_rsfp); - + break; } #else @@ -3317,7 +3337,18 @@ S_find_beginning(pTHX) ; } #ifdef MACOS_TRADITIONAL + /* We are always searching for the #!perl line in MacPerl, + * so if we find it, still keep the line count correct + * by counting lines we already skipped over + */ + for (; maclines > 0 ; maclines--) + PerlIO_ungetc(PL_rsfp, '\n'); + break; + + /* gMacPerl_AlwaysExtract is false in MPW tool */ + } else if (gMacPerl_AlwaysExtract) { + ++maclines; #endif } } @@ -3637,6 +3668,9 @@ S_init_postdump_symbols(pTHX_ register int argc, register char **argv, register sv_setiv(GvSV(tmpgv), (IV)PerlProc_getpid()); SvREADONLY_on(GvSV(tmpgv)); } +#ifdef THREADS_HAVE_PIDS + PL_ppid = (IV)getppid(); +#endif /* touch @F array to prevent spurious warnings 20020415 MJD */ if (PL_minus_a) { @@ -3990,11 +4024,19 @@ Perl_call_list(pTHX_ I32 oldscope, AV *paramList) while (AvFILL(paramList) >= 0) { cv = (CV*)av_shift(paramList); - if (PL_savebegin && (paramList == PL_beginav)) { + if (PL_savebegin) { + if (paramList == PL_beginav) { /* save PL_beginav for compiler */ - if (! PL_beginav_save) - PL_beginav_save = newAV(); - av_push(PL_beginav_save, (SV*)cv); + if (! PL_beginav_save) + PL_beginav_save = newAV(); + av_push(PL_beginav_save, (SV*)cv); + } + else if (paramList == PL_checkav) { + /* save PL_checkav for compiler */ + if (! PL_checkav_save) + PL_checkav_save = newAV(); + av_push(PL_checkav_save, (SV*)cv); + } } else { SAVEFREESV(cv); } @@ -228,12 +228,12 @@ register struct op *Perl_op asm(stringify(OP_IN_REGISTER)); * Trying to select a version that gives no warnings... */ #if !(defined(STMT_START) && defined(STMT_END)) -# if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(__cplusplus) +# if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC) && !defined(__cplusplus) # define STMT_START (void)( /* gcc supports ``({ STATEMENTS; })'' */ # define STMT_END ) # else /* Now which other defined()s do we need here ??? */ -# if (VOIDFLAGS) && (defined(sun) || defined(__sun__)) +# if (VOIDFLAGS) && (defined(sun) || defined(__sun__)) && !defined(__GNUC__) # define STMT_START if (1) # define STMT_END else (void)0 # else @@ -730,8 +730,32 @@ int sockatmark(int); set_errno(errcode); \ set_vaxc_errno(vmserrcode); \ } STMT_END +# define LIB_INVARG LIB$_INVARG +# define RMS_DIR RMS$_DIR +# define RMS_FAC RMS$_FAC +# define RMS_FEX RMS$_FEX +# define RMS_FNF RMS$_FNF +# define RMS_IFI RMS$_IFI +# define RMS_ISI RMS$_ISI +# define RMS_PRV RMS$_PRV +# define SS_ACCVIO SS$_ACCVIO +# define SS_DEVOFFLINE SS$_DEVOFFLINE +# define SS_IVCHAN SS$_IVCHAN +# define SS_NORMAL SS$_NORMAL #else # define SETERRNO(errcode,vmserrcode) (errno = (errcode)) +# define LIB_INVARG 0 +# define RMS_DIR 0 +# define RMS_FAC 0 +# define RMS_FEX 0 +# define RMS_FNF 0 +# define RMS_IFI 0 +# define RMS_ISI 0 +# define RMS_PRV 0 +# define SS_ACCVIO 0 +# define SS_DEVOFFLINE 0 +# define SS_IVCHAN 0 +# define SS_NORMAL 0 #endif #ifdef USE_5005THREADS @@ -1130,8 +1154,10 @@ typedef UVTYPE UV; # define DBL_DIG OVR_DBL_DIG #else /* The following is all to get DBL_DIG, in order to pick a nice - default value for printing floating point numbers in Gconvert. - (see config.h) + default value for printing floating point numbers in Gconvert + (see config.h). (It also has other uses, such as figuring out if + a given precision of printing can be done with a double instead of + a long double - Allen). */ #ifdef I_LIMITS #include <limits.h> @@ -1186,6 +1212,29 @@ typedef UVTYPE UV; # endif #endif +/* + * This is for making sure we have a good DBL_MAX value, if possible, + * either for usage as NV_MAX or for usage in figuring out if we can + * fit a given long double into a double, if bug-fixing makes it + * necessary to do so. - Allen <allens@cpan.org> + */ + +#ifdef I_LIMITS +# include <limits.h> +#endif + +#ifdef I_VALUES +# if !(defined(DBL_MIN) && defined(DBL_MAX) && defined(I_LIMITS)) +# include <values.h> +# if defined(MAXDOUBLE) && !defined(DBL_MAX) +# define DBL_MAX MAXDOUBLE +# endif +# if defined(MINDOUBLE) && !defined(DBL_MIN) +# define DBL_MIN MINDOUBLE +# endif +# endif +#endif /* defined(I_VALUES) */ + typedef NVTYPE NV; #ifdef I_IEEEFP @@ -1217,7 +1266,7 @@ typedef NVTYPE NV; # endif # ifdef LDBL_MAX # define NV_MAX LDBL_MAX -# define NV_MIN LDBL_MIN +/* Having LDBL_MAX doesn't necessarily mean that we have LDBL_MIN... -Allen */ # else # ifdef HUGE_VALL # define NV_MAX HUGE_VALL @@ -1279,7 +1328,7 @@ typedef NVTYPE NV; # ifdef DBL_EPSILON # define NV_EPSILON DBL_EPSILON # endif -# ifdef DBL_MAX +# ifdef DBL_MAX /* XXX Does DBL_MAX imply having DBL_MIN? */ # define NV_MAX DBL_MAX # define NV_MIN DBL_MIN # else @@ -1302,6 +1351,13 @@ typedef NVTYPE NV; /* rumor has it that Win32 has _fpclass() */ +/* SGI has fpclassl... but not with the same result values, + * and it's via a typedef (not via #define), so will need to redo Configure + * to use. Not worth the trouble, IMO, at least until the below is used + * more places. Also has fp_class_l, BTW, via fp_class.h. Feel free to check + * with me for the SGI manpages, SGI testing, etcetera, if you want to + * try getting this to work with IRIX. - Allen <allens@cpan.org> */ + #if !defined(Perl_fp_class) && (defined(HAS_FPCLASS)||defined(HAS_FPCLASSL)) # ifdef I_IEEFP # include <ieeefp.h> @@ -1443,7 +1499,8 @@ int isnan(double d); * it is however best to use the native implementation of atof. * You can experiment with using your native one by -DUSE_PERL_ATOF=0. * Some good tests to try out with either setting are t/base/num.t, - * t/op/numconvert.t, and t/op/pack.t. */ + * t/op/numconvert.t, and t/op/pack.t. Note that if using long doubles + * you may need to be using a different function than atof! */ #ifndef USE_PERL_ATOF # ifndef _UNICOS @@ -1476,11 +1533,9 @@ int isnan(double d); #ifdef I_LIMITS /* Needed for cast_xxx() functions below. */ # include <limits.h> -#else -#ifdef I_VALUES -# include <values.h> -#endif #endif +/* Included values.h above if necessary; still including limits.h down here, + * despite doing above, because math.h might have overriden... XXX - Allen */ /* * Try to figure out max and min values for the integral types. THE CORRECT @@ -1912,18 +1967,21 @@ typedef struct clone_params CLONE_PARAMS; # ifdef PATH_MAX # ifdef _POSIX_PATH_MAX # if PATH_MAX > _POSIX_PATH_MAX -/* MAXPATHLEN is supposed to include the final null character, - * as opposed to PATH_MAX and _POSIX_PATH_MAX. */ -# define MAXPATHLEN (PATH_MAX+1) +/* POSIX 1990 (and pre) was ambiguous about whether PATH_MAX + * included the null byte or not. Later amendments of POSIX, + * XPG4, the Austin Group, and the Single UNIX Specification + * all explicitly include the null byte in the PATH_MAX. + * Ditto for _POSIX_PATH_MAX. */ +# define MAXPATHLEN PATH_MAX # else -# define MAXPATHLEN (_POSIX_PATH_MAX+1) +# define MAXPATHLEN _POSIX_PATH_MAX # endif # else # define MAXPATHLEN (PATH_MAX+1) # endif # else # ifdef _POSIX_PATH_MAX -# define MAXPATHLEN (_POSIX_PATH_MAX+1) +# define MAXPATHLEN _POSIX_PATH_MAX # else # define MAXPATHLEN 1024 /* Err on the large side. */ # endif @@ -2396,6 +2454,7 @@ Gid_t getegid (void); #ifndef Perl_error_log # define Perl_error_log (PL_stderrgv \ + && isGV(PL_stderrgv) \ && GvIOp(PL_stderrgv) \ && IoOFP(GvIOp(PL_stderrgv)) \ ? IoOFP(GvIOp(PL_stderrgv)) \ @@ -3837,7 +3896,7 @@ typedef struct am_table_short AMTS; * Remap printf */ #undef printf -#ifdef __GNUC__ +#if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC) #define printf(fmt,args...) PerlIO_stdoutf(fmt,##args) #else #define printf PerlIO_stdoutf @@ -148,6 +148,10 @@ END_EXTERN_C #define PL_bufptr (*Perl_Ibufptr_ptr(aTHX)) #undef PL_checkav #define PL_checkav (*Perl_Icheckav_ptr(aTHX)) +#undef PL_checkav_save +#define PL_checkav_save (*Perl_Icheckav_save_ptr(aTHX)) +#undef PL_clocktick +#define PL_clocktick (*Perl_Iclocktick_ptr(aTHX)) #undef PL_collation_ix #define PL_collation_ix (*Perl_Icollation_ix_ptr(aTHX)) #undef PL_collation_name @@ -966,6 +970,8 @@ END_EXTERN_C #define PL_op_mutex (*Perl_Gop_mutex_ptr(NULL)) #undef PL_patleave #define PL_patleave (*Perl_Gpatleave_ptr(NULL)) +#undef PL_ppid +#define PL_ppid (*Perl_Gppid_ptr(NULL)) #undef PL_runops_dbg #define PL_runops_dbg (*Perl_Grunops_dbg_ptr(NULL)) #undef PL_runops_std @@ -214,7 +214,7 @@ PerlIO_fdupopen(pTHX_ PerlIO *f, CLONE_PARAMS *param, int flags) return NULL; } else { - SETERRNO(EBADF, SS$_IVCHAN); + SETERRNO(EBADF, SS_IVCHAN); } #endif return NULL; @@ -481,7 +481,7 @@ PerlIO_fdupopen(pTHX_ PerlIO *f, CLONE_PARAMS *param, int flags) return new; } else { - SETERRNO(EBADF, SS$_IVCHAN); + SETERRNO(EBADF, SS_IVCHAN); return NULL; } } @@ -812,7 +812,7 @@ PerlIO_parse_layers(pTHX_ PerlIO_list_t *av, const char *names) Perl_warner(aTHX_ packWARN(WARN_LAYER), "perlio: invalid separator character %c%c%c in layer specification list %s", q, *s, q, s); - SETERRNO(EINVAL, LIB$_INVARG); + SETERRNO(EINVAL, LIB_INVARG); return -1; } do { @@ -1223,7 +1223,7 @@ PerlIO__close(pTHX_ PerlIO *f) if (PerlIOValid(f)) return (*PerlIOBase(f)->tab->Close) (aTHX_ f); else { - SETERRNO(EBADF, SS$_IVCHAN); + SETERRNO(EBADF, SS_IVCHAN); return -1; } } @@ -1247,7 +1247,7 @@ Perl_PerlIO_fileno(pTHX_ PerlIO *f) if (PerlIOValid(f)) return (*PerlIOBase(f)->tab->Fileno) (aTHX_ f); else { - SETERRNO(EBADF, SS$_IVCHAN); + SETERRNO(EBADF, SS_IVCHAN); return -1; } } @@ -1448,7 +1448,7 @@ Perl_PerlIO_read(pTHX_ PerlIO *f, void *vbuf, Size_t count) if (PerlIOValid(f)) return (*PerlIOBase(f)->tab->Read) (aTHX_ f, vbuf, count); else { - SETERRNO(EBADF, SS$_IVCHAN); + SETERRNO(EBADF, SS_IVCHAN); return -1; } } @@ -1459,7 +1459,7 @@ Perl_PerlIO_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count) if (PerlIOValid(f)) return (*PerlIOBase(f)->tab->Unread) (aTHX_ f, vbuf, count); else { - SETERRNO(EBADF, SS$_IVCHAN); + SETERRNO(EBADF, SS_IVCHAN); return -1; } } @@ -1470,7 +1470,7 @@ Perl_PerlIO_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count) if (PerlIOValid(f)) return (*PerlIOBase(f)->tab->Write) (aTHX_ f, vbuf, count); else { - SETERRNO(EBADF, SS$_IVCHAN); + SETERRNO(EBADF, SS_IVCHAN); return -1; } } @@ -1481,7 +1481,7 @@ Perl_PerlIO_seek(pTHX_ PerlIO *f, Off_t offset, int whence) if (PerlIOValid(f)) return (*PerlIOBase(f)->tab->Seek) (aTHX_ f, offset, whence); else { - SETERRNO(EBADF, SS$_IVCHAN); + SETERRNO(EBADF, SS_IVCHAN); return -1; } } @@ -1492,7 +1492,7 @@ Perl_PerlIO_tell(pTHX_ PerlIO *f) if (PerlIOValid(f)) return (*PerlIOBase(f)->tab->Tell) (aTHX_ f); else { - SETERRNO(EBADF, SS$_IVCHAN); + SETERRNO(EBADF, SS_IVCHAN); return -1; } } @@ -1508,13 +1508,13 @@ Perl_PerlIO_flush(pTHX_ PerlIO *f) } else { PerlIO_debug("Cannot flush f=%p :%s\n", (void*)f, tab->name); - SETERRNO(EBADF, SS$_IVCHAN); + SETERRNO(EBADF, SS_IVCHAN); return -1; } } else { PerlIO_debug("Cannot flush f=%p\n", (void*)f); - SETERRNO(EBADF, SS$_IVCHAN); + SETERRNO(EBADF, SS_IVCHAN); return -1; } } @@ -1566,7 +1566,7 @@ Perl_PerlIO_fill(pTHX_ PerlIO *f) if (PerlIOValid(f)) return (*PerlIOBase(f)->tab->Fill) (aTHX_ f); else { - SETERRNO(EBADF, SS$_IVCHAN); + SETERRNO(EBADF, SS_IVCHAN); return -1; } } @@ -1577,7 +1577,7 @@ PerlIO_isutf8(PerlIO *f) if (PerlIOValid(f)) return (PerlIOBase(f)->flags & PERLIO_F_UTF8) != 0; else { - SETERRNO(EBADF, SS$_IVCHAN); + SETERRNO(EBADF, SS_IVCHAN); return -1; } } @@ -1588,7 +1588,7 @@ Perl_PerlIO_eof(pTHX_ PerlIO *f) if (PerlIOValid(f)) return (*PerlIOBase(f)->tab->Eof) (aTHX_ f); else { - SETERRNO(EBADF, SS$_IVCHAN); + SETERRNO(EBADF, SS_IVCHAN); return -1; } } @@ -1599,7 +1599,7 @@ Perl_PerlIO_error(pTHX_ PerlIO *f) if (PerlIOValid(f)) return (*PerlIOBase(f)->tab->Error) (aTHX_ f); else { - SETERRNO(EBADF, SS$_IVCHAN); + SETERRNO(EBADF, SS_IVCHAN); return -1; } } @@ -1610,7 +1610,7 @@ Perl_PerlIO_clearerr(pTHX_ PerlIO *f) if (PerlIOValid(f)) (*PerlIOBase(f)->tab->Clearerr) (aTHX_ f); else - SETERRNO(EBADF, SS$_IVCHAN); + SETERRNO(EBADF, SS_IVCHAN); } void @@ -1619,7 +1619,7 @@ Perl_PerlIO_setlinebuf(pTHX_ PerlIO *f) if (PerlIOValid(f)) (*PerlIOBase(f)->tab->Setlinebuf) (aTHX_ f); else - SETERRNO(EBADF, SS$_IVCHAN); + SETERRNO(EBADF, SS_IVCHAN); } int @@ -1907,7 +1907,7 @@ PerlIOBase_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab) l->flags |= PERLIO_F_TRUNCATE | PERLIO_F_CANWRITE; break; default: - SETERRNO(EINVAL, LIB$_INVARG); + SETERRNO(EINVAL, LIB_INVARG); return -1; } while (*mode) { @@ -1922,7 +1922,7 @@ PerlIOBase_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab) l->flags |= PERLIO_F_CRLF; break; default: - SETERRNO(EINVAL, LIB$_INVARG); + SETERRNO(EINVAL, LIB_INVARG); return -1; } } @@ -2233,7 +2233,7 @@ PerlIOUnix_oflags(const char *mode) */ oflags |= O_BINARY; if (*mode || oflags == -1) { - SETERRNO(EINVAL, LIB$_INVARG); + SETERRNO(EINVAL, LIB_INVARG); oflags = -1; } return oflags; @@ -2401,7 +2401,7 @@ PerlIOUnix_close(pTHX_ PerlIO *f) } } else { - SETERRNO(EBADF,SS$_IVCHAN); + SETERRNO(EBADF,SS_IVCHAN); return -1; } while (PerlLIO_close(fd) != 0) { @@ -4061,7 +4061,7 @@ PerlIOMmap_map(pTHX_ PerlIO *f) if (!page_size) { #if defined(HAS_SYSCONF) && (defined(_SC_PAGESIZE) || defined(_SC_PAGE_SIZE)) { - SETERRNO(0, SS$_NORMAL); + SETERRNO(0, SS_NORMAL); # ifdef _SC_PAGESIZE page_size = sysconf(_SC_PAGESIZE); # else @@ -4580,7 +4580,7 @@ PerlIO_setpos(PerlIO *f, SV *pos) if (f && len == sizeof(Off_t)) return PerlIO_seek(f, *posn, SEEK_SET); } - SETERRNO(EINVAL, SS$_IVCHAN); + SETERRNO(EINVAL, SS_IVCHAN); return -1; } #else @@ -4600,7 +4600,7 @@ PerlIO_setpos(PerlIO *f, SV *pos) #endif } } - SETERRNO(EINVAL, SS$_IVCHAN); + SETERRNO(EINVAL, SS_IVCHAN); return -1; } #endif diff --git a/perlvars.h b/perlvars.h index b841719dc2..6b26f0ed04 100644 --- a/perlvars.h +++ b/perlvars.h @@ -58,3 +58,7 @@ PERLVARI(Glockhook, share_proc_t, MEMBER_TO_FPTR(Perl_sv_nolocking)) PERLVARI(Gunlockhook, share_proc_t, MEMBER_TO_FPTR(Perl_sv_nounlocking)) PERLVARI(Gthreadhook, thrhook_proc_t, MEMBER_TO_FPTR(Perl_nothreadhook)) +/* Stores the PPID */ +#ifdef THREADS_HAVE_PIDS +PERLVARI(Gppid, IV, 0) +#endif diff --git a/pod/buildtoc.PL b/pod/buildtoc.PL index acb45d610d..90f87ae403 100644 --- a/pod/buildtoc.PL +++ b/pod/buildtoc.PL @@ -81,6 +81,7 @@ if (-d "pod") { perlnetware perlos2 perlos390 + perlos400 perlqnx perlplan9 perlsolaris @@ -198,6 +199,7 @@ if (-d "pod") { perlhist perldelta + perl573delta perl572delta perl571delta perl570delta diff --git a/pod/perl.pod b/pod/perl.pod index 5aee015927..7eb8a8fe38 100644 --- a/pod/perl.pod +++ b/pod/perl.pod @@ -128,6 +128,7 @@ For ease of access, the Perl manual has been split up into several sections. perlhist Perl history records perldelta Perl changes since previous version + perl573delta Perl changes in version 5.7.3 perl572delta Perl changes in version 5.7.2 perl571delta Perl changes in version 5.7.1 perl570delta Perl changes in version 5.7.0 @@ -166,6 +167,7 @@ For ease of access, the Perl manual has been split up into several sections. perlnetware Perl notes for NetWare perlos2 Perl notes for OS/2 perlos390 Perl notes for OS/390 + perlos400 Perl notes for OS/400 perlplan9 Perl notes for Plan 9 perlqnx Perl notes for QNX perlsolaris Perl notes for Solaris @@ -262,7 +264,8 @@ L<perlguts>, and L<xsubpp>. =item * -roll-your-own magic variables (including multiple simultaneous DBM implementations) +roll-your-own magic variables (including multiple simultaneous DBM +implementations) Described in L<perltie> and L<AnyDBM_File>. @@ -287,21 +290,15 @@ and L<perlbot>. =item * -compilability into C code or Perl bytecode - -Described in L<B> and L<B::Bytecode>. - -=item * - support for light-weight processes (threads) -Described in L<perlthrtut> and L<Thread>. +Described in L<perlthrtut> and L<threads>. =item * -support for internationalization, localization, and Unicode +support for Unicode, internationalization, and localization -Described in L<perllocale> and L<utf8>. +Described in L<perluniintro>, L<perllocale> and L<Locale::Maketext>. =item * diff --git a/pod/perl573delta.pod b/pod/perl573delta.pod new file mode 100644 index 0000000000..b6c7beddf4 --- /dev/null +++ b/pod/perl573delta.pod @@ -0,0 +1,242 @@ +=head1 NAME + +perl573delta - what's new for perl v5.7.3 + +=head1 DESCRIPTION + +This document describes differences between the 5.7.2 release and the +5.7.3 release. + +(To view the differences between the 5.6.0 release and the 5.7.0 +release, see L<perl570delta>. To view the differences between the +5.7.0 release and the 5.7.1 release, see L<perl571delta>. To view +the differences between the 5.7.1 release and the 5.7.2 release, +see L<perl572delta>.) + +=head1 Changes + +This is just a selected list of some of the more notable changes. +The numbers refer to the Perl repository change numbers; see L<Changes58> +(or L<Changes> in Perl 5.8.1). In addition to these changes, lots of +work took place in integrating threads, PerlIO, and Unicode; and general +code cleanup; and last but not least and porting to non-UNIX lands like +Win32, VMS, Cygwin, DJGPP, VOS, MacOS Classic, and EBCDIC. + +=over 4 + +=item 11362 + +add LC_MESSAGES to POSIX :locale_h export tag + +=item 11371 + +add DEL to [:cntrl:] + +=item 11375 + +make h2ph understand constants like 1234L + +=item 11405 + +fix bugs in handling of the virtualized environment under Win32 + +=item 11410 + +fix a bug in the security taint checking of open() + +=item 11423 + +make perl fork() safe even on platforms that don't have pthread_atfork() + +=item 11459 + +make switching optimization levels during Perl builds easier via +the OPTIMIZE environment variable + +=item 11475 + +make split()'s unused captures to be undef, not '' + +=item 11485 + +Search::Dict: allow transforming lines before comparing + +=item 11490 + +allow installing extra modules or bundles when building Perl + +=item 11516 + +add -Wall in cflags when compiling with gcc to weed our dubious C practices + +=item 11541 + +pluggable optimizer + +=item 11549 + +integrate to WinCE port + +=item 11589 + +4-arg select was broken on windows + +=item 11594 + +introduce the perlivp utility + +=item 11623 + +rename lib/unicode to lib/unicore to avoid case-insensitivity problems +with lib/Unicode + +=item 111631 + +remove Time::Piece + +=item 11643 + +document that use utf8 is not the right way most of the time + +=item 11656 + +allow builing perl with -DUSE_UTF8_SCRIPTS which makes UTF-8 the +default script encoding + +=item 11725 + +division preserving 64-bit integers + +=item 11743 + +document the coderef-in-@INC feature + +=item 11794 + +modulu preserving 64-bit integers + +=item 11825 + +update to Unicode 3.1.1 + +=item 11865 + +add the \[$@%&*] prototype support + +=item 11874 + +oct() and hex() in glorious 64 bit + +=item 11877 + +Class::Struct: allow recursive classes + +=item 11993 + +fix unpack U to be the reverse of pack U + +=item 12056 + +waitpid enchancements for VMS + +=item 12180 + +unpack("Z*Z*", pack("Z*Z*", ..)) was broken + +=item 12243 + +Devel::Peek: display UTF-8 SVs also also as \x{...} + +=item 12288 + +Data::Dumper: option to sort hashes + +=item 12542 + +add perlpodspec + +=item 12652 + +threadsafe DynaLoader, re, Opcode, File::Glob, and B + +=item 12756 + +support BeOS better + +=item 12874 + +read-only hashes (user-level interface is Hash::Util) + +=item 13162 + +add Devel::PPPort + +=item 13179 + +add the sort pragma + +=item 13326 + +VMS: fix perl -P + +=item 13358 + +add perlpacktut + +=item 13452 + +SUPER-UX: add hints file + +=item 13575 + +Win32: non-blocking waitpid(-1,WNOHANG) + +=item 13684 + +introduce the -t option for gentler taint checking + +=item 14694 + +add the if pragma + +=item 14832 + +implement IV/UV/NV/long double un/packing with j/J/F/D + +=item 14854 + +document the new taint behaviour of exec LIST and system LIST + +=back + +=head1 Reporting Bugs + +If you find what you think is a bug, you might check the articles +recently posted to the comp.lang.perl.misc newsgroup and the perl +bug database at http://bugs.perl.org. There may also be +information at http://www.perl.com/, the Perl Home Page. + +If you believe you have an unreported bug, please run the B<perlbug> +program included with your release. Be sure to trim your bug down +to a tiny but sufficient test case. Your bug report, along with the +output of C<perl -V>, will be sent off to perlbug@perl.org to be +analysed by the Perl porting team. + +=head1 SEE ALSO + +The F<Changes> file for exhaustive details on what changed. + +The F<INSTALL> file for how to build Perl. + +The F<README> file for general stuff. + +The F<Artistic> and F<Copying> files for copyright information. + +=head1 HISTORY + +Written by Jarkko Hietaniemi <F<jhi@iki.fi>>, with many contributions +from The Perl Porters and Perl Users submitting feedback and patches. + +Send omissions or corrections to <F<perlbug@perl.org>>. + +=cut diff --git a/pod/perl58delta.pod b/pod/perl58delta.pod index f66c126528..46b50f00d8 100644 --- a/pod/perl58delta.pod +++ b/pod/perl58delta.pod @@ -1012,10 +1012,11 @@ in quoted-printable encoding, as defined in RFC 2045 - I<MIME use MIME::QuotedPrint; - $encoded = encode_qp("Smiley in Unicode: \x{263a}"); + $encoded = encode_qp("\xDE\xAD\xBE\xEF"); $decoded = decode_qp($encoded); - print $encoded, "\n"; # "Smiley in Unicode: =263A" + print $encoded, "\n"; # "=DE=AD=BE=EF\n" + print $decoded, "\n"; # "\xDE\xAD\xBE\xEF\n" See also L<PerlIO::via::QuotedPrint>. @@ -2903,11 +2904,11 @@ Using negative offset for vec() in lvalue context is now a warnable offense. =item * -Odd number of arguments to oveload::constant now elicits a warning. +Odd number of arguments to overload::constant now elicits a warning. =item * -Odd number of elements to in anonymous hash now elicits a warning. +Odd number of elements in anonymous hash now elicits a warning. =item * @@ -3400,6 +3401,10 @@ failures are expected: NDBM_File fails and ODBM_File just coredumps. +If you intend to run only on FAT (or if using AnyDBM_File on FAT), +run Configure with the -Ui_ndbm and -Ui_dbm options to prevent +NDBM_File and ODBM_File being built. + =head2 DJGPP Failures t/op/stat............................FAILED at test 29 diff --git a/pod/perldiag.pod b/pod/perldiag.pod index 8a2e4a4f24..fdd85eae07 100644 --- a/pod/perldiag.pod +++ b/pod/perldiag.pod @@ -165,6 +165,11 @@ or a hash or array slice, such as: name, and not a subroutine call. C<exists &sub()> will generate this error. +=item '%s' trapped by operation mask + +(F) You tried to use an operator from a Safe compartment in which it's +disallowed. See L<Safe>. + =item Argument "%s" isn't numeric%s (W numeric) The indicated string was fed as an argument to an operator @@ -467,6 +472,24 @@ checking. Alternatively, if you are certain that you're calling the function correctly, you may put an ampersand before the name to avoid the warning. See L<perlsub>. +=item Can only compress unsigned integers + +(F) An argument to pack("w",...) was not an integer. The BER compressed +integer format can only be used with positive integers, and you attempted +to compress something else. See L<perlfunc/pack>. + +=item Cannot compress integer + +(F) An argument to pack("w",...) was too large to compress. The BER +compressed integer format can only be used with positive integers, and you +attempted to compress Infinity or a very large number (> 1e308). +See L<perlfunc/pack>. + +=item Cannot compress negative numbers + +(F) An argument to pack("w",...) was negative. The BER compressed integer +format can only be used with positive integers. See L<perlfunc/pack>. + =item / cannot take a count (F) You had an unpack template indicating a counted-length string, but @@ -1498,12 +1521,6 @@ PDP-11 or something? to be a read-write filehandle, you needed to open it with "+<" or "+>" or "+>>" instead of with "<" or nothing. If you intended only to write the file, use ">" or ">>". See L<perlfunc/open>. -The warning will also occur if STDOUT (file descriptor 1) or STDERR -(file descriptor 2) is opened for input, this is a pre-emptive warning in -case some other part of your program or a child process is expecting STDOUT -and STDERR to be writable. This can happen accidentally if you -C<close(STDOUT)> or STDERR and then C<open> an unrelated handle which -will resuse the lowest numbered available descriptor. =item Filehandle %s opened only for output @@ -1511,12 +1528,17 @@ will resuse the lowest numbered available descriptor. If you intended it to be a read/write filehandle, you needed to open it with "+<" or "+>" or "+>>" instead of with "<" or nothing. If you intended only to read from the file, use "<". See L<perlfunc/open>. -The warning will also occur if STDIN (file descriptor 0) is opened -for output - this is a pre-emptive warning in case some other part of your -program or a child process is expecting STDIN to be readable. -This can happen accidentally if you C<close(STDIN)> and then C<open> an -unrelated handle which will resuse the lowest numbered available -descriptor. + +=item Filehandle %s reopened as %s only for input + +(W io) You opened for reading a filehandle that got the same filehandle id +as STDOUT or STDERR. This occured because you closed STDOUT or STDERR +previously. + +=item Filehandle STDIN reopened as %s only for output + +(W io) You opened for writing a filehandle that got the same filehandle id +as STDIN. This occured because you closed STDIN previously. =item Final $ should be \$ or $name @@ -1705,6 +1727,11 @@ to your Perl administrator. (W syntax) An illegal character was found in a prototype declaration. Legal characters in prototypes are $, @, %, *, ;, [, ], &, and \. +=item Illegal declaration of anonymous subroutine + +(F) When using the C<sub> keyword to construct an anonymous subroutine, +you must always specify a block of code. See L<perlsub>. + =item Illegal division by zero (F) You tried to divide a number by 0. Either something was wrong in @@ -1858,7 +1885,7 @@ C<{}> from your ending C<\x{}> - C<\x> without the curly braces can go only up to C<ff>. The <-- HERE shows in the regular expression about where the problem was discovered. See L<perlre>. -=item Invalid [] range "%s" in transliteration operator +=item Invalid range "%s" in transliteration operator (F) The range specified in the tr/// or y/// operator had a minimum character greater than the maximum character. See L<perlop>. @@ -2955,6 +2982,18 @@ Perl guesses a reasonable buffer size, but puts a sentinel byte at the end of the buffer just in case. This sentinel byte got clobbered, and Perl assumes that memory is now corrupted. See L<perlfunc/ioctl>. +=item Possible precedence problem on bitwise %c operator + +(W precedence) Your program uses a bitwise logical operator in conjunction +with a numeric comparison operator, like this : + + if ($x & $y == 0) { ... } + +This expression is actually equivalent to C<$x & ($y == 0)>, due to the +higher precedence of C<==>. This is probably not what you want. (If you +really meant to write this, disable the warning, or, better, write +C<$x & ($y == 0 ? 1 : 0)>). + =item Possible unintended interpolation of %s in string (W ambiguous) You said something like `@foo' in a double-quoted string diff --git a/pod/perlebcdic.pod b/pod/perlebcdic.pod index 44ad6b9f0d..1e96fdb999 100644 --- a/pod/perlebcdic.pod +++ b/pod/perlebcdic.pod @@ -1248,12 +1248,16 @@ Legacy multi byte EBCDIC code pages XXX. There may be a few system dependent issues of concern to EBCDIC Perl programmers. -=head2 OS/400 - -The PASE environment. +=head2 OS/400 =over 8 +=item PASE + +The PASE environment is runtime environment for OS/400 that can run +executables built for PowerPC AIX in OS/400, see L<perlos400>. PASE +is ASCII-based, not EBCDIC-based as the ILE. + =item IFS access XXX. diff --git a/pod/perlembed.pod b/pod/perlembed.pod index 2d6b20dce0..b9aae2d87a 100644 --- a/pod/perlembed.pod +++ b/pod/perlembed.pod @@ -386,6 +386,8 @@ been wrapped here): #include <EXTERN.h> #include <perl.h> + static PerlInterpreter *my_perl; + /** my_eval_sv(code, error_check) ** kinda like eval_sv(), ** but we pop the return value off the stack @@ -481,17 +483,18 @@ been wrapped here): main (int argc, char **argv, char **env) { - PerlInterpreter *my_perl = perl_alloc(); char *embedding[] = { "", "-e", "0" }; AV *match_list; I32 num_matches, i; - SV *text = NEWSV(1099,0); + SV *text; STRLEN n_a; + my_perl = perl_alloc(); perl_construct(my_perl); perl_parse(my_perl, NULL, 3, embedding, NULL); PL_exit_flags |= PERL_EXIT_DESTRUCT_END; + text = NEWSV(1099,0); sv_setpv(text, "When he is at a convenience store and the bill comes to some amount like 76 cents, Maynard is aware that there is something he *should* do, something that will enable him to get back a quarter, but he has no idea *what*. He fumbles through his red squeezey changepurse and gives the boy three extra pennies with his dollar, hoping that he might luck into the correct amount. The boy gives him back two of his own pennies and then the big shiny quarter that is his prize. -RICHH"); if (match(text, "m/quarter/")) /** Does text contain 'quarter'? **/ @@ -747,7 +750,7 @@ with L<perlfunc/my> whenever possible. #define DO_CLEAN 0 #endif - static PerlInterpreter *perl = NULL; + static PerlInterpreter *my_perl = NULL; int main(int argc, char **argv, char **env) @@ -758,16 +761,16 @@ with L<perlfunc/my> whenever possible. int exitstatus = 0; STRLEN n_a; - if((perl = perl_alloc()) == NULL) { + if((my_perl = perl_alloc()) == NULL) { fprintf(stderr, "no memory!"); exit(1); } - perl_construct(perl); + perl_construct(my_perl); - exitstatus = perl_parse(perl, NULL, 2, embedding, NULL); + exitstatus = perl_parse(my_perl, NULL, 2, embedding, NULL); PL_exit_flags |= PERL_EXIT_DESTRUCT_END; if(!exitstatus) { - exitstatus = perl_run(perl); + exitstatus = perl_run(my_perl); while(printf("Enter file name: ") && gets(filename)) { @@ -783,8 +786,8 @@ with L<perlfunc/my> whenever possible. } PL_perl_destruct_level = 0; - perl_destruct(perl); - perl_free(perl); + perl_destruct(my_perl); + perl_free(my_perl); exit(exitstatus); } diff --git a/pod/perlfaq1.pod b/pod/perlfaq1.pod index 5ca94c99f0..0c112608e7 100644 --- a/pod/perlfaq1.pod +++ b/pod/perlfaq1.pod @@ -59,14 +59,15 @@ users the informal support will more than suffice. See the answer to You should definitely use version 5. Version 4 is old, limited, and no longer maintained; its last patch (4.036) was in 1992, long ago and far away. Sure, it's stable, but so is anything that's dead; in fact, -perl4 had been called a dead, flea-bitten camel carcass. The most recent -production release is 5.6 (although 5.005_03 is still supported). -The most cutting-edge development release is 5.7. Further references -to the Perl language in this document refer to the production release -unless otherwise specified. There may be one or more official bug fixes -by the time you read this, and also perhaps some experimental versions -on the way to the next release. All releases prior to 5.004 were subject -to buffer overruns, a grave security issue. +perl4 had been called a dead, flea-bitten camel carcass. The most +recent production release is 5.8.0 (although 5.005_03 and 5.6.1 are +still supported). The most cutting-edge development release is 5.9. +Further references to the Perl language in this document refer to the +production release unless otherwise specified. There may be one or +more official bug fixes by the time you read this, and also perhaps +some experimental versions on the way to the next release. +All releases prior to 5.004 were subject to buffer overruns, a grave +security issue. =head2 What are perl4 and perl5? @@ -296,11 +297,12 @@ for any given task. Also mention that the difference between version (Well, OK, maybe it's not quite that distinct, but you get the idea.) If you want support and a reasonable guarantee that what you're developing will continue to work in the future, then you have to run -the supported version. As of January 2002 that probably means -running either of the releases 5.6.1 (released in April 2001) or -5.005_03 (released in March 1999), although 5.004_05 isn't that bad -if you B<absolutely> need such an old version (released in April 1999) -for stability reasons. Anything older than 5.004_05 shouldn't be used. +the supported version. As of August 2002 that means running either +5.8.0 (released in July 2002), or one of the older releases like +5.6.1 (released in April 2001) or 5.005_03 (released in March 1999), +although 5.004_05 isn't that bad if you B<absolutely> need such an old +version (released in April 1999) for stability reasons. +Anything older than 5.004_05 shouldn't be used. Of particular note is the massive bug hunt for buffer overflow problems that went into the 5.004 release. All releases prior to diff --git a/pod/perlfaq4.pod b/pod/perlfaq4.pod index 18d709169b..f2512059cc 100644 --- a/pod/perlfaq4.pod +++ b/pod/perlfaq4.pod @@ -575,8 +575,9 @@ matter how complicated. To find something between two single characters, a pattern like C</x([^x]*)x/> will get the intervening bits in $1. For multiple ones, then something more like C</alpha(.*?)omega/> would be needed. But none of these deals with -nested patterns, nor can they. For that you'll have to write a -parser. +nested patterns. For balanced expressions using C<(>, C<{>, C<[> +or C<< < >> as delimiters, use the CPAN module Regexp::Common, or see +L<perlre/(??{ code })>. For other cases, you'll have to write a parser. If you are serious about writing a parser, there are a number of modules or oddities that will make your life a lot easier. There are @@ -1926,7 +1927,9 @@ Assuming that you don't care about IEEE notations like "NaN" or You can also use the L<Data::Types|Data::Types> module on the CPAN, which exports functions that validate data types -using these and other regular expressions. +using these and other regular expressions, or you can use +the C<Regexp::Common> module from CPAN which has regular +expressions to match various types of numbers. If you're on a POSIX system, Perl's supports the C<POSIX::strtod> function. Its semantics are somewhat cumbersome, so here's a C<getnum> diff --git a/pod/perlfaq5.pod b/pod/perlfaq5.pod index 83e34942c0..3dfc646fd7 100644 --- a/pod/perlfaq5.pod +++ b/pod/perlfaq5.pod @@ -81,6 +81,31 @@ proper text file, so this may report one fewer line than you expect. This assumes no funny games with newline translations. +=head2 How can I use Perl's C<-i> option from within a program? + +C<-i> sets the value of Perl's C<$^I> variable, which in turn affects +the behavior of C<< <> >>; see L<perlrun> for more details. By +modifying the appropriate variables directly, you can get the same +behavior within a larger program. For example: + + # ... + { + local($^I, @ARGV) = ('.orig', glob("*.c")); + while (<>) { + if ($. == 1) { + print "This line should appear at the top of each file\n"; + } + s/\b(p)earl\b/${1}erl/i; # Correct typos, preserving case + print; + close ARGV if eof; # Reset $. + } + } + # $^I and @ARGV return to their old values here + +This block modifies all the C<.c> files in the current directory, +leaving a backup of the original data from each file in a new +C<.c.orig> file. + =head2 How do I make a temporary file name? Use the File::Temp module, see L<File::Temp> for more information. diff --git a/pod/perlfunc.pod b/pod/perlfunc.pod index b7fcd52dc8..e3b26611bd 100644 --- a/pod/perlfunc.pod +++ b/pod/perlfunc.pod @@ -1873,6 +1873,13 @@ does not accept a PID argument, so only C<PID==0> is truly portable. Returns the process id of the parent process. +Note for Linux users: on Linux, the C functions C<getpid()> and +C<getppid()> return different values from different threads. In order to +be portable, this behavior is not reflected by the perl-level function +C<getppid()>, that returns a consistent value across threads. If you want +to call the underlying C<getppid()>, you may use the CPAN module +C<Linux::Pid>. + =item getpriority WHICH,WHO Returns the current priority for a process, a process group, or a user. @@ -1969,7 +1976,7 @@ lookup by name, in which case you get the other thing, whatever it is. $name = getpwuid($num); $name = getpwent(); $gid = getgrnam($name); - $name = getgrgid($num; + $name = getgrgid($num); $name = getgrent(); #etc. @@ -4572,7 +4579,7 @@ the original quicksort was faster. 5.8 has a sort pragma for limited control of the sort. Its rather blunt control of the underlying algorithm may not persist into future perls, but the ability to characterize the input or output in implementation -independent ways quite probably will. See L</use>. +independent ways quite probably will. See L<sort>. Examples: @@ -4969,8 +4976,8 @@ effect as the C<-> flag: left-justification. You can specify a precision (for numeric conversions) or a maximum width (for string conversions) by specifying a C<.> followed by a number. -For floating point formats, this specifies the number of decimal places -to show (the default being 6), eg: +For floating point formats, with the exception of 'g' and 'G', this specifies +the number of decimal places to show (the default being 6), eg: # these examples are subject to system-specific variation printf '<%f>', 1; # prints "<1.000000>" @@ -4979,6 +4986,18 @@ to show (the default being 6), eg: printf '<%e>', 10; # prints "<1.000000e+01>" printf '<%.1e>', 10; # prints "<1.0e+01>" +For 'g' and 'G', this specifies the maximum number of digits to show, +including prior to the decimal point as well as after it, eg: + + # these examples are subject to system-specific variation + printf '<%g>', 1; # prints "<1>" + printf '<%.10g>', 1; # prints "<1>" + printf '<%g>', 100; # prints "<100>" + printf '<%.1g>', 100; # prints "<1e+02>" + printf '<%.2g>', 100.01; # prints "<1e+02>" + printf '<%.5g>', 100.01; # prints "<100.01>" + printf '<%.4g>', 100.01; # prints "<100>" + For integer conversions, specifying a precision implies that the output of the number itself should be zero-padded to this width: @@ -5006,23 +5025,49 @@ eg C<.*2$>: =item size For numeric conversions, you can specify the size to interpret the -number as using C<l>, C<h>, C<V>, C<q>, C<L> or C<ll>. For integer -conversions, numbers are usually assumed to be whatever the default -integer size is on your platform (usually 32 or 64 bits), but you -can override this to use instead one of the standard C types, as -supported by the compiler used to build Perl: +number as using C<l>, C<h>, C<V>, C<q>, C<L>, or C<ll>. For integer +conversions (C<d u o x X b i D U O>), numbers are usually assumed to be +whatever the default integer size is on your platform (usually 32 or 64 +bits), but you can override this to use instead one of the standard C types, +as supported by the compiler used to build Perl: l interpret integer as C type "long" or "unsigned long" h interpret integer as C type "short" or "unsigned short" - q, L or ll interpret integer as C type "long long" or "unsigned long long" - (if your platform supports such a type, else it is an error) + q, L or ll interpret integer as C type "long long", "unsigned long long". + or "quads" (typically 64-bit integers) + +The last will produce errors if Perl does not understand "quads" in your +installation. (This requires that either the platform natively supports quads +or Perl was specifically compiled to support quads.) You can find out +whether your Perl supports quads via L<Config>: + + use Config; + ($Config{use64bitint} eq 'define' || $Config{longsize} >= 8) && + print "quads\n"; + +For floating point conversions (C<e f g E F G>), numbers are usually assumed +to be the default floating point size on your platform (double or long double), +but you can force 'long double' with C<q>, C<L>, or C<ll> if your +platform supports them. You can find out whether your Perl supports long +doubles via L<Config>: -For floating point conversions, numbers are usually assumed to be -the default floating point size on your platform (double or long double), -but you can force 'long double' with C<q>, C<L> or C<ll> if your -platform supports them. + use Config; + $Config{d_longdbl} eq 'define' && print "long doubles\n"; + +You can find out whether Perl considers 'long double' to be the default +floating point size to use on your platform via L<Config>: + + use Config; + ($Config{uselongdouble} eq 'define') && + print "long doubles by default\n"; + +It can also be the case that long doubles and doubles are the same thing: -The size specifier 'V' has no effect for Perl code, but it supported + use Config; + ($Config{doublesize} == $Config{longdblsize}) && + print "doubles are long doubles\n"; + +The size specifier C<V> has no effect for Perl code, but it is supported for compatibility with XS code; it means 'use the standard size for a Perl integer (or floating-point number)', which is already the default for Perl code. @@ -5064,44 +5109,6 @@ If C<use locale> is in effect, the character used for the decimal point in formatted real numbers is affected by the LC_NUMERIC locale. See L<perllocale>. -If Perl understands "quads" (64-bit integers) (this requires -either that the platform natively support quads or that Perl -be specifically compiled to support quads), the characters - - d u o x X b i D U O - -print quads, and they may optionally be preceded by - - ll L q - -For example - - %lld %16LX %qo - -You can find out whether your Perl supports quads via L<Config>: - - use Config; - ($Config{use64bitint} eq 'define' || $Config{longsize} == 8) && - print "quads\n"; - -If Perl understands "long doubles" (this requires that the platform -support long doubles), the flags - - e f g E F G - -may optionally be preceded by - - ll L - -For example - - %llf %Lg - -You can find out whether your Perl supports long doubles via L<Config>: - - use Config; - $Config{d_longdbl} eq 'define' && print "long doubles\n"; - =item sqrt EXPR =item sqrt @@ -5253,7 +5260,7 @@ You can import symbolic mode constants (C<S_IF*>) and functions $group_read = ($mode & S_IRGRP) >> 3; $other_execute = $mode & S_IXOTH; - printf "Permissions are %04o\n", S_ISMODE($mode), "\n"; + printf "Permissions are %04o\n", S_IMODE($mode), "\n"; $is_setuid = $mode & S_ISUID; $is_setgid = S_ISDIR($mode); @@ -5281,7 +5288,7 @@ The commonly available S_IF* constants are and the S_IF* functions are - S_IFMODE($mode) the part of $mode containing the permission bits + S_IMODE($mode) the part of $mode containing the permission bits and the setuid/setgid/sticky bits S_IFMT($mode) the part of $mode containing the file type diff --git a/pod/perlipc.pod b/pod/perlipc.pod index 02f2687419..40693a500d 100644 --- a/pod/perlipc.pod +++ b/pod/perlipc.pod @@ -555,7 +555,7 @@ And here's a safe pipe open for writing: # add error processing as above $pid = open(KID_TO_WRITE, "|-"); - $SIG{ALRM} = sub { die "whoops, $program pipe broke" }; + $SIG{PIPE} = sub { die "whoops, $program pipe broke" }; if ($pid) { # parent for (@data) { @@ -1638,10 +1638,11 @@ version and suggestions from the Perl Porters. There's a lot more to networking than this, but this should get you started. -For intrepid programmers, the indispensable textbook is I<Unix Network -Programming> by W. Richard Stevens (published by Addison-Wesley). Note -that most books on networking address networking from the perspective of -a C programmer; translation to Perl is left as an exercise for the reader. +For intrepid programmers, the indispensable textbook is I<Unix +Network Programming, 2nd Edition, Volume 1> by W. Richard Stevens +(published by Prentice-Hall). Note that most books on networking +address the subject from the perspective of a C programmer; translation +to Perl is left as an exercise for the reader. The IO::Socket(3) manpage describes the object library, and the Socket(3) manpage describes the low-level interface to sockets. Besides the obvious diff --git a/pod/perlmod.pod b/pod/perlmod.pod index d3b087caad..ddcbe47e14 100644 --- a/pod/perlmod.pod +++ b/pod/perlmod.pod @@ -61,7 +61,8 @@ as a pattern match, a substitution, or a transliteration. Variables beginning with underscore used to be forced into package main, but we decided it was more useful for package writers to be able to use leading underscore to indicate private variables and method names. -$_ is still global though. See also +However, variables and functions named with a single C<_>, such as +$_ and C<sub _>, are still forced into the package C<main>. See also L<perlvar/"Technical Note on the Syntax of Variable Names">. C<eval>ed strings are compiled in the package in which the eval() was diff --git a/pod/perlmodlib.PL b/pod/perlmodlib.PL index 982adff21d..1dd79180bc 100644 --- a/pod/perlmodlib.PL +++ b/pod/perlmodlib.PL @@ -7,15 +7,22 @@ my (@pragma, @mod, @MANIFEST); open (MANIFEST, "../MANIFEST") or die $!; @MANIFEST = grep !m</(?:t|demo)/>, <MANIFEST>; -push @MANIFEST, 'lib/Config.pm', 'lib/Errno.pm'; +push @MANIFEST, 'lib/Config.pod', 'lib/Errno.pm', 'lib/lib.pm', + 'lib/DynaLoader.pm', 'lib/XSLoader.pm'; for (@MANIFEST) { my $filename; next unless s|^lib/|| or m|^ext/|; - ($filename) = m|^(\S+)|; + my ($origfilename) = ($filename) = m|^(\S+)|; $filename =~ s|^[^/]+/|| if $filename =~ s|^ext/||; next unless $filename =~ m!\.p(m|od)$!; - next unless open (MOD, "../lib/$filename"); + unless (open (MOD, "../lib/$filename")) { + unless (open (MOD, "../$origfilename")) { + warn "Couldn't open ../$origfilename: $!"; + next; + } + $filename = $origfilename; + } my ($name, $thing); @@ -37,7 +44,9 @@ for (@MANIFEST) { close MOD; my $perlname = $filename; + $perlname =~ s!^.*\b(ext|lib)/!!; $perlname =~ s!\.p(m|od)$!!; + $perlname =~ s!\b(\w+)/\1\b!$1!; $perlname =~ s!/!::!g; ($name, $thing) = split / --? /, $title, 2; @@ -68,13 +77,11 @@ Generated by perlmodlib.PL -- DO NOT EDIT! perlmodlib - constructing new Perl modules and finding existing ones -=head1 DESCRIPTION - =head1 THE PERL MODULE LIBRARY -Many modules are included the Perl distribution. These are described +Many modules are included in the Perl distribution. These are described below, and all end in F<.pm>. You may discover compiled library -file (usually ending in F<.so>) or small pieces of modules to be +files (usually ending in F<.so>) or small pieces of modules to be autoloaded (ending in F<.al>); these were automatically generated by the installation process. You may also discover files in the library directory that end in either F<.pl> or F<.ph>. These are @@ -125,6 +132,10 @@ Standard, bundled modules are all expected to behave in a well-defined manner with respect to namespace pollution because they use the Exporter module. See their own documentation for details. +It's possible that not all modules listed below are installed on your +system. For example, the GDBM_File module will not be installed if you +don't have the gdbm library. + =over 12 EOF @@ -138,8 +149,9 @@ To find out I<all> modules installed on your system, including those without documentation or outside the standard release, just do this: - % find `perl -e 'print "@INC"'` -name '*.pm' -print + % find `perl -Te 'print "@INC"'` -name '*.pm' -print +(The -T is here to prevent '.' from being listed in @INC.) They should all have their own documentation installed and accessible via your system man(1) command. If you do not have a B<find> program, you can use the Perl B<find2perl> program instead, which @@ -148,6 +160,11 @@ have a B<man> program but it doesn't find your modules, you'll have to fix your manpath. See L<perl> for details. If you have no system B<man> command, you might try the B<perldoc> program. +Note also that the command C<perldoc perllocal> gives you a (possibly +incomplete) list of the modules that have been further installed on +your system. (The perllocal.pod file is updated by the standard MakeMaker +install process.) + =head2 Extension Modules Extension modules are written in C (or a mix of Perl and C). They @@ -160,7 +177,7 @@ completely) due to their sizes, volatility, or simply lack of time for adequate testing and configuration across the multitude of platforms on which Perl was beta-tested. You are encouraged to look for them on CPAN (described below), or using web search engines -like Alta Vista or Deja News. +like Alta Vista or Google. =head1 CPAN diff --git a/pod/perlmodlib.pod b/pod/perlmodlib.pod index 9a44bc414d..a23ec1f66b 100644 --- a/pod/perlmodlib.pod +++ b/pod/perlmodlib.pod @@ -5,13 +5,11 @@ Generated by perlmodlib.PL -- DO NOT EDIT! perlmodlib - constructing new Perl modules and finding existing ones -=head1 DESCRIPTION - =head1 THE PERL MODULE LIBRARY -Many modules are included the Perl distribution. These are described +Many modules are included in the Perl distribution. These are described below, and all end in F<.pm>. You may discover compiled library -file (usually ending in F<.so>) or small pieces of modules to be +files (usually ending in F<.so>) or small pieces of modules to be autoloaded (ending in F<.al>); these were automatically generated by the installation process. You may also discover files in the library directory that end in either F<.pl> or F<.ph>. These are @@ -67,7 +65,7 @@ Establish IS-A relationship with base class at compile time =item bigint -Transparent big integer support for Perl +Transparent BigInteger support for Perl =item bignum @@ -75,7 +73,7 @@ Transparent BigNumber support for Perl =item bigrat -Transparent BigNumber/BigRational support for Perl +Transparent BigNumber/BigRationale support for Perl =item blib @@ -121,6 +119,10 @@ Use integer arithmetic instead of floating point Request less of something from the compiler +=item lib + +Manipulate @INC at compile time + =item locale Use and avoid POSIX locales for built-in operations @@ -161,6 +163,10 @@ Predeclare sub names Perl extension allowing use of interpreter based threads from perl +=item threads::shared + +Perl extension for sharing data structures between threads + =item utf8 Enable/disable UTF-8 (or UTF-EBCDIC) in source code @@ -169,6 +175,10 @@ Enable/disable UTF-8 (or UTF-EBCDIC) in source code Predeclare global variable names (obsolete) +=item version + +Perl extension for Version Objects + =item vmsish Control VMS-specific language features @@ -189,6 +199,10 @@ Standard, bundled modules are all expected to behave in a well-defined manner with respect to namespace pollution because they use the Exporter module. See their own documentation for details. +It's possible that not all modules listed below are installed on your +system. For example, the GDBM_File module will not be installed if you +don't have the gdbm library. + =over 12 =item AnyDBM_File @@ -363,6 +377,18 @@ Programmatic interface to the Perl debugging API (draft, subject to Perl5 access to Berkeley DB version 1.x +=item Data::Dumper + +Stringified perl data structures, suitable for both printing and C<eval> + +=item Devel::DProf + +A Perl code profiler + +=item Devel::Peek + +A data debugging tool for the XS programmer + =item Devel::SelfStubber Generate stubs for a SelfLoading module @@ -371,6 +397,10 @@ Generate stubs for a SelfLoading module Modules that calculate message digests +=item Digest::MD5 + +Perl interface to the MD5 Algorithm + =item DirHandle Supply object methods for directory handles @@ -379,10 +409,98 @@ Supply object methods for directory handles Provides screen dump of Perl data. +=item DynaLoader + +Dynamically load C libraries into Perl code + =item Encode Character encodings +=item Encode::Alias + +Alias definitions to encodings + +=item Encode::Byte + +Single Byte Encodings + +=item Encode::CJKConstants + +Internally used by Encode::??::ISO_2022_* + +=item Encode::CN + +China-based Chinese Encodings + +=item Encode::CN::HZ + +Internally used by Encode::CN + +=item Encode::Config + +Internally used by Encode + +=item Encode::EBCDIC + +EBCDIC Encodings + +=item Encode::Encoder + +Object Oriented Encoder + +=item Encode::Encoding + +Encode Implementation Base Class + +=item Encode::Guess + +Guesses encoding from data + +=item Encode::JP + +Japanese Encodings + +=item Encode::JP::H2Z + +Internally used by Encode::JP::2022_JP* + +=item Encode::JP::JIS7 + +Internally used by Encode::JP + +=item Encode::KR + +Korean Encodings + +=item Encode::KR::2022_KR + +Internally used by Encode::KR + +=item Encode::MIME::Header + +MIME 'B' and 'Q' header encoding + +=item Encode::PerlIO + +A detailed document on Encode and PerlIO + +=item Encode::Supported + +Encodings supported by Encode + +=item Encode::Symbol + +Symbol Encodings + +=item Encode::TW + +Taiwan-based Chinese Encodings + +=item Encode::Unicode + +Various Unicode Transformation Formats + =item English Use nice English (or awk) names for ugly punctuation variables @@ -543,6 +661,10 @@ DOS like globbing and then some Traverse a directory tree. +=item File::Glob + +Perl extension for BSD glob routine + =item File::Path Create or remove directory trees @@ -603,10 +725,18 @@ Supply object methods for filehandles Simplified source filtering +=item Filter::Util::Call + +Perl Source Filter Utility Module + =item FindBin Locate directory of original perl script +=item GDBM_File + +Perl5 access to the gdbm library. + =item Getopt::Long Extended processing of command line options @@ -631,10 +761,54 @@ Functions for dealing with RFC3066-style language tags Tags and names for human languages +=item I18N::Langinfo + +Query locale information + =item IO Load various IO modules +=item IO::Dir + +Supply object methods for directory handles + +=item IO::File + +Supply object methods for filehandles + +=item IO::Handle + +Supply object methods for I/O handles + +=item IO::Pipe + +Supply object methods for pipes + +=item IO::Poll + +Object interface to system poll call + +=item IO::Seekable + +Supply seek based methods for I/O objects + +=item IO::Select + +OO interface to the select system call + +=item IO::Socket + +Object interface to socket communications + +=item IO::Socket::INET + +Object interface for AF_INET domain sockets + +=item IO::Socket::UNIX + +Object interface for AF_UNIX domain sockets + =item IPC::Open2 Open a process for both reading and writing @@ -643,6 +817,22 @@ Open a process for both reading and writing Open a process for reading, writing, and error handling +=item IPC::SysV + +SysV IPC constants + +=item IPC::SysV::Msg + +SysV Msg IPC object class + +=item IPC::SysV::Semaphore + +SysV Semaphore IPC object class + +=item List::Util + +A selection of general-utility list subroutines + =item Locale::Constants Constants for Locale codes @@ -671,6 +861,14 @@ Article about software localization ISO codes for script identification (ISO 15924) +=item MIME::Base64 + +Encoding and decoding of base64 strings + +=item MIME::Base64::QuotedPrint + +Encoding and decoding of quoted-printable strings + =item Math::BigFloat Arbitrary size floating point math package @@ -683,9 +881,13 @@ Arbitrary size integer math package Pure Perl module to support Math::BigInt +=item Math::BigInt::Scalar + +Pure Perl module to test Math::BigInt with scalars + =item Math::BigRat -Arbitrarily big rationals +Arbitrarily big rationales =item Math::Complex @@ -815,6 +1017,18 @@ Perl interface to IEEE Std 1003.1 On demand loader for PerlIO layers and root of PerlIO::* name space +=item PerlIO::encoding + +Encoding layer + +=item PerlIO::scalar + +Support module for in-memory IO. + +=item PerlIO::via + +Helper class for PerlIO layers implemented in perl + =item PerlIO::via::QuotedPrint PerlIO layer for quoted-printable strings @@ -895,6 +1109,10 @@ Tied access to sdbm files Compile and execute code in restricted compartments +=item Scalar::Util + +A selection of general-utility scalar subroutines + =item Search::Dict Search for key in dictionary file @@ -927,6 +1145,14 @@ A switch statement for Perl Manipulate Perl symbols and their names +=item Sys::Hostname + +Try every conceivable way to get hostname + +=item Sys::Syslog + +Perl interface to the UNIX syslog(3) calls + =item Term::ANSIColor Color screen output using ANSI escape sequences @@ -941,7 +1167,7 @@ Perl word completion module =item Term::ReadLine -Perl interface to various C<readline> packages. If +Perl interface to various C<readline> packages. =item Test @@ -1015,6 +1241,14 @@ Thread-safe queues Thread-safe semaphores +=item Thread::Signal + +Start a thread which runs signal handlers reliably (for old code) + +=item Thread::Specific + +Thread-specific keys + =item Tie::Array Base class for tied arrays @@ -1047,6 +1281,10 @@ Base class definitions for tied scalars Fixed-table-size, fixed-key-length hashing +=item Time::HiRes + +High resolution alarm, sleep, gettimeofday, interval timers + =item Time::Local Efficiently compute time from local and GMT time @@ -1071,6 +1309,10 @@ Base class for ALL classes (blessed references) Unicode Collation Algorithm +=item Unicode::Normalize + +Unicode Normalization Forms + =item Unicode::UCD Unicode character database @@ -1087,14 +1329,27 @@ By-name interface to Perl's built-in getpw*() functions Interfaces to some Win32 API Functions +=item XS::APItest + +Test the perl C API + +=item XS::Typemap + +Module to test the XS typemaps distributed with perl + +=item XSLoader + +Dynamically load C libraries into Perl code + =back To find out I<all> modules installed on your system, including those without documentation or outside the standard release, just do this: - % find `perl -e 'print "@INC"'` -name '*.pm' -print + % find `perl -Te 'print "@INC"'` -name '*.pm' -print +(The -T is here to prevent '.' from being listed in @INC.) They should all have their own documentation installed and accessible via your system man(1) command. If you do not have a B<find> program, you can use the Perl B<find2perl> program instead, which @@ -1103,6 +1358,11 @@ have a B<man> program but it doesn't find your modules, you'll have to fix your manpath. See L<perl> for details. If you have no system B<man> command, you might try the B<perldoc> program. +Note also that the command C<perldoc perllocal> gives you a (possibly +incomplete) list of the modules that have been further installed on +your system. (The perllocal.pod file is updated by the standard MakeMaker +install process.) + =head2 Extension Modules Extension modules are written in C (or a mix of Perl and C). They @@ -1115,7 +1375,7 @@ completely) due to their sizes, volatility, or simply lack of time for adequate testing and configuration across the multitude of platforms on which Perl was beta-tested. You are encouraged to look for them on CPAN (described below), or using web search engines -like Alta Vista or Deja News. +like Alta Vista or Google. =head1 CPAN diff --git a/pod/perlop.pod b/pod/perlop.pod index 6785d2452e..bc608adfb7 100644 --- a/pod/perlop.pod +++ b/pod/perlop.pod @@ -336,17 +336,27 @@ by the current locale if C<use locale> is in effect. See L<perllocale>. =head2 Bitwise And -Binary "&" returns its operators ANDed together bit by bit. +Binary "&" returns its operands ANDed together bit by bit. (See also L<Integer Arithmetic> and L<Bitwise String Operators>.) +Note that "&" has lower priority than relational operators, so for example +the brackets are essential in a test like + + print "Even\n" if ($x & 1) == 0; + =head2 Bitwise Or and Exclusive Or -Binary "|" returns its operators ORed together bit by bit. +Binary "|" returns its operands ORed together bit by bit. (See also L<Integer Arithmetic> and L<Bitwise String Operators>.) -Binary "^" returns its operators XORed together bit by bit. +Binary "^" returns its operands XORed together bit by bit. (See also L<Integer Arithmetic> and L<Bitwise String Operators>.) +Note that "|" and "^" have lower priority than relational operators, so +for example the brackets are essential in a test like + + print "false\n" if (8 | 2) != 10; + =head2 C-style Logical And Binary "&&" performs a short-circuit logical AND operation. That is, diff --git a/pod/perlopentut.pod b/pod/perlopentut.pod index 6f7f77c432..6d37fb892b 100644 --- a/pod/perlopentut.pod +++ b/pod/perlopentut.pod @@ -5,7 +5,9 @@ perlopentut - tutorial on opening things in Perl =head1 DESCRIPTION Perl has two simple, built-in ways to open files: the shell way for -convenience, and the C way for precision. The choice is yours. +convenience, and the C way for precision. The shell way also has 2- and +3-argument forms, which have different semantics for handling the filename. +The choice is yours. =head1 Open E<agrave> la shell @@ -36,7 +38,7 @@ virtually the same syntax as the shell. The C<open> function takes two arguments: the first is a filehandle, and the second is a single string comprising both what to open and how to open it. C<open> returns true when it works, and when it fails, -returns a false value and sets the special variable $! to reflect +returns a false value and sets the special variable C<$!> to reflect the system error. If the filehandle was previously opened, it will be implicitly closed first. @@ -56,6 +58,14 @@ If you prefer the low-punctuation version, you could write that this way: A few things to notice. First, the leading less-than is optional. If omitted, Perl assumes that you want to open the file for reading. +Note also that the first example uses the C<||> logical operator, and the +second uses C<or>, which has lower precedence. Using C<||> in the latter +examples would effectively mean + + open INFO, ( "< datafile" || die "can't open datafile: $!" ); + +which is definitely not what you want. + The other important thing to notice is that, just as in the shell, any white space before or after the filename is ignored. This is good, because you wouldn't want these to do different things: @@ -64,8 +74,8 @@ because you wouldn't want these to do different things: open INFO, "< datafile" open INFO, "< datafile" -Ignoring surround whitespace also helps for when you read a filename in -from a different file, and forget to trim it before opening: +Ignoring surrounding whitespace also helps for when you read a filename +in from a different file, and forget to trim it before opening: $filename = <INFO>; # oops, \n still there open(EXTRA, "< $filename") || die "can't open $filename: $!"; @@ -76,6 +86,44 @@ also does so with respect to extra white space around the filename itself as well. For accessing files with naughty names, see L<"Dispelling the Dweomer">. +There is also a 3-argument version of C<open>, which lets you put the +special redirection characters into their own argument: + + open( INFO, ">", $datafile ) || die "Can't create $datafile: $!"; + +In this case, the filename to open is the actual string in C<$datafile>, +so you don't have to worry about C<$datafile> containing characters +that might influence the open mode, or whitespace at the beginning of +the filename that would be absorbed in the 2-argument version. Also, +any reduction of unnecessary string interpolation is a good thing. + +=head2 Indirect Filehandles + +C<open>'s first argument can be a reference to a filehandle. As of +perl 5.6.0, if the argument is uninitialized, Perl will automatically +create a filehandle and put a reference to it in the first argument, +like so: + + open( my $in, $infile ) or die "Couldn't read $infile: $!"; + while ( <$in> ) { + # do something with $_ + } + close $in; + +Indirect filehandles make namespace management easier. Since filehandles +are global to the current package, two subroutines trying to open +C<INFILE> will clash. With two functions opening indirect filehandles +like C<my $infile>, there's no clash and no need to worry about future +conflicts. + +Another convenient behavior is that an indirect filehandle automatically +closes when it goes out of scope or when you undefine it: + + sub firstline { + open( my $in, shift ) && return scalar <$in>; + # no close() required + } + =head2 Pipe Opens In C, when you want to open a file using the standard I/O library, @@ -85,7 +133,7 @@ character. That's also the case for Perl. The C<open> call remains the same--just its argument differs. If the leading character is a pipe symbol, C<open> starts up a new -command and open a write-only filehandle leading into that command. +command and opens a write-only filehandle leading into that command. This lets you write into that handle and have what you write show up on that command's standard input. For example: @@ -98,7 +146,7 @@ read-only filehandle leading out of that command. This lets whatever that command writes to its standard output show up on your handle for reading. For example: - open(NET, "netstat -i -n |") || die "can't fun netstat: $!"; + open(NET, "netstat -i -n |") || die "can't fork netstat: $!"; while (<NET>) { } # do something with input close(NET) || die "can't close netstat: $!"; @@ -164,7 +212,7 @@ a binary file as in the WTMP case above, you probably don't want to use this approach for updating. Instead, Perl's B<-i> flag comes to the rescue. The following command takes all the C, C++, or yacc source or header files and changes all their foo's to bar's, leaving -the old version in the original file name with a ".orig" tacked +the old version in the original filename with a ".orig" tacked on the end: $ perl -i.orig -pe 's/\bfoo\b/bar/g' *.[Cchy] @@ -197,7 +245,7 @@ in these circumstances. You are welcome to pre-process your @ARGV before starting the loop to make sure it's to your liking. One reason to do this might be to remove command options beginning with a minus. While you can always roll the -simple ones by hand, the Getopts modules are good for this. +simple ones by hand, the Getopts modules are good for this: use Getopt::Std; @@ -250,10 +298,10 @@ That program will read from the file F<f1>, the process F<cmd1>, standard input (F<tmpfile> in this case), the F<f2> file, the F<cmd2> command, and finally the F<f3> file. -Yes, this also means that if you have a file named "-" (and so on) in -your directory, that they won't be processed as literal files by C<open>. -You'll need to pass them as "./-" much as you would for the I<rm> program. -Or you could use C<sysopen> as described below. +Yes, this also means that if you have files named "-" (and so on) in +your directory, they won't be processed as literal files by C<open>. +You'll need to pass them as "./-", much as you would for the I<rm> program, +or you could use C<sysopen> as described below. One of the more interesting applications is to change files of a certain name into pipes. For example, to autoprocess gzipped or compressed @@ -273,7 +321,7 @@ Pretty nifty, eh? If you want the convenience of the shell, then Perl's C<open> is definitely the way to go. On the other hand, if you want finer precision -than C's simplistic fopen(3S) provides, then you should look to Perl's +than C's simplistic fopen(3S) provides you should look to Perl's C<sysopen>, which is a direct hook into the open(2) system call. That does mean it's a bit more involved, but that's the price of precision. @@ -310,14 +358,14 @@ systems include C<O_BINARY>, C<O_TEXT>, C<O_SHLOCK>, C<O_EXLOCK>, C<O_DEFER>, C<O_SYNC>, C<O_ASYNC>, C<O_DSYNC>, C<O_RSYNC>, C<O_NOCTTY>, C<O_NDELAY> and C<O_LARGEFILE>. Consult your open(2) manpage or its local equivalent for details. (Note: starting from -Perl release 5.6 the O_LARGEFILE flag, if available, is automatically +Perl release 5.6 the C<O_LARGEFILE> flag, if available, is automatically added to the sysopen() flags because large files are the default.) Here's how to use C<sysopen> to emulate the simple C<open> calls we had before. We'll omit the C<|| die $!> checks for clarity, but make sure you always check the return values in real code. These aren't quite the same, since C<open> will trim leading and trailing white space, -but you'll get the idea: +but you'll get the idea. To open a file for reading: @@ -341,7 +389,7 @@ To open a file for update, where the file must already exist: sysopen(FH, $path, O_RDWR); And here are things you can do with C<sysopen> that you cannot do with -a regular C<open>. As you see, it's just a matter of controlling the +a regular C<open>. As you'll see, it's just a matter of controlling the flags in the third argument. To open a file for writing, creating a new file which must not previously @@ -379,7 +427,7 @@ in the created files' permissions field. For example, if your C<umask> were 027, then the 020 part would disable the group from writing, and the 007 part would disable others from reading, writing, or executing. Under these conditions, passing -C<sysopen> 0666 would create a file with mode 0640, since C<0666 &~ 027> +C<sysopen> 0666 would create a file with mode 0640, since C<0666 & ~027> is 0640. You should seldom use the MASK argument to C<sysopen()>. That takes @@ -463,7 +511,7 @@ to C<sysopen>. To open a file with arbitrary weird characters in it, it's necessary to protect any leading and trailing whitespace. Leading whitespace is protected by inserting a C<"./"> in front of a filename that starts with whitespace. Trailing whitespace is protected -by appending an ASCII NUL byte (C<"\0">) at the end off the string. +by appending an ASCII NUL byte (C<"\0">) at the end of the string. $file =~ s#^(\s)#./$1#; open(FH, "< $file\0") || die "can't open $file: $!"; @@ -501,9 +549,9 @@ produce messages like: Some warning at scriptname line 29, <FH> line 7. That's because you opened a filehandle FH, and had read in seven records -from it. But what was the name of the file, not the handle? +from it. But what was the name of the file, rather than the handle? -If you aren't running with C<strict refs>, or if you've turn them off +If you aren't running with C<strict refs>, or if you've turned them off temporarily, then all you have to do is this: open($path, "< $path") || die "can't open $path: $!"; @@ -608,7 +656,7 @@ What other kinds of files are there than, well, files? Directories, symbolic links, named pipes, Unix-domain sockets, and block and character devices. Those are all files, too--just not I<plain> files. This isn't the same issue as being a text file. Not all text files are plain files. -Not all plain files are textfiles. That's why there are separate C<-f> +Not all plain files are text files. That's why there are separate C<-f> and C<-T> file tests. To open a directory, you should use the C<opendir> function, then @@ -622,8 +670,8 @@ name if necessary: closedir(DIR); If you want to process directories recursively, it's better to use the -File::Find module. For example, this prints out all files recursively, -add adds a slash to their names if the file is a directory. +File::Find module. For example, this prints out all files recursively +and adds a slash to their names if the file is a directory. @ARGV = qw(.) unless @ARGV; use File::Find; @@ -645,13 +693,15 @@ C<readlink> is called for: } } +=head2 Opening Named Pipes + Named pipes are a different matter. You pretend they're regular files, but their opens will normally block until there is both a reader and a writer. You can read more about them in L<perlipc/"Named Pipes">. Unix-domain sockets are rather different beasts as well; they're described in L<perlipc/"Unix-Domain TCP Clients and Servers">. -When it comes to opening devices, it can be easy and it can tricky. +When it comes to opening devices, it can be easy and it can be tricky. We'll assume that if you're opening up a block device, you know what you're doing. The character devices are more interesting. These are typically used for modems, mice, and some kinds of printers. This is @@ -669,8 +719,8 @@ It's often enough to open them carefully: print TTYOUT "+++at\015"; $answer = <TTYIN>; -With descriptors that you haven't opened using C<sysopen>, such as a -socket, you can set them to be non-blocking using C<fcntl>: +With descriptors that you haven't opened using C<sysopen>, such as +sockets, you can set them to be non-blocking using C<fcntl>: use Fcntl; fcntl(Connection, F_SETFL, O_NONBLOCK) @@ -685,6 +735,8 @@ and then L<POSIX>, which describes Perl's interface to POSIX. There are also some high-level modules on CPAN that can help you with these games. Check out Term::ReadKey and Term::ReadLine. +=head2 Opening Sockets + What else can you open? To open a connection using sockets, you won't use one of Perl's two open functions. See L<perlipc/"Sockets: Client/Server Communication"> for that. Here's an @@ -720,13 +772,13 @@ handles before doing regular I/O on them: Passing C<sysopen> a non-standard flag option will also open the file in binary mode on those systems that support it. This is the equivalent of -opening the file normally, then calling C<binmode>ing on the handle. +opening the file normally, then calling C<binmode> on the handle. sysopen(BINDAT, "records.data", O_RDWR | O_BINARY) || die "can't open records.data: $!"; Now you can use C<read> and C<print> on that handle without worrying -about the system non-standard I/O library breaking your data. It's not +about the non-standard system I/O library breaking your data. It's not a pretty picture, but then, legacy systems seldom are. CP/M will be with us until the end of days, and after. @@ -745,18 +797,20 @@ such difficulties include Unix, the Mac OS, Plan 9, and Inferno. =head2 File Locking In a multitasking environment, you may need to be careful not to collide -with other processes who want to do I/O on the same files as others +with other processes who want to do I/O on the same files as you are working on. You'll often need shared or exclusive locks on files for reading and writing respectively. You might just pretend that only exclusive locks exist. Never use the existence of a file C<-e $file> as a locking indication, because there is a race condition between the test for the existence of -the file and its creation. Atomicity is critical. +the file and its creation. It's possible for another process to create +a file in the slice of time between your existence check and your attempt +to create the file. Atomicity is critical. Perl's most portable locking interface is via the C<flock> function, -whose simplicity is emulated on systems that don't directly support it, -such as SysV or WindowsNT. The underlying semantics may affect how +whose simplicity is emulated on systems that don't directly support it +such as SysV or Windows. The underlying semantics may affect how it all works, so you should learn how C<flock> is implemented on your system's port of Perl. @@ -842,8 +896,8 @@ how to increment a number in a file safely: In Perl 5.8.0 a new I/O framework called "PerlIO" was introduced. This is a new "plumbing" for all the I/O happening in Perl; for the -most part everything will work just as it did, but PerlIO brought in -also some new features, like the capability of think of I/O as "layers". +most part everything will work just as it did, but PerlIO also brought +in some new features such as the ability to think of I/O as "layers". One I/O layer may in addition to just moving the data also do transformations on the data. Such transformations may include compression and decompression, encryption and decryption, and transforming @@ -856,7 +910,7 @@ tutorial, but here is how to recognize the layers being used: =item * -The three-(or more)-argument form of C<open()> is being used and the +The three-(or more)-argument form of C<open> is being used and the second argument contains something else in addition to the usual C<< '<' >>, C<< '>' >>, C<< '>>' >>, C<< '|' >> and their variants, for example: @@ -865,7 +919,7 @@ for example: =item * -The two-argument form of C<binmode<open()> is being used, for example +The two-argument form of C<binmode> is being used, for example binmode($fh, ":encoding(utf16)"); @@ -876,8 +930,8 @@ for more detailed discussion about Unicode and I/O see L<perluniintro>. =head1 SEE ALSO -The C<open> and C<sysopen> function in perlfunc(1); -the standard open(2), dup(2), fopen(3), and fdopen(3) manpages; +The C<open> and C<sysopen> functions in perlfunc(1); +the system open(2), dup(2), fopen(3), and fdopen(3) manpages; the POSIX documentation. =head1 AUTHOR and COPYRIGHT diff --git a/pod/perlpacktut.pod b/pod/perlpacktut.pod index 2c5f1ec8d0..ac7a01a6b8 100644 --- a/pod/perlpacktut.pod +++ b/pod/perlpacktut.pod @@ -373,7 +373,7 @@ you have to import it with C<use Config>.) s! S! sizeof(short) $Config{shortsize} i! I! sizeof(int) $Config{intsize} l! L! sizeof(long) $Config{longsize} - q! Q! sizeof(longlong) $Config{longlongsize} + q! Q! sizeof(long long) $Config{longlongsize} The C<i!> and C<I!> codes aren't different from C<i> and C<I>; they are tolerated for completeness' sake. @@ -836,7 +836,7 @@ program? Here's a C program that does the trick: #define Pt(struct,field,tchar) \ printf( "@%d%s ", offsetof(struct,field), # tchar ); - int main(){ + int main() { Pt( gappy_t, fc1, c ); Pt( gappy_t, fs, s! ); Pt( gappy_t, fc2, c ); diff --git a/pod/perlport.pod b/pod/perlport.pod index fffb1bc1d5..e373696416 100644 --- a/pod/perlport.pod +++ b/pod/perlport.pod @@ -188,9 +188,9 @@ The Unix column assumes that you are not accessing a serial line "\n", and "\n" on output becomes CRLF. These are just the most common definitions of C<\n> and C<\r> in Perl. -There may well be others. For example, on an EBCDIC implementation such -as z/OS or OS/400 the above material is similar to "Unix" but the code -numbers change: +There may well be others. For example, on an EBCDIC implementation +such as z/OS (OS/390) or OS/400 (using the ILE, the PASE is ASCII-based) +the above material is similar to "Unix" but the code numbers change: LF eq \025 eq \x15 eq chr(21) eq CP-1047 21 LF eq \045 eq \x25 eq \cU eq chr(37) eq CP-0037 37 @@ -1156,7 +1156,9 @@ Character Code Set ID 0037 for OS/400 and either 1047 or POSIX-BC for S/390 systems). On the mainframe perl currently works under the "Unix system services for OS/390" (formerly known as OpenEdition), VM/ESA OpenEdition, or the BS200 POSIX-BC system (BS2000 is supported in perl 5.6 and greater). -See L<perlos390> for details. +See L<perlos390> for details. Note that for OS/400 there is also a port of +Perl 5.8.1/5.9.0 or later to the PASE which is ASCII-based (as opposed to +ILE which is EBCDIC-based), see L<perlos400>. As of R2.5 of USS for OS/390 and Version 2.3 of VM/ESA these Unix sub-systems do not support the C<#!> shebang trick for script invocation. @@ -2069,7 +2071,7 @@ First public release with perl5.005. =head1 Supported Platforms -As of June 2002 (the Perl release 5.8.0), the following platforms are +As of July 2002 (the Perl release 5.8.0), the following platforms are able to build Perl from the standard source code distribution available at http://www.cpan.org/src/index.html @@ -2094,6 +2096,7 @@ available at http://www.cpan.org/src/index.html OpenBSD OpenVMS (VMS) OS/2 + OS/400 (using the PASE) (since Perl 5.8.1/5.9.0) PowerUX POSIX-BC (BS2000) QNX @@ -2177,7 +2180,7 @@ binaries available via http://www.cpan.org/ports/ Perl release - OS/400 5.005_02 + OS/400 (ILE) 5.005_02 Tandem Guardian 5.004 The following platforms have only binaries available via @@ -2200,9 +2203,10 @@ L<perlaix>, L<perlamiga>, L<perlapollo>, L<perlbeos>, L<perlbs2000>, L<perlce>, L<perlcygwin>, L<perldgux>, L<perldos>, L<perlepoc>, L<perlebcdic>, L<perlfreebsd>, L<perlhurd>, L<perlhpux>, L<perlirix>, L<perlmachten>, L<perlmacos>, L<perlmint>, L<perlmpeix>, -L<perlnetware>, L<perlos2>, L<perlos390>, L<perlplan9>, L<perlqnx>, -L<perlsolaris>, L<perltru64>, L<perlunicode>, L<perlvmesa>, -L<perlvms>, L<perlvos>, L<perlwin32>, and L<Win32>. +L<perlnetware>, L<perlos2>, L<perlos390>, L<perlos400>, +L<perlplan9>, L<perlqnx>, L<perlsolaris>, L<perltru64>, +L<perlunicode>, L<perlvmesa>, L<perlvms>, L<perlvos>, +L<perlwin32>, and L<Win32>. =head1 AUTHORS / CONTRIBUTORS diff --git a/pod/perlre.pod b/pod/perlre.pod index bb521139ca..5e99fd3af5 100644 --- a/pod/perlre.pod +++ b/pod/perlre.pod @@ -121,7 +121,8 @@ The following standard quantifiers are recognized: {n,m} Match at least n but not more than m times (If a curly bracket occurs in any other context, it is treated -as a regular character.) The "*" modifier is equivalent to C<{0,}>, the "+" +as a regular character. In particular, the lower bound +is not optional.) The "*" modifier is equivalent to C<{0,}>, the "+" modifier to C<{1,}>, and the "?" modifier to C<{0,1}>. n and m are limited to integral values less than a preset limit defined when perl is built. This is usually 32766 on the most common platforms. The actual limit can diff --git a/pod/perlsec.pod b/pod/perlsec.pod index d5effd90db..2e1fda3704 100644 --- a/pod/perlsec.pod +++ b/pod/perlsec.pod @@ -44,14 +44,6 @@ directories, or processes, B<with the following exceptions>: =item * -If you pass more than one argument to either C<system> or C<exec>, -the arguments are checked for taintedness B<but> the operation will still -be attempted, emitting an optional warning. This will be fatal in a -future version of perl so do not rely on it to bypass the tainting -mechanism. - -=item * - Arguments to C<print> and C<syswrite> are B<not> checked for taintedness. =item * @@ -92,7 +84,7 @@ For example: $data = 'abc'; # Not tainted system "echo $arg"; # Insecure - system "/bin/echo", $arg; # Allowed but considered insecure + system "/bin/echo", $arg; # Considered insecure # (Perl doesn't know about /bin/echo) system "echo $hid"; # Insecure system "echo $data"; # Insecure until PATH set @@ -110,7 +102,7 @@ For example: open(FOO,"echo $arg|"); # Not OK open(FOO,"-|") - or exec 'echo', $arg; # Allowed but not really OK + or exec 'echo', $arg; # Also not OK $shout = `echo $arg`; # Insecure, $shout now tainted @@ -118,8 +110,8 @@ For example: umask $arg; # Insecure exec "echo $arg"; # Insecure - exec "echo", $arg; # Allowed but considered insecure - exec "sh", '-c', $arg; # Considered secure, alas! + exec "echo", $arg; # Insecure + exec "sh", '-c', $arg; # Very insecure! @files = <*.c>; # insecure (uses readdir() or similar) @files = glob('*.c'); # insecure (uses readdir() or similar) @@ -133,10 +125,7 @@ For example: $arg, `true`; # Insecure (although it isn't really) If you try to do something insecure, you will get a fatal error saying -something like "Insecure dependency" or "Insecure $ENV{PATH}". Note that you -can still write an insecure B<system> or B<exec>, but only by explicitly -doing something like the "considered secure" example above. This will not -be possible in a future version of Perl. +something like "Insecure dependency" or "Insecure $ENV{PATH}". =head2 Laundering and Detecting Tainted Data diff --git a/pod/perlthrtut.pod b/pod/perlthrtut.pod index cafcbb21a6..575ec27c52 100644 --- a/pod/perlthrtut.pod +++ b/pod/perlthrtut.pod @@ -1016,10 +1016,15 @@ calls, they will be used. Beyond that, Perl is at the mercy of the thread-safety or -unsafety of the calls. Please consult your C library call documentation. -In some platforms the thread-safe interfaces may fail if the result -buffer is too small (for example getgrent() may return quite large -group member lists). Perl will retry growing the result buffer -a few times, but only up to 64k (for safety reasons). +On some platforms the thread-safe library interfaces may fail if the +result buffer is too small (for example the user group databases may +be rather large, and the reentrant interfaces may have to carry around +a full snapshot of those databases). Perl will start with a small +buffer, but keep retrying and growing the result buffer +until the result fits. If this limitless growing sounds bad for +security or memory consumption reasons you can recompile Perl with +PERL_REENTRANT_MAXSIZE defined to the maximum number of bytes you will +allow. =head1 Conclusion diff --git a/pod/perltie.pod b/pod/perltie.pod index adc557d71c..72288a08a2 100644 --- a/pod/perltie.pod +++ b/pod/perltie.pod @@ -258,7 +258,9 @@ index whose value we're trying to fetch. If a negative array index is used to read from an array, the index will be translated to a positive one internally by calling FETCHSIZE -before being passed to FETCH. +before being passed to FETCH. You may disable this feature by +assigning a true value to the variable C<$NEGATIVE_INDICES> in the +tied array class. As you may have noticed, the name of the FETCH method (et al.) is the same for all accesses, even though the constructors differ in names (TIESCALAR diff --git a/pod/perltodo.pod b/pod/perltodo.pod index a19dfd87ee..0dbff75e5c 100644 --- a/pod/perltodo.pod +++ b/pod/perltodo.pod @@ -810,7 +810,8 @@ http://lists.perl.org/ , http://archive.develooper.com/ =head2 Bug tracking -Richard Foley has written the bug tracking system at http://bugs.perl.org/ +Since 5.8.0 perl uses the RT bug tracking system from Jesse Vincent, +implemented by Robert Spier at http://bugs.perl.org/ =head2 Integrate MacPerl diff --git a/pod/perltooc.pod b/pod/perltooc.pod index fdddb02531..667f9fc202 100644 --- a/pod/perltooc.pod +++ b/pod/perltooc.pod @@ -624,7 +624,7 @@ The astonishing thing about the Cosmos class above is that the value returned by the &bigbang "constructor" is not a reference to a blessed object at all. It's just the class's own name. A class name is, for virtually all intents and purposes, a perfectly acceptable object. -It has state, behavior, and identify, the three crucial components +It has state, behavior, and identity, the three crucial components of an object system. It even manifests inheritance, polymorphism, and encapsulation. And what more can you ask of an object? @@ -692,7 +692,7 @@ that happens to be named &spawn. print $obj3->color(); # prints "vermilion" Each of these objects' colors is now "vermilion", because that's the -meta-object's value that attribute, and these objects do not have +meta-object's value for that attribute, and these objects do not have individual color values set. Changing the attribute on one object has no effect on other objects diff --git a/pod/perlunicode.pod b/pod/perlunicode.pod index 8489702fd5..bf21206a94 100644 --- a/pod/perlunicode.pod +++ b/pod/perlunicode.pod @@ -598,21 +598,14 @@ than one Unicode character. =back -The following cases do not yet work: +Things to do with locales (Lithuanian, Turkish, Azeri) do B<not> work +since Perl does not understand the concept of Unicode locales. -=over 8 - -=item * - -the "final sigma" (Greek), and - -=item * - -anything to with locales (Lithuanian, Turkish, Azeri). +See the Unicode Technical Report #21, Case Mappings, for more details. =back -See the Unicode Technical Report #21, Case Mappings, for more details. +=over 4 =item * @@ -739,13 +732,13 @@ Level 1 - Basic Unicode Support or user-defined character properties [b] to emulate subtraction [ 7] include Letters in word characters [ 8] note that Perl does Full case-folding in matching, not Simple: - for example U+1F88 is equivalent with U+1F000 U+03B9, + for example U+1F88 is equivalent with U+1F00 U+03B9, not with 1F80. This difference matters for certain Greek capital letters with certain modifiers: the Full case-folding decomposes the letter, while the Simple case-folding would map it to a single character. [ 9] see UTR#13 Unicode Newline Guidelines - [10] should do ^ and $ also on \x{85}, \x{2028} and \x{2029}) + [10] should do ^ and $ also on \x{85}, \x{2028} and \x{2029} (should also affect <>, $., and script line numbers) (the \x{85}, \x{2028} and \x{2029} do match \s) @@ -771,17 +764,19 @@ which will match assigned characters known to be part of the Greek script. Level 2 - Extended Unicode Support - 3.1 Surrogates - MISSING - 3.2 Canonical Equivalents - MISSING [11][12] - 3.3 Locale-Independent Graphemes - MISSING [13] - 3.4 Locale-Independent Words - MISSING [14] - 3.5 Locale-Independent Loose Matches - MISSING [15] + 3.1 Surrogates - MISSING [11] + 3.2 Canonical Equivalents - MISSING [12][13] + 3.3 Locale-Independent Graphemes - MISSING [14] + 3.4 Locale-Independent Words - MISSING [15] + 3.5 Locale-Independent Loose Matches - MISSING [16] - [11] see UTR#15 Unicode Normalization - [12] have Unicode::Normalize but not integrated to regexes - [13] have \X but at this level . should equal that - [14] need three classes, not just \w and \W - [15] see UTR#21 Case Mappings + [11] Surrogates are solely a UTF-16 concept and Perl's internal + representation is UTF-8. The Encode module does UTF-16, though. + [12] see UTR#15 Unicode Normalization + [13] have Unicode::Normalize but not integrated to regexes + [14] have \X but at this level . should equal that + [15] need three classes, not just \w and \W + [16] see UTR#21 Case Mappings =item * @@ -1252,6 +1247,114 @@ Even though the algorithm based on C<substr()> is faster than C<split()> for byte-encoded data, it pales in comparison to the speed of C<split()> when used with UTF-8 data. +=head2 Porting code from perl-5.6.X + +Perl 5.8 has a different Unicode model from 5.6. In 5.6 the programmer +was required to use the C<utf8> pragma to declare that a given scope +expected to deal with Unicode data and had to make sure that only +Unicode data were reaching that scope. If you have code that is +working with 5.6, you will need some of the following adjustments to +your code. The examples are written such that the code will continue +to work under 5.6, so you should be safe to try them out. + +=over 4 + +=item * + +A filehandle that should read or write UTF-8 + + if ($] > 5.007) { + binmode $fh, ":utf8"; + } + +=item * + +A scalar that is going to be passed to some extension + +Be it Compress::Zlib, Apache::Request or any extension that has no +mention of Unicode in the manpage, you need to make sure that the +UTF-8 flag is stripped off. Note that at the time of this writing +(October 2002) the mentioned modules are not UTF-8-aware. Please +check the documentation to verify if this is still true. + + if ($] > 5.007) { + require Encode; + $val = Encode::encode_utf8($val); # make octets + } + +=item * + +A scalar we got back from an extension + +If you believe the scalar comes back as UTF-8, you will most likely +want the UTF-8 flag restored: + + if ($] > 5.007) { + require Encode; + $val = Encode::decode_utf8($val); + } + +=item * + +Same thing, if you are really sure it is UTF-8 + + if ($] > 5.007) { + require Encode; + Encode::_utf8_on($val); + } + +=item * + +A wrapper for fetchrow_array and fetchrow_hashref + +When the database contains only UTF-8, a wrapper function or method is +a convenient way to replace all your fetchrow_array and +fetchrow_hashref calls. A wrapper function will also make it easier to +adapt to future enhancements in your database driver. Note that at the +time of this writing (October 2002), the DBI has no standardized way +to deal with UTF-8 data. Please check the documentation to verify if +that is still true. + + sub fetchrow { + my($self, $sth, $what) = @_; # $what is one of fetchrow_{array,hashref} + if ($] < 5.007) { + return $sth->$what; + } else { + require Encode; + if (wantarray) { + my @arr = $sth->$what; + for (@arr) { + defined && /[^\000-\177]/ && Encode::_utf8_on($_); + } + return @arr; + } else { + my $ret = $sth->$what; + if (ref $ret) { + for my $k (keys %$ret) { + defined && /[^\000-\177]/ && Encode::_utf8_on($_) for $ret->{$k}; + } + return $ret; + } else { + defined && /[^\000-\177]/ && Encode::_utf8_on($_) for $ret; + return $ret; + } + } + } + } + + +=item * + +A large scalar that you know can only contain ASCII + +Scalars that contain only ASCII and are marked as UTF-8 are sometimes +a drag to your program. If you recognize such a situation, just remove +the UTF-8 flag: + + utf8::downgrade($val) if $] > 5.007; + +=back + =head1 SEE ALSO L<perluniintro>, L<encoding>, L<Encode>, L<open>, L<utf8>, L<bytes>, diff --git a/pod/perluniintro.pod b/pod/perluniintro.pod index 870926ea1f..21f0fa7600 100644 --- a/pod/perluniintro.pod +++ b/pod/perluniintro.pod @@ -398,9 +398,9 @@ written to the stream. For example, the following snippet copies the contents of the file "text.jis" (encoded as ISO-2022-JP, aka JIS) to the file "text.utf8", encoded as UTF-8: - open(my $nihongo, '<:encoding(iso2022-jp)', 'text.jis'); - open(my $unicode, '>:utf8', 'text.utf8'); - while (<$nihongo>) { print $unicode } + open(my $nihongo, '<:encoding(iso-2022-jp)', 'text.jis'); + open(my $unicode, '>:utf8', 'text.utf8'); + while (<$nihongo>) { print $unicode $_ } The naming of encodings, both by the C<open()> and by the C<open> pragma, is similar to the C<encoding> pragma in that it allows for @@ -862,7 +862,7 @@ If you have the GNU recode installed, you can also use the Perl front-end C<Convert::Recode> for character conversions. The following are fast conversions from ISO 8859-1 (Latin-1) bytes -to UTF-8 bytes, the code works even with older Perl 5 versions. +to UTF-8 bytes and back, the code works even with older Perl 5 versions. # ISO 8859-1 to UTF-8 s/([\x80-\xFF])/chr(0xC0|ord($1)>>6).chr(0x80|ord($1)&0x3F)/eg; diff --git a/pod/perlvar.pod b/pod/perlvar.pod index e522b3d036..258645e80a 100644 --- a/pod/perlvar.pod +++ b/pod/perlvar.pod @@ -769,6 +769,12 @@ The process number of the Perl running this script. You should consider this variable read-only, although it will be altered across fork() calls. (Mnemonic: same as shells.) +Note for Linux users: on Linux, the C functions C<getpid()> and +C<getppid()> return different values from different threads. In order to +be portable, this behavior is not reflected by C<$$>, whose value remains +consistent across threads. If you want to call the underlying C<getpid()>, +you may use the CPAN module C<Linux::Pid>. + =item $REAL_USER_ID =item $UID @@ -1467,8 +1473,9 @@ used safely in programs. C<$^_> itself, however, I<is> reserved. Perl identifiers that begin with digits, control characters, or punctuation characters are exempt from the effects of the C<package> -declaration and are always forced to be in package C<main>. A few -other names are also exempt: +declaration and are always forced to be in package C<main>; they are +also exempt from C<strict 'vars'> errors. A few other names are also +exempt in these ways: ENV STDIN INC STDOUT @@ -1478,7 +1485,7 @@ other names are also exempt: In particular, the new special C<${^_XYZ}> variables are always taken to be in package C<main>, regardless of any C<package> declarations -presently in scope. +presently in scope. =head1 BUGS diff --git a/pod/perlxstut.pod b/pod/perlxstut.pod index c2d51c7a71..ceb65e0b5b 100644 --- a/pod/perlxstut.pod +++ b/pod/perlxstut.pod @@ -210,7 +210,7 @@ that looks like this: Mytest::hello(); -Now we make the script executable (C<chmod -x hello>), run the script +Now we make the script executable (C<chmod +x hello>), run the script and we should see the following output: % ./hello @@ -692,7 +692,7 @@ makes these functions visible from Perl interpreter. Pay a special attention to the function C<constant>. This name appears twice in the generated .xs file: once in the first part, as a static C -function, the another time in the second part, when an XSUB interface to +function, then another time in the second part, when an XSUB interface to this static C function is defined. This is quite typical for .xs files: usually the .xs file provides diff --git a/pod/pod2text.PL b/pod/pod2text.PL index 53270dd3ab..0486e2da0a 100644 --- a/pod/pod2text.PL +++ b/pod/pod2text.PL @@ -78,8 +78,8 @@ my %options; $options{sentence} = 0; Getopt::Long::config ('bundling'); GetOptions (\%options, 'alt|a', 'code', 'color|c', 'help|h', 'indent|i=i', - 'loose|l', 'overstrike|o', 'quotes|q=s', 'sentence|s', - 'termcap|t', 'width|w=i') or exit 1; + 'loose|l', 'margin|left-margin|m=i', 'overstrike|o', + 'quotes|q=s', 'sentence|s', 'termcap|t', 'width|w=i') or exit 1; pod2usage (1) if $options{help}; # Figure out what formatter we're going to use. -c overrides -t. @@ -162,6 +162,12 @@ printed after C<=head1>, although one is still printed after C<=head2>, because this is the expected formatting for manual pages; if you're formatting arbitrary text documents, using this option is recommended. +=item B<-m> I<width>, B<--left-margin>=I<width>, B<--margin>=I<width> + +The width of the left margin in spaces. Defaults to 0. This is the margin +for all text, including headings, not the amount by which regular text is +indented; for the latter, see B<-i> option. + =item B<-o>, B<--overstrike> Format the output with overstruck printing. Bold text is rendered as @@ -19,8 +19,6 @@ #include "reentr.h" -/* variations on pp_null */ - /* XXX I can't imagine anyone who doesn't have this actually _needs_ it, since pid_t is an integral type. --AD 2/20/1998 @@ -29,6 +27,8 @@ extern Pid_t getpid (void); #endif +/* variations on pp_null */ + PP(pp_stub) { dSP; @@ -47,6 +47,7 @@ PP(pp_scalar) PP(pp_padav) { dSP; dTARGET; + I32 gimme; if (PL_op->op_private & OPpLVAL_INTRO) SAVECLEARSV(PL_curpad[PL_op->op_targ]); EXTEND(SP, 1); @@ -59,7 +60,8 @@ PP(pp_padav) PUSHs(TARG); RETURN; } - if (GIMME == G_ARRAY) { + gimme = GIMME_V; + if (gimme == G_ARRAY) { I32 maxarg = AvFILL((AV*)TARG) + 1; EXTEND(SP, maxarg); if (SvMAGICAL(TARG)) { @@ -74,7 +76,7 @@ PP(pp_padav) } SP += maxarg; } - else { + else if (gimme == G_SCALAR) { SV* sv = sv_newmortal(); I32 maxarg = AvFILL((AV*)TARG) + 1; sv_setiv(sv, maxarg); @@ -4611,8 +4613,12 @@ PP(pp_split) iters++; } else if (!origlimit) { - while (iters > 0 && (!TOPs || !SvANY(TOPs) || SvCUR(TOPs) == 0)) - iters--, SP--; + while (iters > 0 && (!TOPs || !SvANY(TOPs) || SvCUR(TOPs) == 0)) { + if (TOPs && !make_mortal) + sv_2mortal(TOPs); + iters--; + SP--; + } } if (realarray) { @@ -836,7 +836,7 @@ PP(pp_mapwhile) } /* copy the new items down to the destination list */ dst = PL_stack_base + (PL_markstack_ptr[-2] += items) - 1; - while (items--) + while (items-- > 0) *dst-- = SvTEMP(TOPs) ? POPs : sv_mortalcopy(POPs); } LEAVE; /* exit inner scope */ @@ -943,10 +943,14 @@ PP(pp_flop) if (SvGMAGICAL(right)) mg_get(right); + /* This code tries to decide if "$left .. $right" should use the + magical string increment, or if the range is numeric (we make + an exception for .."0" [#18165]). AMS 20021031. */ + if (SvNIOKp(left) || !SvPOKp(left) || SvNIOKp(right) || !SvPOKp(right) || (looks_like_number(left) && *SvPVX(left) != '0' && - looks_like_number(right) && *SvPVX(right) != '0')) + looks_like_number(right))) { if (SvNV(left) < IV_MIN || SvNV(right) > IV_MAX) DIE(aTHX_ "Range iterator outside integer range"); @@ -3188,7 +3192,7 @@ PP(pp_require) RETPUSHUNDEF; } else - SETERRNO(0, SS$_NORMAL); + SETERRNO(0, SS_NORMAL); /* Assume success here to prevent recursive requirement. */ len = strlen(name); @@ -571,7 +571,7 @@ PP(pp_print) goto had_magic; if (ckWARN2(WARN_UNOPENED,WARN_CLOSED)) report_evil_fh(gv, io, PL_op->op_type); - SETERRNO(EBADF,RMS$_IFI); + SETERRNO(EBADF,RMS_IFI); goto just_say_no; } else if (!(fp = IoOFP(io))) { @@ -581,7 +581,7 @@ PP(pp_print) else if (ckWARN2(WARN_UNOPENED,WARN_CLOSED)) report_evil_fh(gv, io, PL_op->op_type); } - SETERRNO(EBADF,IoIFP(io)?RMS$_FAC:RMS$_IFI); + SETERRNO(EBADF,IoIFP(io)?RMS_FAC:RMS_IFI); goto just_say_no; } else { @@ -1454,8 +1454,11 @@ Perl_do_readline(pTHX) call_method("READLINE", gimme); LEAVE; SPAGAIN; - if (gimme == G_SCALAR) - SvSetMagicSV_nosteal(TARG, TOPs); + if (gimme == G_SCALAR) { + SV* result = POPs; + SvSetSV_nosteal(TARG, result); + PUSHTARG; + } RETURN; } fp = Nullfp; @@ -1513,10 +1516,14 @@ Perl_do_readline(pTHX) tmplen = SvLEN(sv); /* remember if already alloced */ if (!tmplen) Sv_Grow(sv, 80); /* try short-buffering it */ - if (type == OP_RCATLINE) + offset = 0; + if (type == OP_RCATLINE && SvOK(sv)) { + if (!SvPOK(sv)) { + STRLEN n_a; + (void)SvPV_force(sv, n_a); + } offset = SvCUR(sv); - else - offset = 0; + } } else { sv = sv_2mortal(NEWSV(57, 80)); @@ -2286,7 +2286,7 @@ Perl_pack_cat(pTHX_ SV *cat, char *pat, register char *patend, register SV **beg /* Copy string and check for compliance */ from = SvPV(fromstr, len); if ((norm = is_an_int(from, len)) == NULL) - Perl_croak(aTHX_ "can compress only unsigned integer"); + Perl_croak(aTHX_ "Can only compress unsigned integers"); New('w', result, len, char); in = result + len; @@ -2299,15 +2299,25 @@ Perl_pack_cat(pTHX_ SV *cat, char *pat, register char *patend, register SV **beg SvREFCNT_dec(norm); /* free norm */ } else if (SvNOKp(fromstr)) { - char buf[sizeof(NV) * 2]; /* 8/7 <= 2 */ + /* 10**NV_MAX_10_EXP is the largest power of 10 + so 10**(NV_MAX_10_EXP+1) is definately unrepresentable + given 10**(NV_MAX_10_EXP+1) == 128 ** x solve for x: + x = (NV_MAX_10_EXP+1) * log (10) / log (128) + And with that many bytes only Inf can overflow. + */ +#ifdef NV_MAX_10_EXP + char buf[1 + (int)((NV_MAX_10_EXP + 1) * 0.47456)]; +#else + char buf[1 + (int)((308 + 1) * 0.47456)]; +#endif char *in = buf + sizeof(buf); anv = Perl_floor(anv); do { NV next = Perl_floor(anv / 128); - *--in = (unsigned char)(anv - (next * 128)) | 0x80; if (in <= buf) /* this cannot happen ;-) */ Perl_croak(aTHX_ "Cannot compress integer"); + *--in = (unsigned char)(anv - (next * 128)) | 0x80; anv = next; } while (anv > 0); buf[sizeof(buf) - 1] &= 0x7f; /* clear continue bit */ @@ -2322,7 +2332,7 @@ Perl_pack_cat(pTHX_ SV *cat, char *pat, register char *patend, register SV **beg /* Copy string and check for compliance */ from = SvPV(fromstr, len); if ((norm = is_an_int(from, len)) == NULL) - Perl_croak(aTHX_ "can compress only unsigned integer"); + Perl_croak(aTHX_ "Can only compress unsigned integers"); New('w', result, len, char); in = result + len; @@ -457,7 +457,7 @@ PP(pp_die) } else { tmpsv = TOPs; - tmps = (SvROK(tmpsv) && PL_in_eval) ? Nullch : SvPV(tmpsv, len); + tmps = SvROK(tmpsv) ? Nullch : SvPV(tmpsv, len); } if (!tmps || !len) { SV *error = ERRSV; @@ -1447,7 +1447,7 @@ PP(pp_prtf) if (!(io = GvIO(gv))) { if (ckWARN2(WARN_UNOPENED,WARN_CLOSED)) report_evil_fh(gv, io, PL_op->op_type); - SETERRNO(EBADF,RMS$_IFI); + SETERRNO(EBADF,RMS_IFI); goto just_say_no; } else if (!(fp = IoOFP(io))) { @@ -1469,7 +1469,7 @@ PP(pp_prtf) else if (ckWARN(WARN_CLOSED)) report_evil_fh(gv, io, PL_op->op_type); } - SETERRNO(EBADF,IoIFP(io)?RMS$_FAC:RMS$_IFI); + SETERRNO(EBADF,IoIFP(io)?RMS_FAC:RMS_IFI); goto just_say_no; } else { @@ -2121,7 +2121,7 @@ PP(pp_truncate) if (result) RETPUSHYES; if (!errno) - SETERRNO(EBADF,RMS$_IFI); + SETERRNO(EBADF,RMS_IFI); RETPUSHUNDEF; } #else @@ -2148,7 +2148,7 @@ PP(pp_ioctl) if (!io || !argsv || !IoIFP(io)) { if (ckWARN2(WARN_UNOPENED,WARN_CLOSED)) report_evil_fh(gv, io, PL_op->op_type); - SETERRNO(EBADF,RMS$_IFI); /* well, sort of... */ + SETERRNO(EBADF,RMS_IFI); /* well, sort of... */ RETPUSHUNDEF; } @@ -2236,7 +2236,7 @@ PP(pp_flock) if (ckWARN2(WARN_UNOPENED,WARN_CLOSED)) report_evil_fh(gv, io, PL_op->op_type); value = 0; - SETERRNO(EBADF,RMS$_IFI); + SETERRNO(EBADF,RMS_IFI); } PUSHi(value); RETURN; @@ -2266,7 +2266,7 @@ PP(pp_socket) report_evil_fh(gv, io, PL_op->op_type); if (IoIFP(io)) do_close(gv, FALSE); - SETERRNO(EBADF,LIB$_INVARG); + SETERRNO(EBADF,LIB_INVARG); RETPUSHUNDEF; } @@ -2417,7 +2417,7 @@ PP(pp_bind) nuts: if (ckWARN(WARN_CLOSED)) report_evil_fh(gv, io, PL_op->op_type); - SETERRNO(EBADF,SS$_IVCHAN); + SETERRNO(EBADF,SS_IVCHAN); RETPUSHUNDEF; #else DIE(aTHX_ PL_no_sock_func, "bind"); @@ -2447,7 +2447,7 @@ PP(pp_connect) nuts: if (ckWARN(WARN_CLOSED)) report_evil_fh(gv, io, PL_op->op_type); - SETERRNO(EBADF,SS$_IVCHAN); + SETERRNO(EBADF,SS_IVCHAN); RETPUSHUNDEF; #else DIE(aTHX_ PL_no_sock_func, "connect"); @@ -2473,7 +2473,7 @@ PP(pp_listen) nuts: if (ckWARN(WARN_CLOSED)) report_evil_fh(gv, io, PL_op->op_type); - SETERRNO(EBADF,SS$_IVCHAN); + SETERRNO(EBADF,SS_IVCHAN); RETPUSHUNDEF; #else DIE(aTHX_ PL_no_sock_func, "listen"); @@ -2540,7 +2540,7 @@ PP(pp_accept) nuts: if (ckWARN(WARN_CLOSED)) report_evil_fh(ggv, ggv ? GvIO(ggv) : 0, PL_op->op_type); - SETERRNO(EBADF,SS$_IVCHAN); + SETERRNO(EBADF,SS_IVCHAN); badexit: RETPUSHUNDEF; @@ -2567,7 +2567,7 @@ PP(pp_shutdown) nuts: if (ckWARN(WARN_CLOSED)) report_evil_fh(gv, io, PL_op->op_type); - SETERRNO(EBADF,SS$_IVCHAN); + SETERRNO(EBADF,SS_IVCHAN); RETPUSHUNDEF; #else DIE(aTHX_ PL_no_sock_func, "shutdown"); @@ -2646,7 +2646,7 @@ PP(pp_ssockopt) nuts: if (ckWARN(WARN_CLOSED)) report_evil_fh(gv, io, optype); - SETERRNO(EBADF,SS$_IVCHAN); + SETERRNO(EBADF,SS_IVCHAN); nuts2: RETPUSHUNDEF; @@ -2719,7 +2719,7 @@ PP(pp_getpeername) nuts: if (ckWARN(WARN_CLOSED)) report_evil_fh(gv, io, optype); - SETERRNO(EBADF,SS$_IVCHAN); + SETERRNO(EBADF,SS_IVCHAN); nuts2: RETPUSHUNDEF; @@ -3325,7 +3325,7 @@ PP(pp_fttext) gv = cGVOP_gv; report_evil_fh(gv, GvIO(gv), PL_op->op_type); } - SETERRNO(EBADF,RMS$_IFI); + SETERRNO(EBADF,RMS_IFI); RETPUSHUNDEF; } } @@ -3654,21 +3654,21 @@ S_dooneliner(pTHX_ char *cmd, char *filename) #define EACCES EPERM #endif if (instr(s, "cannot make")) - SETERRNO(EEXIST,RMS$_FEX); + SETERRNO(EEXIST,RMS_FEX); else if (instr(s, "existing file")) - SETERRNO(EEXIST,RMS$_FEX); + SETERRNO(EEXIST,RMS_FEX); else if (instr(s, "ile exists")) - SETERRNO(EEXIST,RMS$_FEX); + SETERRNO(EEXIST,RMS_FEX); else if (instr(s, "non-exist")) - SETERRNO(ENOENT,RMS$_FNF); + SETERRNO(ENOENT,RMS_FNF); else if (instr(s, "does not exist")) - SETERRNO(ENOENT,RMS$_FNF); + SETERRNO(ENOENT,RMS_FNF); else if (instr(s, "not empty")) - SETERRNO(EBUSY,SS$_DEVOFFLINE); + SETERRNO(EBUSY,SS_DEVOFFLINE); else if (instr(s, "cannot access")) - SETERRNO(EACCES,RMS$_PRV); + SETERRNO(EACCES,RMS_PRV); else - SETERRNO(EPERM,RMS$_PRV); + SETERRNO(EPERM,RMS_PRV); return 0; } else { /* some mkdirs return no failure indication */ @@ -3678,7 +3678,7 @@ S_dooneliner(pTHX_ char *cmd, char *filename) if (anum) SETERRNO(0,0); else - SETERRNO(EACCES,RMS$_PRV); /* a guess */ + SETERRNO(EACCES,RMS_PRV); /* a guess */ } return anum; } @@ -3714,7 +3714,7 @@ PP(pp_mkdir) * -d, chdir(), chmod(), chown(), chroot(), fcntl()?, * (mkdir()), opendir(), rename(), rmdir(), stat(). --jhi */ if (len > 1 && tmps[len-1] == '/') { - while (tmps[len] == '/' && len > 1) + while (tmps[len-1] == '/' && len > 1) len--; tmps = savepvn(tmps, len); copy = TRUE; @@ -3772,7 +3772,7 @@ PP(pp_open_dir) RETPUSHYES; nope: if (!errno) - SETERRNO(EBADF,RMS$_DIR); + SETERRNO(EBADF,RMS_DIR); RETPUSHUNDEF; #else DIE(aTHX_ PL_no_dir_func, "opendir"); @@ -3827,7 +3827,7 @@ PP(pp_readdir) nope: if (!errno) - SETERRNO(EBADF,RMS$_ISI); + SETERRNO(EBADF,RMS_ISI); if (GIMME == G_ARRAY) RETURN; else @@ -3858,7 +3858,7 @@ PP(pp_telldir) RETURN; nope: if (!errno) - SETERRNO(EBADF,RMS$_ISI); + SETERRNO(EBADF,RMS_ISI); RETPUSHUNDEF; #else DIE(aTHX_ PL_no_dir_func, "telldir"); @@ -3881,7 +3881,7 @@ PP(pp_seekdir) RETPUSHYES; nope: if (!errno) - SETERRNO(EBADF,RMS$_ISI); + SETERRNO(EBADF,RMS_ISI); RETPUSHUNDEF; #else DIE(aTHX_ PL_no_dir_func, "seekdir"); @@ -3902,7 +3902,7 @@ PP(pp_rewinddir) RETPUSHYES; nope: if (!errno) - SETERRNO(EBADF,RMS$_ISI); + SETERRNO(EBADF,RMS_ISI); RETPUSHUNDEF; #else DIE(aTHX_ PL_no_dir_func, "rewinddir"); @@ -3932,7 +3932,7 @@ PP(pp_closedir) RETPUSHYES; nope: if (!errno) - SETERRNO(EBADF,RMS$_IFI); + SETERRNO(EBADF,RMS_IFI); RETPUSHUNDEF; #else DIE(aTHX_ PL_no_dir_func, "closedir"); @@ -3960,6 +3960,9 @@ PP(pp_fork) sv_setiv(GvSV(tmpgv), (IV)PerlProc_getpid()); SvREADONLY_on(GvSV(tmpgv)); } +#ifdef THREADS_HAVE_PIDS + PL_ppid = (IV)getppid(); +#endif hv_clear(PL_pidstatus); /* no kids, so don't wait for 'em */ } PUSHi(childpid); @@ -4048,24 +4051,14 @@ PP(pp_system) I32 did_pipes = 0; if (PL_tainting) { - int some_arg_tainted = 0; TAINT_ENV(); while (++MARK <= SP) { (void)SvPV_nolen(*MARK); /* stringify for taint check */ - if (PL_tainted) { - some_arg_tainted = 1; + if (PL_tainted) break; - } } MARK = ORIGMARK; - /* XXX Remove warning at end of deprecation cycle --RD 2002-02 */ - if (SP - MARK == 1) { - TAINT_PROPER("system"); - } - else if (some_arg_tainted && ckWARN2(WARN_TAINT, WARN_DEPRECATED)) { - Perl_warner(aTHX_ packWARN2(WARN_TAINT, WARN_DEPRECATED), - "Use of tainted arguments in %s is deprecated", "system"); - } + TAINT_PROPER("system"); } PERL_FLUSHALL_FOR_CHILD; #if (defined(HAS_FORK) || defined(AMIGAOS)) && !defined(VMS) && !defined(OS2) || defined(PERL_MICRO) @@ -4186,24 +4179,14 @@ PP(pp_exec) STRLEN n_a; if (PL_tainting) { - int some_arg_tainted = 0; TAINT_ENV(); while (++MARK <= SP) { (void)SvPV_nolen(*MARK); /* stringify for taint check */ - if (PL_tainted) { - some_arg_tainted = 1; + if (PL_tainted) break; - } } MARK = ORIGMARK; - /* XXX Remove warning at end of deprecation cycle --RD 2002-02 */ - if (SP - MARK == 1) { - TAINT_PROPER("exec"); - } - else if (some_arg_tainted && ckWARN2(WARN_TAINT, WARN_DEPRECATED)) { - Perl_warner(aTHX_ packWARN2(WARN_TAINT, WARN_DEPRECATED), - "Use of tainted arguments in %s is deprecated", "exec"); - } + TAINT_PROPER("exec"); } PERL_FLUSHALL_FOR_CHILD; if (PL_op->op_flags & OPf_STACKED) { @@ -4259,7 +4242,11 @@ PP(pp_getppid) { #ifdef HAS_GETPPID dSP; dTARGET; +# ifdef THREADS_HAVE_PIDS + XPUSHi( PL_ppid ); +# else XPUSHi( getppid() ); +# endif RETURN; #else DIE(aTHX_ PL_no_func, "getppid"); @@ -4364,26 +4351,6 @@ PP(pp_time) RETURN; } -/* XXX The POSIX name is CLK_TCK; it is to be preferred - to HZ. Probably. For now, assume that if the system - defines HZ, it does so correctly. (Will this break - on VMS?) - Probably we ought to use _sysconf(_SC_CLK_TCK), if - it's supported. --AD 9/96. -*/ - -#ifdef __BEOS__ -# define HZ 1000000 -#endif - -#ifndef HZ -# ifdef CLK_TCK -# define HZ CLK_TCK -# else -# define HZ 60 -# endif -#endif - PP(pp_tms) { #ifdef HAS_TIMES @@ -4397,11 +4364,11 @@ PP(pp_tms) /* is returned. */ #endif - PUSHs(sv_2mortal(newSVnv(((NV)PL_timesbuf.tms_utime)/HZ))); + PUSHs(sv_2mortal(newSVnv(((NV)PL_timesbuf.tms_utime)/(NV)PL_clocktick))); if (GIMME == G_ARRAY) { - PUSHs(sv_2mortal(newSVnv(((NV)PL_timesbuf.tms_stime)/HZ))); - PUSHs(sv_2mortal(newSVnv(((NV)PL_timesbuf.tms_cutime)/HZ))); - PUSHs(sv_2mortal(newSVnv(((NV)PL_timesbuf.tms_cstime)/HZ))); + PUSHs(sv_2mortal(newSVnv(((NV)PL_timesbuf.tms_stime)/(NV)PL_clocktick))); + PUSHs(sv_2mortal(newSVnv(((NV)PL_timesbuf.tms_cutime)/(NV)PL_clocktick))); + PUSHs(sv_2mortal(newSVnv(((NV)PL_timesbuf.tms_cstime)/(NV)PL_clocktick))); } RETURN; #else @@ -148,6 +148,8 @@ Perl_reentrant_init(pTHX) { #ifdef HAS_CRYPT_R #ifdef __GLIBC__ PL_reentrant_buffer->_crypt_struct.initialized = 0; + /* work around glibc-2.2.5 bug */ + PL_reentrant_buffer->_crypt_struct.current_saltbits = 0; #endif #endif /* HAS_CRYPT_R */ #ifdef HAS_CTIME_R @@ -314,15 +316,17 @@ Perl_reentrant_retry(const char *f, ...) va_start(ap, f); -#define REENTRANTHALFMAXSIZE 32768 /* The maximum may end up twice this. */ - switch (PL_op->op_type) { #ifdef USE_HOSTENT_BUFFER case OP_GHBYADDR: case OP_GHBYNAME: case OP_GHOSTENT: { - if (PL_reentrant_buffer->_hostent_size <= REENTRANTHALFMAXSIZE) { +#ifdef PERL_REENTRANT_MAXSIZE + if (PL_reentrant_buffer->_hostent_size <= + PERL_REENTRANT_MAXSIZE / 2) +#endif + { PL_reentrant_buffer->_hostent_size *= 2; Renew(PL_reentrant_buffer->_hostent_buffer, PL_reentrant_buffer->_hostent_size, char); @@ -341,6 +345,7 @@ Perl_reentrant_retry(const char *f, ...) break; } } + SETERRNO(ERANGE, LIB_INVARG); } break; #endif @@ -349,7 +354,11 @@ Perl_reentrant_retry(const char *f, ...) case OP_GGRGID: case OP_GGRENT: { - if (PL_reentrant_buffer->_grent_size <= REENTRANTHALFMAXSIZE) { +#ifdef PERL_REENTRANT_MAXSIZE + if (PL_reentrant_buffer->_grent_size <= + PERL_REENTRANT_MAXSIZE / 2) +#endif + { Gid_t gid; PL_reentrant_buffer->_grent_size *= 2; Renew(PL_reentrant_buffer->_grent_buffer, @@ -367,6 +376,7 @@ Perl_reentrant_retry(const char *f, ...) break; } } + SETERRNO(ERANGE, LIB_INVARG); } break; #endif @@ -375,7 +385,11 @@ Perl_reentrant_retry(const char *f, ...) case OP_GNBYNAME: case OP_GNETENT: { - if (PL_reentrant_buffer->_netent_size <= REENTRANTHALFMAXSIZE) { +#ifdef PERL_REENTRANT_MAXSIZE + if (PL_reentrant_buffer->_netent_size <= + PERL_REENTRANT_MAXSIZE / 2) +#endif + { Netdb_net_t net; PL_reentrant_buffer->_netent_size *= 2; Renew(PL_reentrant_buffer->_netent_buffer, @@ -394,6 +408,7 @@ Perl_reentrant_retry(const char *f, ...) break; } } + SETERRNO(ERANGE, LIB_INVARG); } break; #endif @@ -402,7 +417,11 @@ Perl_reentrant_retry(const char *f, ...) case OP_GPWUID: case OP_GPWENT: { - if (PL_reentrant_buffer->_pwent_size <= REENTRANTHALFMAXSIZE) { +#ifdef PERL_REENTRANT_MAXSIZE + if (PL_reentrant_buffer->_pwent_size <= + PERL_REENTRANT_MAXSIZE / 2) +#endif + { Uid_t uid; PL_reentrant_buffer->_pwent_size *= 2; Renew(PL_reentrant_buffer->_pwent_buffer, @@ -428,7 +447,11 @@ Perl_reentrant_retry(const char *f, ...) case OP_GPBYNUMBER: case OP_GPROTOENT: { - if (PL_reentrant_buffer->_protoent_size <= REENTRANTHALFMAXSIZE) { +#ifdef PERL_REENTRANT_MAXSIZE + if (PL_reentrant_buffer->_protoent_size <= + PERL_REENTRANT_MAXSIZE / 2) +#endif + { PL_reentrant_buffer->_protoent_size *= 2; Renew(PL_reentrant_buffer->_protoent_buffer, PL_reentrant_buffer->_protoent_size, char); @@ -445,6 +468,7 @@ Perl_reentrant_retry(const char *f, ...) break; } } + SETERRNO(ERANGE, LIB_INVARG); } break; #endif @@ -453,7 +477,11 @@ Perl_reentrant_retry(const char *f, ...) case OP_GSBYPORT: case OP_GSERVENT: { - if (PL_reentrant_buffer->_servent_size <= REENTRANTHALFMAXSIZE) { +#ifdef PERL_REENTRANT_MAXSIZE + if (PL_reentrant_buffer->_servent_size <= + PERL_REENTRANT_MAXSIZE / 2) +#endif + { PL_reentrant_buffer->_servent_size *= 2; Renew(PL_reentrant_buffer->_servent_buffer, PL_reentrant_buffer->_servent_size, char); @@ -472,6 +500,7 @@ Perl_reentrant_retry(const char *f, ...) break; } } + SETERRNO(ERANGE, LIB_INVARG); } break; #endif @@ -457,6 +457,8 @@ EOF push @init, <<EOF; #ifdef __GLIBC__ PL_reentrant_buffer->_${func}_struct.initialized = 0; + /* work around glibc-2.2.5 bug */ + PL_reentrant_buffer->_${func}_struct.current_saltbits = 0; #endif EOF pushssif $endif; @@ -786,15 +788,17 @@ Perl_reentrant_retry(const char *f, ...) va_start(ap, f); -#define REENTRANTHALFMAXSIZE 32768 /* The maximum may end up twice this. */ - switch (PL_op->op_type) { #ifdef USE_HOSTENT_BUFFER case OP_GHBYADDR: case OP_GHBYNAME: case OP_GHOSTENT: { - if (PL_reentrant_buffer->_hostent_size <= REENTRANTHALFMAXSIZE) { +#ifdef PERL_REENTRANT_MAXSIZE + if (PL_reentrant_buffer->_hostent_size <= + PERL_REENTRANT_MAXSIZE / 2) +#endif + { PL_reentrant_buffer->_hostent_size *= 2; Renew(PL_reentrant_buffer->_hostent_buffer, PL_reentrant_buffer->_hostent_size, char); @@ -821,7 +825,11 @@ Perl_reentrant_retry(const char *f, ...) case OP_GGRGID: case OP_GGRENT: { - if (PL_reentrant_buffer->_grent_size <= REENTRANTHALFMAXSIZE) { +#ifdef PERL_REENTRANT_MAXSIZE + if (PL_reentrant_buffer->_grent_size <= + PERL_REENTRANT_MAXSIZE / 2) +#endif + { Gid_t gid; PL_reentrant_buffer->_grent_size *= 2; Renew(PL_reentrant_buffer->_grent_buffer, @@ -847,7 +855,11 @@ Perl_reentrant_retry(const char *f, ...) case OP_GNBYNAME: case OP_GNETENT: { - if (PL_reentrant_buffer->_netent_size <= REENTRANTHALFMAXSIZE) { +#ifdef PERL_REENTRANT_MAXSIZE + if (PL_reentrant_buffer->_netent_size <= + PERL_REENTRANT_MAXSIZE / 2) +#endif + { Netdb_net_t net; PL_reentrant_buffer->_netent_size *= 2; Renew(PL_reentrant_buffer->_netent_buffer, @@ -866,6 +878,7 @@ Perl_reentrant_retry(const char *f, ...) break; } } + SETERRNO(ERANGE, LIB_INVARG); } break; #endif @@ -874,7 +887,11 @@ Perl_reentrant_retry(const char *f, ...) case OP_GPWUID: case OP_GPWENT: { - if (PL_reentrant_buffer->_pwent_size <= REENTRANTHALFMAXSIZE) { +#ifdef PERL_REENTRANT_MAXSIZE + if (PL_reentrant_buffer->_pwent_size <= + PERL_REENTRANT_MAXSIZE / 2) +#endif + { Uid_t uid; PL_reentrant_buffer->_pwent_size *= 2; Renew(PL_reentrant_buffer->_pwent_buffer, @@ -892,6 +909,7 @@ Perl_reentrant_retry(const char *f, ...) break; } } + SETERRNO(ERANGE, LIB_INVARG); } break; #endif @@ -900,7 +918,11 @@ Perl_reentrant_retry(const char *f, ...) case OP_GPBYNUMBER: case OP_GPROTOENT: { - if (PL_reentrant_buffer->_protoent_size <= REENTRANTHALFMAXSIZE) { +#ifdef PERL_REENTRANT_MAXSIZE + if (PL_reentrant_buffer->_protoent_size <= + PERL_REENTRANT_MAXSIZE / 2) +#endif + { PL_reentrant_buffer->_protoent_size *= 2; Renew(PL_reentrant_buffer->_protoent_buffer, PL_reentrant_buffer->_protoent_size, char); @@ -917,6 +939,7 @@ Perl_reentrant_retry(const char *f, ...) break; } } + SETERRNO(ERANGE, LIB_INVARG); } break; #endif @@ -925,7 +948,11 @@ Perl_reentrant_retry(const char *f, ...) case OP_GSBYPORT: case OP_GSERVENT: { - if (PL_reentrant_buffer->_servent_size <= REENTRANTHALFMAXSIZE) { +#ifdef PERL_REENTRANT_MAXSIZE + if (PL_reentrant_buffer->_servent_size <= + PERL_REENTRANT_MAXSIZE / 2) +#endif + { PL_reentrant_buffer->_servent_size *= 2; Renew(PL_reentrant_buffer->_servent_buffer, PL_reentrant_buffer->_servent_size, char); @@ -944,6 +971,7 @@ Perl_reentrant_retry(const char *f, ...) break; } } + SETERRNO(ERANGE, LIB_INVARG); } break; #endif @@ -1306,8 +1306,8 @@ S_study_chunk(pTHX_ RExC_state_t *pRExC_state, regnode **scanp, I32 *deltap, reg } else { /* start offset must point into the last copy */ data->last_start_min += minnext * (mincount - 1); - data->last_start_max += is_inf ? 0 : (maxcount - 1) - * (minnext + data->pos_delta); + data->last_start_max += is_inf ? I32_MAX + : (maxcount - 1) * (minnext + data->pos_delta); } } /* It is counted once already... */ @@ -3304,25 +3304,27 @@ tryagain: /* If the encoding pragma is in effect recode the text of * any EXACT-kind nodes. */ if (PL_encoding && PL_regkind[(U8)OP(ret)] == EXACT) { - STRLEN oldlen = STR_LEN(ret); - SV *sv = sv_2mortal(newSVpvn(STRING(ret), oldlen)); - - if (RExC_utf8) - SvUTF8_on(sv); - if (sv_utf8_downgrade(sv, TRUE)) { - char *s = sv_recode_to_utf8(sv, PL_encoding); - STRLEN newlen = SvCUR(sv); - - if (!SIZE_ONLY) { - DEBUG_r(PerlIO_printf(Perl_debug_log, "recode %*s to %*s\n", - (int)oldlen, STRING(ret), - (int)newlen, s)); - Copy(s, STRING(ret), newlen, char); - STR_LEN(ret) += newlen - oldlen; - RExC_emit += STR_SZ(newlen) - STR_SZ(oldlen); - } else - RExC_size += STR_SZ(newlen) - STR_SZ(oldlen); - } + STRLEN oldlen = STR_LEN(ret); + SV *sv = sv_2mortal(newSVpvn(STRING(ret), oldlen)); + + if (RExC_utf8) + SvUTF8_on(sv); + if (sv_utf8_downgrade(sv, TRUE)) { + char *s = sv_recode_to_utf8(sv, PL_encoding); + STRLEN newlen = SvCUR(sv); + + if (SvUTF8(sv)) + RExC_utf8 = 1; + if (!SIZE_ONLY) { + DEBUG_r(PerlIO_printf(Perl_debug_log, "recode %*s to %*s\n", + (int)oldlen, STRING(ret), + (int)newlen, s)); + Copy(s, STRING(ret), newlen, char); + STR_LEN(ret) += newlen - oldlen; + RExC_emit += STR_SZ(newlen) - STR_SZ(oldlen); + } else + RExC_size += STR_SZ(newlen) - STR_SZ(oldlen); + } } return(ret); @@ -4224,11 +4226,11 @@ S_regclass(pTHX_ RExC_state_t *pRExC_state) SV *rv; /* The 0th element stores the character class description - * in its textual form: used later (regexec.c:Perl_regclass_swatch()) + * in its textual form: used later (regexec.c:Perl_regclass_swash()) * to initialize the appropriate swash (which gets stored in * the 1st element), and also useful for dumping the regnode. * The 2nd element stores the multicharacter foldings, - * used later (regexec.c:s_reginclasslen()). */ + * used later (regexec.c:S_reginclass()). */ av_store(av, 0, listsv); av_store(av, 1, NULL); av_store(av, 2, (SV*)unicode_alternate); @@ -2821,6 +2821,7 @@ S_regmatch(pTHX_ regnode *prog) MAGIC *mg = Null(MAGIC*); re_cc_state state; CHECKPOINT cp, lastcp; + int toggleutf; if(SvROK(ret) || SvRMAGICAL(ret)) { SV *sv = SvROK(ret) ? SvRV(ret) : ret; @@ -2841,6 +2842,7 @@ S_regmatch(pTHX_ regnode *prog) I32 onpar = PL_regnpar; Zero(&pm, 1, PMOP); + if (DO_UTF8(ret)) pm.op_pmdynflags |= PMdf_DYN_UTF8; re = CALLREGCOMP(aTHX_ t, t + len, &pm); if (!(SvFLAGS(ret) & (SVs_TEMP | SVs_PADTMP | SVf_READONLY))) @@ -2873,6 +2875,9 @@ S_regmatch(pTHX_ regnode *prog) *PL_reglastcloseparen = 0; PL_reg_call_cc = &state; PL_reginput = locinput; + toggleutf = ((PL_reg_flags & RF_utf8) != 0) ^ + ((re->reganch & ROPT_UTF8) != 0); + if (toggleutf) PL_reg_flags ^= RF_utf8; /* XXXX This is too dramatic a measure... */ PL_reg_maxiter = 0; @@ -2887,6 +2892,7 @@ S_regmatch(pTHX_ regnode *prog) PL_regcc = state.cc; PL_reg_re = state.re; cache_re(PL_reg_re); + if (toggleutf) PL_reg_flags ^= RF_utf8; /* XXXX This is too dramatic a measure... */ PL_reg_maxiter = 0; @@ -2903,6 +2909,7 @@ S_regmatch(pTHX_ regnode *prog) PL_regcc = state.cc; PL_reg_re = state.re; cache_re(PL_reg_re); + if (toggleutf) PL_reg_flags ^= RF_utf8; /* XXXX This is too dramatic a measure... */ PL_reg_maxiter = 0; @@ -3682,14 +3689,14 @@ S_regmatch(pTHX_ regnode *prog) /* If it could work, try it. */ if (c == (UV)c1 || c == (UV)c2) { - TRYPAREN(paren, n, PL_reginput); + TRYPAREN(paren, ln, PL_reginput); REGCP_UNWIND(lastcp); } } /* If it could work, try it. */ else if (c1 == -1000) { - TRYPAREN(paren, n, PL_reginput); + TRYPAREN(paren, ln, PL_reginput); REGCP_UNWIND(lastcp); } /* Couldn't or didn't -- move forward. */ @@ -2892,7 +2892,7 @@ Perl_sv_2pv_flags(pTHX_ register SV *sv, STRLEN *lp, I32 flags) { register char *s; int olderrno; - SV *tsv; + SV *tsv, *origsv; char tbuf[64]; /* Must fit sprintf/Gconvert of longest IV/NV */ char *tmpbuf = tbuf; @@ -2933,8 +2933,15 @@ Perl_sv_2pv_flags(pTHX_ register SV *sv, STRLEN *lp, I32 flags) if (SvROK(sv)) { SV* tmpstr; if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,string)) && - (SvTYPE(tmpstr) != SVt_RV || (SvRV(tmpstr) != SvRV(sv)))) - return SvPV(tmpstr,*lp); + (SvTYPE(tmpstr) != SVt_RV || (SvRV(tmpstr) != SvRV(sv)))) { + char *pv = SvPV(tmpstr, *lp); + if (SvUTF8(tmpstr)) + SvUTF8_on(sv); + else + SvUTF8_off(sv); + return pv; + } + origsv = sv; sv = (SV*)SvRV(sv); if (!sv) s = "NULLREF"; @@ -2946,7 +2953,6 @@ Perl_sv_2pv_flags(pTHX_ register SV *sv, STRLEN *lp, I32 flags) if ( ((SvFLAGS(sv) & (SVs_OBJECT|SVf_OK|SVs_GMG|SVs_SMG|SVs_RMG)) == (SVs_OBJECT|SVs_RMG)) - && strEQ(s=HvNAME(SvSTASH(sv)), "Regexp") && (mg = mg_find(sv, PERL_MAGIC_qr))) { regexp *re = (regexp *)mg->mg_obj; @@ -3002,6 +3008,7 @@ Perl_sv_2pv_flags(pTHX_ register SV *sv, STRLEN *lp, I32 flags) need a newline */ mg->mg_len++; /* save space for it */ need_newline = 1; /* note to add it */ + break; } } } @@ -3017,6 +3024,11 @@ Perl_sv_2pv_flags(pTHX_ register SV *sv, STRLEN *lp, I32 flags) mg->mg_ptr[mg->mg_len] = 0; } PL_reginterp_cnt += re->program[0].next_off; + + if (re->reganch & ROPT_UTF8) + SvUTF8_on(origsv); + else + SvUTF8_off(origsv); *lp = mg->mg_len; return mg->mg_ptr; } @@ -3192,28 +3204,14 @@ would lose the UTF-8'ness of the PV. void Perl_sv_copypv(pTHX_ SV *dsv, register SV *ssv) { - SV *tmpsv; - - if ( SvTHINKFIRST(ssv) && SvROK(ssv) && SvAMAGIC(ssv) && - (tmpsv = AMG_CALLun(ssv,string))) { - if (SvTYPE(tmpsv) != SVt_RV || (SvRV(tmpsv) != SvRV(ssv))) { - SvSetSV(dsv,tmpsv); - return; - } - } else { - tmpsv = sv_newmortal(); - } - { - STRLEN len; - char *s; - s = SvPV(ssv,len); - sv_setpvn(tmpsv,s,len); - if (SvUTF8(ssv)) - SvUTF8_on(tmpsv); - else - SvUTF8_off(tmpsv); - SvSetSV(dsv,tmpsv); - } + STRLEN len; + char *s; + s = SvPV(ssv,len); + sv_setpvn(dsv,s,len); + if (SvUTF8(ssv)) + SvUTF8_on(dsv); + else + SvUTF8_off(dsv); } /* @@ -7706,7 +7704,7 @@ Perl_sv_vcatpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV } if (!args && svix < svmax && DO_UTF8(*svargs)) - has_utf8 = TRUE; + has_utf8 = TRUE; patend = (char*)pat + patlen; for (p = (char*)pat; p < patend; p = q) { @@ -7723,7 +7721,12 @@ Perl_sv_vcatpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV bool has_precis = FALSE; STRLEN precis = 0; bool is_utf8 = FALSE; /* is this item utf8? */ - +#ifdef HAS_LDBL_SPRINTF_BUG + /* This is to try to fix a bug with irix/nonstop-ux/powerux and + with sfio - Allen <allens@cpan.org> */ + bool fix_ldbl_sprintf_bug = FALSE; +#endif + char esignbuf[4]; U8 utf8buf[UTF8_MAXLEN+1]; STRLEN esignlen = 0; @@ -7734,7 +7737,7 @@ Perl_sv_vcatpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV * NV_DIG: mantissa takes than many decimal digits. * Plus 32: Playing safe. */ char ebuf[IV_DIG * 4 + NV_DIG + 32]; - /* large enough for "%#.#f" --chip */ + /* large enough for "%#.#f" --chip */ /* what about long double NVs? --jhi */ SV *vecsv = Nullsv; @@ -7943,7 +7946,7 @@ Perl_sv_vcatpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV #endif case 'l': #if defined(HAS_QUAD) || defined(HAS_LONG_DOUBLE) - if (*(q + 1) == 'l') { /* lld, llf */ + if (*(q + 1) == 'l') { /* lld, llf */ intsize = 'q'; q += 2; break; @@ -8291,10 +8294,10 @@ Perl_sv_vcatpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV nv = (args && !vectorize) ? #if LONG_DOUBLESIZE > DOUBLESIZE intsize == 'q' ? - va_arg(*args, long double) : - va_arg(*args, double) + va_arg(*args, long double) : + va_arg(*args, double) #else - va_arg(*args, double) + va_arg(*args, double) #endif : SvNVx(argsv); @@ -8311,9 +8314,76 @@ Perl_sv_vcatpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV need = BIT_DIGITS(i); } need += has_precis ? precis : 6; /* known default */ + if (need < width) need = width; +#ifdef HAS_LDBL_SPRINTF_BUG + /* This is to try to fix a bug with irix/nonstop-ux/powerux and + with sfio - Allen <allens@cpan.org> */ + +# ifdef DBL_MAX +# define MY_DBL_MAX DBL_MAX +# else /* XXX guessing! HUGE_VAL may be defined as infinity, so not using */ +# if DOUBLESIZE >= 8 +# define MY_DBL_MAX 1.7976931348623157E+308L +# else +# define MY_DBL_MAX 3.40282347E+38L +# endif +# endif + +# ifdef HAS_LDBL_SPRINTF_BUG_LESS1 /* only between -1L & 1L - Allen */ +# define MY_DBL_MAX_BUG 1L +# else +# define MY_DBL_MAX_BUG MY_DBL_MAX +# endif + +# ifdef DBL_MIN +# define MY_DBL_MIN DBL_MIN +# else /* XXX guessing! -Allen */ +# if DOUBLESIZE >= 8 +# define MY_DBL_MIN 2.2250738585072014E-308L +# else +# define MY_DBL_MIN 1.17549435E-38L +# endif +# endif + + if ((intsize == 'q') && (c == 'f') && + ((nv < MY_DBL_MAX_BUG) && (nv > -MY_DBL_MAX_BUG)) && + (need < DBL_DIG)) { + /* it's going to be short enough that + * long double precision is not needed */ + + if ((nv <= 0L) && (nv >= -0L)) + fix_ldbl_sprintf_bug = TRUE; /* 0 is 0 - easiest */ + else { + /* would use Perl_fp_class as a double-check but not + * functional on IRIX - see perl.h comments */ + + if ((nv >= MY_DBL_MIN) || (nv <= -MY_DBL_MIN)) { + /* It's within the range that a double can represent */ +#if defined(DBL_MAX) && !defined(DBL_MIN) + if ((nv >= ((long double)1/DBL_MAX)) || + (nv <= (-(long double)1/DBL_MAX))) +#endif + fix_ldbl_sprintf_bug = TRUE; + } + } + if (fix_ldbl_sprintf_bug == TRUE) { + double temp; + + intsize = 0; + temp = (double)nv; + nv = (NV)temp; + } + } + +# undef MY_DBL_MAX +# undef MY_DBL_MAX_BUG +# undef MY_DBL_MIN + +#endif /* HAS_LDBL_SPRINTF_BUG */ + need += 20; /* fudge factor */ if (PL_efloatsize < need) { Safefree(PL_efloatbuf); @@ -10030,6 +10100,7 @@ perl_clone_using(PerlInterpreter *proto_perl, UV flags, PL_beginav = av_dup_inc(proto_perl->Ibeginav, param); PL_beginav_save = av_dup_inc(proto_perl->Ibeginav_save, param); + PL_checkav_save = av_dup_inc(proto_perl->Icheckav_save, param); PL_endav = av_dup_inc(proto_perl->Iendav, param); PL_checkav = av_dup_inc(proto_perl->Icheckav, param); PL_initav = av_dup_inc(proto_perl->Iinitav, param); @@ -10546,16 +10617,17 @@ char * Perl_sv_recode_to_utf8(pTHX_ SV *sv, SV *encoding) { if (SvPOK(sv) && !DO_UTF8(sv) && SvROK(encoding)) { - SV *uni; - STRLEN len; - char *s; - dSP; - ENTER; - SAVETMPS; - PUSHMARK(sp); - EXTEND(SP, 3); - XPUSHs(encoding); - XPUSHs(sv); + int vary = FALSE; + SV *uni; + STRLEN len; + char *s; + dSP; + ENTER; + SAVETMPS; + PUSHMARK(sp); + EXTEND(SP, 3); + XPUSHs(encoding); + XPUSHs(sv); /* NI-S 2002/07/09 Passing sv_yes is wrong - it needs to be or'ed set of constants @@ -10564,23 +10636,32 @@ Perl_sv_recode_to_utf8(pTHX_ SV *sv, SV *encoding) Both will default the value - let them. - XPUSHs(&PL_sv_yes); + XPUSHs(&PL_sv_yes); */ - PUTBACK; - call_method("decode", G_SCALAR); - SPAGAIN; - uni = POPs; - PUTBACK; - s = SvPV(uni, len); - if (s != SvPVX(sv)) { - SvGROW(sv, len + 1); - Move(s, SvPVX(sv), len, char); - SvCUR_set(sv, len); - SvPVX(sv)[len] = 0; - } - FREETMPS; - LEAVE; - SvUTF8_on(sv); + PUTBACK; + call_method("decode", G_SCALAR); + SPAGAIN; + uni = POPs; + PUTBACK; + s = SvPV(uni, len); + { + U8 *t = (U8 *)s, *e = (U8 *)s + len; + while (t < e) { + if ((vary = !UTF8_IS_INVARIANT(*t++))) + break; + } + } + if (s != SvPVX(sv)) { + SvGROW(sv, len + 1); + Move(s, SvPVX(sv), len, char); + SvCUR_set(sv, len); + SvPVX(sv)[len] = 0; + } + FREETMPS; + LEAVE; + if (vary) + SvUTF8_on(sv); + SvUTF8_on(sv); } return SvPVX(sv); } @@ -152,7 +152,7 @@ perform the upgrade if necessary. See C<svtype>. # define ATOMIC_DEC_AND_TEST(res, count) (res = (--count == 0)) #endif /* USE_5005THREADS */ -#ifdef __GNUC__ +#if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC) # define SvREFCNT_inc(sv) \ ({ \ SV *nsv = (SV*)(sv); \ @@ -207,7 +207,7 @@ perform the upgrade if necessary. See C<svtype>. #define SVp_POK 0x04000000 /* has valid non-public pointer value */ #define SVp_SCREAM 0x08000000 /* has been studied? */ -#define SVf_UTF8 0x20000000 /* SvPVX is UTF-8 encoded */ +#define SVf_UTF8 0x20000000 /* SvPV is UTF-8 encoded */ #define SVf_THINKFIRST (SVf_READONLY|SVf_ROK|SVf_FAKE) @@ -995,7 +995,7 @@ otherwise. #define SvPVutf8x_force(sv, lp) sv_pvutf8n_force(sv, &lp) #define SvPVbytex_force(sv, lp) sv_pvbyten_force(sv, &lp) -#ifdef __GNUC__ +#if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC) # define SvIVx(sv) ({SV *nsv = (SV*)(sv); SvIV(nsv); }) # define SvUVx(sv) ({SV *nsv = (SV*)(sv); SvUV(nsv); }) diff --git a/t/TestInit.pm b/t/TestInit.pm index f33ee1294b..b90e150e56 100644 --- a/t/TestInit.pm +++ b/t/TestInit.pm @@ -17,6 +17,7 @@ package TestInit; chdir 't' if -d 't'; @INC = '../lib'; +$ENV{PERL_CORE} = 1; $0 =~ s/\.dp$//; # for the test.deparse make target 1; diff --git a/t/base/num.t b/t/base/num.t index 97fa312893..6a93355d3a 100644 --- a/t/base/num.t +++ b/t/base/num.t @@ -1,6 +1,6 @@ #!./perl -print "1..45\n"; +print "1..50\n"; # First test whether the number stringification works okay. # (Testing with == would exercize the IV/NV part, not the PV.) @@ -69,7 +69,7 @@ $a = -1.; "$a"; print $a + 1 == 0 ? "ok 19\n" : "not ok 19 #" . $a + 1 . "\n"; sub ok { # Can't assume too much of floating point numbers. - my ($a, $b, $c); + my ($a, $b, $c) = @_; abs($a - $b) <= $c; } @@ -164,3 +164,24 @@ print $a eq "123.456" ? "ok 44\n" : "not ok 44 # $a\n"; $a = 1e34; "$a"; print $a eq "1e+34" || $a eq "1e+034" ? "ok 45\n" : "not ok 45 $a\n"; + +# see bug #15073 + +$a = 0.00049999999999999999999999999999999999999; +$b = 0.0005000000000000000104; +print $a <= $b ? "ok 46\n" : "not ok 46\n"; + +$a = 0.00000000000000000000000000000000000000000000000000000000000000000001; +print $a > 0 ? "ok 47\n" : "not ok 47\n"; + +$a = 80000.0000000000000000000000000; +print $a == 80000.0 ? "ok 48\n" : "not ok 48\n"; + +$a = 1.0000000000000000000000000000000000000000000000000000000000000000000e1; +print $a == 10.0 ? "ok 49\n" : "not ok 49\n"; + +# From Math/Trig - number has to be long enough to exceed at least DBL_DIG + +$a = 57.295779513082320876798154814169; +print ok($a*10,572.95779513082320876798154814169,1e-10) ? "ok 50\n" : + "not ok 50 # $a\n"; diff --git a/t/comp/hints.t b/t/comp/hints.t index 5911b77688..117096860f 100644 --- a/t/comp/hints.t +++ b/t/comp/hints.t @@ -1,36 +1,57 @@ -#!./perl -w +#!./perl -BEGIN { print "1..7\n"; } +# Tests the scoping of $^H and %^H + +BEGIN { print "1..14\n"; } BEGIN { print "not " if exists $^H{foo}; print "ok 1 - \$^H{foo} doesn't exist initially\n"; + print "not " if $^H & 0x00020000; + print "ok 2 - \$^H doesn't contain HINT_LOCALIZE_HH initially\n"; } { # simulate a pragma -- don't forget HINT_LOCALIZE_HH BEGIN { $^H |= 0x00020000; $^H{foo} = "a"; } BEGIN { print "not " if $^H{foo} ne "a"; - print "ok 2 - \$^H{foo} is now 'a'\n"; + print "ok 3 - \$^H{foo} is now 'a'\n"; + print "not " unless $^H & 0x00020000; + print "ok 4 - \$^H contains HINT_LOCALIZE_HH while compiling\n"; } { BEGIN { $^H |= 0x00020000; $^H{foo} = "b"; } BEGIN { print "not " if $^H{foo} ne "b"; - print "ok 3 - \$^H{foo} is now 'b'\n"; + print "ok 5 - \$^H{foo} is now 'b'\n"; } } BEGIN { print "not " if $^H{foo} ne "a"; - print "ok 4 - \$H^{foo} restored to 'a'\n"; + print "ok 6 - \$H^{foo} restored to 'a'\n"; } + # The pragma settings disappear after compilation + # (test at CHECK-time and at run-time) CHECK { print "not " if exists $^H{foo}; - print "ok 6 - \$^H{foo} doesn't exist when compilation complete\n"; + print "ok 9 - \$^H{foo} doesn't exist when compilation complete\n"; + print "not " if $^H & 0x00020000; + print "ok 10 - \$^H doesn't contain HINT_LOCALIZE_HH when compilation complete\n"; } print "not " if exists $^H{foo}; - print "ok 7 - \$^H{foo} doesn't exist at runtime\n"; + print "ok 11 - \$^H{foo} doesn't exist at runtime\n"; + print "not " if $^H & 0x00020000; + print "ok 12 - \$^H doesn't contain HINT_LOCALIZE_HH at run-time\n"; + # op_entereval should keep the pragmas it was compiled with + eval q* + print "not " if $^H{foo} ne "a"; + print "ok 13 - \$^H{foo} is 'a' at eval-\"\" time # TODO\n"; + print "not " unless $^H & 0x00020000; + print "ok 14 - \$^H contains HINT_LOCALIZE_HH at eval\"\"-time\n"; + *; } BEGIN { print "not " if exists $^H{foo}; - print "ok 5 - \$^H{foo} doesn't exist while finishing compilation\n"; + print "ok 7 - \$^H{foo} doesn't exist while finishing compilation\n"; + print "not " if $^H & 0x00020000; + print "ok 8 - \$^H doesn't contain HINT_LOCALIZE_HH while finishing compilation\n"; } diff --git a/t/comp/our.t b/t/comp/our.t new file mode 100644 index 0000000000..c381c413ff --- /dev/null +++ b/t/comp/our.t @@ -0,0 +1,49 @@ +#!./perl + +BEGIN { + chdir 't'; + @INC = '../lib'; + require './test.pl'; +} + +print "1..6\n"; + +{ + package TieAll; + # tie, track, and report what calls are made + my @calls; + sub AUTOLOAD { + for ($AUTOLOAD =~ /TieAll::(.*)/) { + if (/TIE/) { return bless {} } + elsif (/calls/) { return join ',', splice @calls } + else { + push @calls, $_; + # FETCHSIZE doesn't like undef + # if FIRSTKEY, see if NEXTKEY is also called + return 1 if /FETCHSIZE|FIRSTKEY/; + return; + } + } + } +} + +tie $x, 'TieAll'; +tie @x, 'TieAll'; +tie %x, 'TieAll'; + +{our $x;} +is(TieAll->calls, '', 'our $x has no runtime effect'); +{our ($x);} +is(TieAll->calls, '', 'our ($x) has no runtime effect'); +{our %x;} +is(TieAll->calls, '', 'our %x has no runtime effect'); + +{ + local $TODO = 'perl #17376'; + {our (%x);} + is(TieAll->calls, '', 'our (%x) has no runtime effect'); + {our @x;} + is(TieAll->calls, '', 'our @x has no runtime effect'); + {our (@x);} + is(TieAll->calls, '', 'our (@x) has no runtime effect'); +} diff --git a/t/io/open.t b/t/io/open.t index cf1d39dc0d..9e067b74f6 100755 --- a/t/io/open.t +++ b/t/io/open.t @@ -12,7 +12,7 @@ use Config; $Is_VMS = $^O eq 'VMS'; $Is_MacOS = $^O eq 'MacOS'; -plan tests => 94; +plan tests => 95; my $Perl = which_perl(); @@ -210,14 +210,14 @@ like( $@, qr/Bad filehandle:\s+afile/, ' right error' ); { local *F; for (1..2) { - ok( open(F, qq{$Perl -le "print 'ok'"|}), 'open to pipe' ); + ok( open(F, qq{$Perl -le "print 'ok'"|}), 'open to pipe' ); is(scalar <F>, "ok\n", ' readline'); - ok( close F, ' close' ); + ok( close F, ' close' ); } for (1..2) { - ok( open(F, "-|", qq{$Perl -le "print 'ok'"}), 'open -|'); - is( scalar <F>, "ok\n", ' readline'); + ok( open(F, "-|", qq{$Perl -le "print 'ok'"}), 'open -|'); + is( scalar <F>, "ok\n", ' readline'); ok( close F, ' close' ); } } @@ -225,8 +225,11 @@ like( $@, qr/Bad filehandle:\s+afile/, ' right error' ); # other dupping techniques { - ok( open(my $stdout, ">&", \*STDOUT), 'dup \*STDOUT into lexical fh'); - ok( open(STDOUT, ">&", $stdout), 'restore dupped STDOUT from lexical fh'); + ok( open(my $stdout, ">&", \*STDOUT), 'dup \*STDOUT into lexical fh'); + ok( open(STDOUT, ">&", $stdout), 'restore dupped STDOUT from lexical fh'); + + # used to try to open a file [perl #17830] + ok( open(my $stdin, "<&", fileno STDIN), 'dup fileno(STDIN) into lexical fh'); } SKIP: { diff --git a/t/lib/Math/BigFloat/Subclass.pm b/t/lib/Math/BigFloat/Subclass.pm index 82ad7e6c83..950c92dbd0 100644 --- a/t/lib/Math/BigFloat/Subclass.pm +++ b/t/lib/Math/BigFloat/Subclass.pm @@ -6,7 +6,7 @@ require 5.005_02; use strict; use Exporter; -use Math::BigFloat(1.27); +use Math::BigFloat(1.30); use vars qw($VERSION @ISA $PACKAGE $accuracy $precision $round_mode $div_scale); diff --git a/t/lib/Test/Simple/sample_tests/pre_plan_death.plx b/t/lib/Test/Simple/sample_tests/pre_plan_death.plx new file mode 100644 index 0000000000..f72d3b65e5 --- /dev/null +++ b/t/lib/Test/Simple/sample_tests/pre_plan_death.plx @@ -0,0 +1,17 @@ +# ID 20020716.013, the exit code would become 0 if the test died +# before a plan. + +require Test::Simple; + +push @INC, 't/lib'; +require Test::Simple::Catch; +my($out, $err) = Test::Simple::Catch::caught(); + +close STDERR; +die "Knife?"; + +Test::Simple->import(tests => 3); + +ok(1); +ok(1); +ok(1); diff --git a/t/lib/h2ph.pht b/t/lib/h2ph.pht index a52c1605f0..796d6a8e0b 100644 --- a/t/lib/h2ph.pht +++ b/t/lib/h2ph.pht @@ -48,8 +48,9 @@ unless(defined(&_H2PH_H_)) { require 'sys/socket.ph'; require 'sys/ioctl.ph'; eval { + my(@REM); my(%INCD) = map { $INC{$_} => 1 } (grep { $_ eq "sys/fcntl.ph" } keys(%INC)); - my(@REM) = map { "$_/sys/fcntl.ph" } (grep { not exists($INCD{"$_/sys/fcntl.ph"})and -f "$_/sys/fcntl.ph" } @INC); + @REM = map { "$_/sys/fcntl.ph" } (grep { not exists($INCD{"$_/sys/fcntl.ph"}) and -f "$_/sys/fcntl.ph" } @INC); require "$REM[0]" if @REM; }; warn($@) if $@; diff --git a/t/lib/strict/subs b/t/lib/strict/subs index 4a90809020..f6e05b3e4f 100644 --- a/t/lib/strict/subs +++ b/t/lib/strict/subs @@ -345,3 +345,12 @@ print "$abc\n"; EXPECT Bareword "XYZ" not allowed while "strict subs" in use at - line 5. Execution of - aborted due to compilation errors. +######## + +# [perl #10021] +use strict; +use warnings; +print "" if BAREWORD; +EXPECT +Bareword "BAREWORD" not allowed while "strict subs" in use at - line 5. +Execution of - aborted due to compilation errors. diff --git a/t/lib/warnings/doio b/t/lib/warnings/doio index bb09aa8552..15d4c5e957 100644 --- a/t/lib/warnings/doio +++ b/t/lib/warnings/doio @@ -275,3 +275,42 @@ no warnings 'io'; open FOO, '>', \$x; EXPECT Can't open a reference at - line 14. +######## +# doio.c [Perl_do_openn] +use Config; +BEGIN { + if (!$Config{useperlio}) { + print <<EOM; +SKIPPED +# warns only with perlio +EOM + exit; + } +} +use warnings 'io' ; +close STDOUT; +open FH1, "harness"; close FH1; +no warnings 'io' ; +open FH2, "harness"; close FH2; +EXPECT +Filehandle STDOUT reopened as FH1 only for input at - line 14. +######## +# doio.c [Perl_do_openn] +use Config; +BEGIN { + if (!$Config{useperlio}) { + print <<EOM; +SKIPPED +# warns only with perlio +EOM + exit; + } +} +use warnings 'io' ; +close STDIN; +open my $fh1, ">doiowarn.tmp"; close $fh1; +no warnings 'io' ; +open my $fh2, ">doiowarn.tmp"; close $fh2; +unlink "doiowarn.tmp"; +EXPECT +Filehandle STDIN reopened as $fh1 only for output at - line 14. diff --git a/t/lib/warnings/op b/t/lib/warnings/op index 011fd17beb..c1c6fce6a5 100644 --- a/t/lib/warnings/op +++ b/t/lib/warnings/op @@ -113,6 +113,8 @@ Use of /g modifier is meaningless in split + Possible precedence problem on bitwise %c operator [Perl_ck_bitop] + Mandatory Warnings ------------------ Prototype mismatch: [cv_ckproto] @@ -124,7 +126,6 @@ oops: oopsAV [oopsAV] TODO oops: oopsHV [oopsHV] TODO - __END__ # op.c use warnings 'misc' ; @@ -300,6 +301,7 @@ eval { getgrnam 1 }; # OP_GGRNAM eval { getgrgid 1 }; # OP_GGRGID eval { getpwnam 1 }; # OP_GPWNAM eval { getpwuid 1 }; # OP_GPWUID +prototype "foo"; # OP_PROTOTYPE EXPECT Useless use of repeat (x) in void context at - line 3. Useless use of wantarray in void context at - line 5. @@ -338,6 +340,7 @@ Useless use of getgrnam in void context at - line 50. Useless use of getgrgid in void context at - line 51. Useless use of getpwnam in void context at - line 52. Useless use of getpwuid in void context at - line 53. +Useless use of subroutine prototype in void context at - line 54. ######## # op.c use warnings 'void' ; close STDIN ; @@ -400,6 +403,7 @@ eval { getgrnam 1 }; # OP_GGRNAM eval { getgrgid 1 }; # OP_GGRGID eval { getpwnam 1 }; # OP_GPWNAM eval { getpwuid 1 }; # OP_GPWUID +prototype "foo"; # OP_PROTOTYPE EXPECT ######## # op.c @@ -984,3 +988,56 @@ no warnings 'regexp'; split /blah/g, "blah"; EXPECT Use of /g modifier is meaningless in split at - line 4. +######## +# op.c +use warnings 'precedence'; +$a = $b & $c == $d; +$a = $b ^ $c != $d; +$a = $b | $c > $d; +$a = $b < $c & $d; +$a = $b >= $c ^ $d; +$a = $b <= $c | $d; +$a = $b <=> $c & $d; +no warnings 'precedence'; +$a = $b & $c == $d; +$a = $b ^ $c != $d; +$a = $b | $c > $d; +$a = $b < $c & $d; +$a = $b >= $c ^ $d; +$a = $b <= $c | $d; +$a = $b <=> $c & $d; +EXPECT +Possible precedence problem on bitwise & operator at - line 3. +Possible precedence problem on bitwise ^ operator at - line 4. +Possible precedence problem on bitwise | operator at - line 5. +Possible precedence problem on bitwise & operator at - line 6. +Possible precedence problem on bitwise ^ operator at - line 7. +Possible precedence problem on bitwise | operator at - line 8. +Possible precedence problem on bitwise & operator at - line 9. +######## +# op.c +use integer; +use warnings 'precedence'; +$a = $b & $c == $d; +$a = $b ^ $c != $d; +$a = $b | $c > $d; +$a = $b < $c & $d; +$a = $b >= $c ^ $d; +$a = $b <= $c | $d; +$a = $b <=> $c & $d; +no warnings 'precedence'; +$a = $b & $c == $d; +$a = $b ^ $c != $d; +$a = $b | $c > $d; +$a = $b < $c & $d; +$a = $b >= $c ^ $d; +$a = $b <= $c | $d; +$a = $b <=> $c & $d; +EXPECT +Possible precedence problem on bitwise & operator at - line 4. +Possible precedence problem on bitwise ^ operator at - line 5. +Possible precedence problem on bitwise | operator at - line 6. +Possible precedence problem on bitwise & operator at - line 7. +Possible precedence problem on bitwise ^ operator at - line 8. +Possible precedence problem on bitwise | operator at - line 9. +Possible precedence problem on bitwise & operator at - line 10. diff --git a/t/lib/warnings/pp_hot b/t/lib/warnings/pp_hot index c008dd5f10..4e10627325 100644 --- a/t/lib/warnings/pp_hot +++ b/t/lib/warnings/pp_hot @@ -57,6 +57,9 @@ $f = $a = "abc" ; print $f $a; no warnings 'unopened' ; print $f $a; +use warnings; +no warnings 'unopened' ; +print $f $a; EXPECT print() on unopened filehandle abc at - line 4. ######## @@ -100,6 +103,9 @@ no warnings 'closed' ; print STDIN "anc"; opendir STDIN, "."; print STDIN "anc"; +use warnings; +no warnings 'closed' ; +print STDIN "anc"; EXPECT print() on closed filehandle STDIN at - line 4. print() on closed filehandle STDIN at - line 6. diff --git a/t/lib/warnings/toke b/t/lib/warnings/toke index 0a5346a50f..ca0dc6eac0 100644 --- a/t/lib/warnings/toke +++ b/t/lib/warnings/toke @@ -614,6 +614,10 @@ open FOO || time; EXPECT Precedence problem: open FOO should be open(FOO) at - line 2. ######## +# toke.c (and [perl #16184]) +open FOO => "<&0"; close FOO; +EXPECT +######## # toke.c $^W = 0 ; open FOO || time; diff --git a/t/op/anonsub.t b/t/op/anonsub.t index 8eca75b811..91eb929a5d 100755 --- a/t/op/anonsub.t +++ b/t/op/anonsub.t @@ -1,5 +1,9 @@ #!./perl +# Note : we're not using t/test.pl here, because we would need +# fresh_perl_is, and fresh_perl_is uses a closure -- a special +# case of what this program tests for. + chdir 't' if -d 't'; @INC = '../lib'; $Is_VMS = $^O eq 'VMS'; @@ -12,7 +16,7 @@ $|=1; undef $/; @prgs = split "\n########\n", <DATA>; -print "1..", scalar @prgs, "\n"; +print "1..", 6 + scalar @prgs, "\n"; $tmpfile = "asubtmp000"; 1 while -f ++$tmpfile; @@ -51,6 +55,30 @@ for (@prgs){ print "ok ", ++$i, "\n"; } +sub test_invalid_decl { + my ($code,$todo) = @_; + $todo //= ''; + eval $code; + if ($@ =~ /^Illegal declaration of anonymous subroutine at/) { + print "ok ", ++$i, " - '$code' is illegal$todo\n"; + } else { + print "not ok ", ++$i, " - '$code' is illegal$todo\n# GOT: $@"; + } +} + +test_invalid_decl('sub;'); +test_invalid_decl('sub ($) ;'); +test_invalid_decl('{ $x = sub }'); +test_invalid_decl('sub ($) && 1'); +test_invalid_decl('sub ($) : lvalue;',' # TODO'); + +eval "sub #foo\n{print 1}"; +if ($@ eq '') { + print "ok ", ++$i, "\n"; +} else { + print "not ok ", ++$i, "\n# GOT: $@"; +} + __END__ sub X { my $n = "ok 1\n"; diff --git a/t/op/assignwarn.t b/t/op/assignwarn.t index aff433c464..0841bd4e20 100755 --- a/t/op/assignwarn.t +++ b/t/op/assignwarn.t @@ -9,6 +9,7 @@ BEGIN { chdir 't' if -d 't'; @INC = '../lib'; + require './test.pl'; } use strict; @@ -17,57 +18,76 @@ use warnings; my $warn = ""; $SIG{q(__WARN__)} = sub { print $warn; $warn .= join("",@_) }; -sub ok { print $_[1] ? "ok " : "not ok ", $_[0], "\n"; } - sub uninitialized { $warn =~ s/Use of uninitialized value[^\n]+\n//s; } - -print "1..32\n"; +sub tiex { tie $_[0], 'main' } +sub TIESCALAR { my $x; bless \$x } +sub FETCH { ${$_[0]} } +sub STORE { ${$_[0]} = $_[1] } +our $TODO; + +print "1..63\n"; + +# go through all tests once normally and once with tied $x +for my $tie ("", ", tied") { -{ my $x; $x ++; ok 1, ! uninitialized; } -{ my $x; $x --; ok 2, ! uninitialized; } -{ my $x; ++ $x; ok 3, ! uninitialized; } -{ my $x; -- $x; ok 4, ! uninitialized; } +{ my $x; tiex $x if $tie; $x ++; ok ! uninitialized, "postinc$tie"; } +{ my $x; tiex $x if $tie; $x --; ok ! uninitialized, "postdec$tie"; } +{ my $x; tiex $x if $tie; ++ $x; ok ! uninitialized, "preinc$tie"; } +{ my $x; tiex $x if $tie; -- $x; ok ! uninitialized, "predec$tie"; } -{ my $x; $x **= 1; ok 5, uninitialized; } +{ my $x; tiex $x if $tie; $x **= 1; ok uninitialized, "**=$tie"; } -{ my $x; $x += 1; ok 6, ! uninitialized; } -{ my $x; $x -= 1; ok 7, ! uninitialized; } +{ local $TODO = $tie && '[perl #17809] pp_add & pp_subtract'; + { my $x; tiex $x if $tie; $x += 1; ok ! uninitialized, "+=$tie"; } + { my $x; tiex $x if $tie; $x -= 1; ok ! uninitialized, "-=$tie"; } +} + +{ my $x; tiex $x if $tie; $x .= 1; ok ! uninitialized, ".=$tie"; } -{ my $x; $x .= 1; ok 8, ! uninitialized; } +{ my $x; tiex $x if $tie; $x *= 1; ok uninitialized, "*=$tie"; } +{ my $x; tiex $x if $tie; $x /= 1; ok uninitialized, "/=$tie"; } +{ my $x; tiex $x if $tie; $x %= 1; ok uninitialized, "\%=$tie"; } -{ my $x; $x *= 1; ok 9, uninitialized; } -{ my $x; $x /= 1; ok 10, uninitialized; } -{ my $x; $x %= 1; ok 11, uninitialized; } +{ my $x; tiex $x if $tie; $x x= 1; ok uninitialized, "x=$tie"; } -{ my $x; $x x= 1; ok 12, uninitialized; } +{ my $x; tiex $x if $tie; $x &= 1; ok uninitialized, "&=$tie"; } -{ my $x; $x &= 1; ok 13, uninitialized; } -{ my $x; $x |= 1; ok 14, ! uninitialized; } -{ my $x; $x ^= 1; ok 15, ! uninitialized; } +{ local $TODO = $tie && '[perl #17809] pp_bit_or & pp_bit_xor'; + { my $x; tiex $x if $tie; $x |= 1; ok ! uninitialized, "|=$tie"; } + { my $x; tiex $x if $tie; $x ^= 1; ok ! uninitialized, "^=$tie"; } +} -{ my $x; $x &&= 1; ok 16, ! uninitialized; } -{ my $x; $x ||= 1; ok 17, ! uninitialized; } +{ my $x; tiex $x if $tie; $x &&= 1; ok ! uninitialized, "&&=$tie"; } +{ my $x; tiex $x if $tie; $x ||= 1; ok ! uninitialized, "||=$tie"; } -{ my $x; $x <<= 1; ok 18, uninitialized; } -{ my $x; $x >>= 1; ok 19, uninitialized; } +{ my $x; tiex $x if $tie; $x <<= 1; ok uninitialized, "<<=$tie"; } +{ my $x; tiex $x if $tie; $x >>= 1; ok uninitialized, ">>=$tie"; } -{ my $x; $x &= "x"; ok 20, uninitialized; } -{ my $x; $x |= "x"; ok 21, ! uninitialized; } -{ my $x; $x ^= "x"; ok 22, ! uninitialized; } +{ my $x; tiex $x if $tie; $x &= "x"; ok uninitialized, "&=$tie, string"; } + +{ local $TODO = $tie && '[perl #17809] pp_bit_or & pp_bit_xor'; + { my $x; tiex $x if $tie; $x |= "x"; ok ! uninitialized, "|=$tie, string"; } + { my $x; tiex $x if $tie; $x ^= "x"; ok ! uninitialized, "^=$tie, string"; } +} + +{ use integer; + +{ local $TODO = $tie && '[perl #17809] pp_i_add & pp_i_subtract'; + { my $x; tiex $x if $tie; $x += 1; ok ! uninitialized, "+=$tie, int"; } + { my $x; tiex $x if $tie; $x -= 1; ok ! uninitialized, "-=$tie, int"; } +} -{ use integer; my $x; $x += 1; ok 23, ! uninitialized; } -{ use integer; my $x; $x -= 1; ok 24, ! uninitialized; } +{ my $x; tiex $x if $tie; $x *= 1; ok uninitialized, "*=$tie, int"; } +{ my $x; tiex $x if $tie; $x /= 1; ok uninitialized, "/=$tie, int"; } +{ my $x; tiex $x if $tie; $x %= 1; ok uninitialized, "\%=$tie, int"; } -{ use integer; my $x; $x *= 1; ok 25, uninitialized; } -{ use integer; my $x; $x /= 1; ok 26, uninitialized; } -{ use integer; my $x; $x %= 1; ok 27, uninitialized; } +{ my $x; tiex $x if $tie; $x ++; ok ! uninitialized, "postinc$tie, int"; } +{ my $x; tiex $x if $tie; $x --; ok ! uninitialized, "postdec$tie, int"; } +{ my $x; tiex $x if $tie; ++ $x; ok ! uninitialized, "preinc$tie, int"; } +{ my $x; tiex $x if $tie; -- $x; ok ! uninitialized, "predec$tie, int"; } -{ use integer; my $x; $x ++; ok 28, ! uninitialized; } -{ use integer; my $x; $x --; ok 29, ! uninitialized; } -{ use integer; my $x; ++ $x; ok 30, ! uninitialized; } -{ use integer; my $x; -- $x; ok 31, ! uninitialized; } +} # end of use integer; -ok 32, $warn eq ''; +} # end of for $tie -# If we got any errors that we were not expecting, then print them -print map "#$_\n", split /\n/, $warn if length $warn; +is $warn, '', "no spurious warnings"; diff --git a/t/op/attrs.t b/t/op/attrs.t index 1ed92a1a8d..25abeb21b5 100644 --- a/t/op/attrs.t +++ b/t/op/attrs.t @@ -5,188 +5,117 @@ BEGIN { chdir 't' if -d 't'; @INC = '../lib'; + require './test.pl'; } -sub NTESTS () ; - -my ($test, $ntests); -BEGIN {$ntests=0} -$test=0; -my $failed = 0; - -print "1..".NTESTS."\n"; +plan tests => 47; $SIG{__WARN__} = sub { die @_ }; -sub mytest { - my $bad = ''; - if (!$@ ne !$_[0] || $_[0] && $@ !~ $_[0]) { - if ($@) { - my $x = $@; - $x =~ s/\n.*\z//s; - print "# Got: $x\n" - } - else { - print "# Got unexpected success\n"; - } - if ($_[0]) { - print "# Expected: $_[0]\n"; - } - else { - print "# Expected success\n"; - } - $failed = 1; - $bad = 'not '; - } - elsif (@_ == 3 && $_[1] ne $_[2]) { - print "# Got: $_[1]\n"; - print "# Expected: $_[2]\n"; - $failed = 1; - $bad = 'not '; - } - print $bad."ok ".++$test."\n"; +sub eval_ok ($) { + eval $_[0]; + is( $@, '' ); } -eval 'sub t1 ($) : locked { $_[0]++ }'; -mytest; -BEGIN {++$ntests} - -eval 'sub t2 : locked { $_[0]++ }'; -mytest; -BEGIN {++$ntests} - -eval 'sub t3 ($) : locked ;'; -mytest; -BEGIN {++$ntests} - -eval 'sub t4 : locked ;'; -mytest; -BEGIN {++$ntests} - -my $anon1; -eval '$anon1 = sub ($) : locked:method { $_[0]++ }'; -mytest; -BEGIN {++$ntests} - -my $anon2; -eval '$anon2 = sub : locked : method { $_[0]++ }'; -mytest; -BEGIN {++$ntests} - -my $anon3; -eval '$anon3 = sub : method { $_[0]->[1] }'; -mytest; -BEGIN {++$ntests} +eval_ok 'sub t1 ($) : locked { $_[0]++ }'; +eval_ok 'sub t2 : locked { $_[0]++ }'; +eval_ok 'sub t3 ($) : locked ;'; +eval_ok 'sub t4 : locked ;'; +our $anon1; eval_ok '$anon1 = sub ($) : locked:method { $_[0]++ }'; +our $anon2; eval_ok '$anon2 = sub : locked : method { $_[0]++ }'; +our $anon3; eval_ok '$anon3 = sub : method { $_[0]->[1] }'; eval 'sub e1 ($) : plugh ;'; -mytest qr/^Invalid CODE attributes?: ["']?plugh["']? at/; -BEGIN {++$ntests} +like $@, qr/^Invalid CODE attributes?: ["']?plugh["']? at/; eval 'sub e2 ($) : plugh(0,0) xyzzy ;'; -mytest qr/^Invalid CODE attributes: ["']?plugh\(0,0\)["']? /; -BEGIN {++$ntests} +like $@, qr/^Invalid CODE attributes: ["']?plugh\(0,0\)["']? /; eval 'sub e3 ($) : plugh(0,0 xyzzy ;'; -mytest qr/Unterminated attribute parameter in attribute list at/; -BEGIN {++$ntests} +like $@, qr/Unterminated attribute parameter in attribute list at/; eval 'sub e4 ($) : plugh + xyzzy ;'; -mytest qr/Invalid separator character '[+]' in attribute list at/; -BEGIN {++$ntests} - -eval 'my main $x : = 0;'; -mytest; -BEGIN {++$ntests} - -eval 'my $x : = 0;'; -mytest; -BEGIN {++$ntests} - -eval 'my $x ;'; -mytest; -BEGIN {++$ntests} - -eval 'my ($x) : = 0;'; -mytest; -BEGIN {++$ntests} - -eval 'my ($x) ;'; -mytest; -BEGIN {++$ntests} - -eval 'my ($x) : ;'; -mytest; -BEGIN {++$ntests} - -eval 'my ($x,$y) : = 0;'; -mytest; -BEGIN {++$ntests} - -eval 'my ($x,$y) ;'; -mytest; -BEGIN {++$ntests} - -eval 'my ($x,$y) : ;'; -mytest; -BEGIN {++$ntests} +like $@, qr/Invalid separator character '[+]' in attribute list at/; + +eval_ok 'my main $x : = 0;'; +eval_ok 'my $x : = 0;'; +eval_ok 'my $x ;'; +eval_ok 'my ($x) : = 0;'; +eval_ok 'my ($x) ;'; +eval_ok 'my ($x) : ;'; +eval_ok 'my ($x,$y) : = 0;'; +eval_ok 'my ($x,$y) ;'; +eval_ok 'my ($x,$y) : ;'; eval 'my ($x,$y) : plugh;'; -mytest qr/^Invalid SCALAR attribute: ["']?plugh["']? at/; -BEGIN {++$ntests} +like $@, qr/^Invalid SCALAR attribute: ["']?plugh["']? at/; + +# bug #16080 +eval '{my $x : plugh}'; +like $@, qr/^Invalid SCALAR attribute: ["']?plugh["']? at/; +eval '{my ($x,$y) : plugh(})}'; +like $@, qr/^Invalid SCALAR attribute: ["']?plugh\(}\)["']? at/; + +# More syntax tests from the attributes manpage +eval 'my $x : switch(10,foo(7,3)) : expensive;'; +like $@, qr/^Invalid SCALAR attributes: ["']?switch\(10,foo\(7,3\)\) : expensive["']? at/; +eval q/my $x : Ugly('\(") :Bad;/; +like $@, qr/^Invalid SCALAR attributes: ["']?Ugly\('\\\("\) : Bad["']? at/; +eval 'my $x : _5x5;'; +like $@, qr/^Invalid SCALAR attribute: ["']?_5x5["']? at/; +eval 'my $x : locked method;'; +like $@, qr/^Invalid SCALAR attributes: ["']?locked : method["']? at/; +eval 'my $x : switch(10,foo();'; +like $@, qr/^Unterminated attribute parameter in attribute list at/; +eval q/my $x : Ugly('(');/; +like $@, qr/^Unterminated attribute parameter in attribute list at/; +eval 'my $x : 5x5;'; +like $@, qr/error/; +eval 'my $x : Y2::north;'; +like $@, qr/Invalid separator character ':' in attribute list at/; sub A::MODIFY_SCALAR_ATTRIBUTES { return } eval 'my A $x : plugh;'; -mytest qr/^SCALAR package attribute may clash with future reserved word: ["']?plugh["']? at/; -BEGIN {++$ntests} +like $@, qr/^SCALAR package attribute may clash with future reserved word: ["']?plugh["']? at/; eval 'my A $x : plugh plover;'; -mytest qr/^SCALAR package attributes may clash with future reserved words: ["']?plugh["']? /; -BEGIN {++$ntests} +like $@, qr/^SCALAR package attributes may clash with future reserved words: ["']?plugh["']? /; eval 'package Cat; my Cat @socks;'; -mytest qr/^Can't declare class for non-scalar \@socks in "my"/; -BEGIN {++$ntests} +like $@, qr/^Can't declare class for non-scalar \@socks in "my"/; sub X::MODIFY_CODE_ATTRIBUTES { die "$_[0]" } sub X::foo { 1 } *Y::bar = \&X::foo; *Y::bar = \&X::foo; # second time for -w eval 'package Z; sub Y::bar : foo'; -mytest qr/^X at /; -BEGIN {++$ntests} +like $@, qr/^X at /; eval 'package Z; sub Y::baz : locked {}'; my @attrs = eval 'attributes::get \&Y::baz'; -mytest '', "@attrs", "locked"; -BEGIN {++$ntests} +is "@attrs", "locked"; @attrs = eval 'attributes::get $anon1'; -mytest '', "@attrs", "locked method"; -BEGIN {++$ntests} +is "@attrs", "locked method"; sub Z::DESTROY { } sub Z::FETCH_CODE_ATTRIBUTES { return 'Z' } my $thunk = eval 'bless +sub : method locked { 1 }, "Z"'; -mytest '', ref($thunk), "Z"; -BEGIN {++$ntests} +is ref($thunk), "Z"; @attrs = eval 'attributes::get $thunk'; -mytest '', "@attrs", "locked method Z"; -BEGIN {++$ntests} +is "@attrs", "locked method Z"; # Test ability to modify existing sub's (or XSUB's) attributes. eval 'package A; sub X { $_[0] } sub X : lvalue'; @attrs = eval 'attributes::get \&A::X'; -mytest '', "@attrs", "lvalue"; -BEGIN {++$ntests} +is "@attrs", "lvalue"; # Above not with just 'pure' built-in attributes. sub Z::MODIFY_CODE_ATTRIBUTES { (); } eval 'package Z; sub L { $_[0] } sub L : Z lvalue'; @attrs = eval 'attributes::get \&Z::L'; -mytest '', "@attrs", "lvalue Z"; -BEGIN {++$ntests} - +is "@attrs", "lvalue Z"; # Begin testing attributes that tie @@ -196,26 +125,23 @@ BEGIN {++$ntests} sub TIESCALAR { my $x = $_[1]; bless \$x, $_[0]; } sub FETCH { ${$_[0]} } sub STORE { - #print "# In Ttie::STORE\n"; - ::mytest ''; + ::pass; ${$_[0]} = $_[1]*2; } package Tloop; sub MODIFY_SCALAR_ATTRIBUTES { tie ${$_[1]}, 'Ttie', -1; (); } } -eval ' +eval_ok ' package Tloop; for my $i (0..2) { my $x : TieLoop = $i; - $x != $i*2 and ::mytest "", $x, $i*2; + $x != $i*2 and ::is $x, $i*2; } '; -mytest; -BEGIN {$ntests += 4} - -# Other tests should be added above this line - -sub NTESTS () { $ntests } -exit $failed; +# bug #15898 +eval 'our ${""} : foo = 1'; +like $@, qr/Can't declare scalar dereference in our/; +eval 'my $$foo : bar = 1'; +like $@, qr/Can't declare scalar dereference in my/; diff --git a/t/op/chop.t b/t/op/chop.t index abb8aba732..87700de929 100755 --- a/t/op/chop.t +++ b/t/op/chop.t @@ -6,7 +6,7 @@ BEGIN { require './test.pl'; } -plan tests => 47; +plan tests => 51; $_ = 'abc'; $c = do foo(); @@ -172,3 +172,14 @@ foreach (keys %chop) { is ($_, $chop{$key}, "chop hash key"); } } + +# chop and chomp can't be lvalues +eval 'chop($x) = 1;'; +ok($@ =~ /Can\'t modify.*chop.*in.*assignment/); +eval 'chomp($x) = 1;'; +ok($@ =~ /Can\'t modify.*chom?p.*in.*assignment/); +eval 'chop($x, $y) = (1, 2);'; +ok($@ =~ /Can\'t modify.*chop.*in.*assignment/); +eval 'chomp($x, $y) = (1, 2);'; +ok($@ =~ /Can\'t modify.*chom?p.*in.*assignment/); + diff --git a/t/op/closure.t b/t/op/closure.t index 09df7c1134..99c3216397 100755 --- a/t/op/closure.t +++ b/t/op/closure.t @@ -13,7 +13,7 @@ BEGIN { use Config; -print "1..171\n"; +print "1..172\n"; my $test = 1; sub test (&) { @@ -510,3 +510,7 @@ END } +# The following dumps core with perl <= 5.8.0 +BEGIN { $vanishing_pad = sub { eval $_[0] } } +$some_var = 123; +test { $vanishing_pad->( '$some_var' ) == 123 }; diff --git a/t/op/getpid.t b/t/op/getpid.t new file mode 100644 index 0000000000..dd06f006a6 --- /dev/null +++ b/t/op/getpid.t @@ -0,0 +1,35 @@ +#!perl -w + +# Tests if $$ and getppid return consistent values across threads + +BEGIN { + chdir 't' if -d 't'; + @INC = qw(../lib); +} + +use strict; +use Config; + +BEGIN { + if (!$Config{useithreads}) { + print "1..0 # Skip: no ithreads\n"; + exit; + } + if (!$Config{d_getppid}) { + print "1..0 # Skip: no getppid\n"; + exit; + } +} + +use threads; +use threads::shared; + +my ($pid, $ppid) = ($$, getppid()); +my $pid2 : shared = 0; +my $ppid2 : shared = 0; + +new threads( sub { ($pid2, $ppid2) = ($$, getppid()); } ) -> join(); + +print "1..2\n"; +print "not " if $pid != $pid2; print "ok 1 - pids\n"; +print "not " if $ppid != $ppid2; print "ok 2 - ppids\n"; diff --git a/t/op/grep.t b/t/op/grep.t index 3a7f8ad984..d4885277f8 100755 --- a/t/op/grep.t +++ b/t/op/grep.t @@ -4,7 +4,7 @@ # grep() and map() tests # -print "1..27\n"; +print "1..32\n"; $test = 1; @@ -97,3 +97,35 @@ sub ok { { $_ & "X" } ("ok $test\n"); $test++; } + +# Tests for "for" in "map" and "grep" +# Used to dump core, bug [perl #17771] + +{ + my @x; + my $y = ''; + @x = map { $y .= $_ for 1..2; 1 } 3..4; + print "# @x,$y\n"; + print "@x,$y" eq "1 1,1212" ? "ok $test\n" : "not ok $test\n"; + $test++; + $y = ''; + @x = map { $y .= $_ for 1..2; $y .= $_ } 3..4; + print "# @x,$y\n"; + print "@x,$y" eq "123 123124,123124" ? "ok $test\n" : "not ok $test\n"; + $test++; + $y = ''; + @x = map { for (1..2) { $y .= $_ } $y .= $_ } 3..4; + print "# @x,$y\n"; + print "@x,$y" eq "123 123124,123124" ? "ok $test\n" : "not ok $test\n"; + $test++; + $y = ''; + @x = grep { $y .= $_ for 1..2; 1 } 3..4; + print "# @x,$y\n"; + print "@x,$y" eq "3 4,1212" ? "ok $test\n" : "not ok $test\n"; + $test++; + $y = ''; + @x = grep { for (1..2) { $y .= $_ } 1 } 3..4; + print "# @x,$y\n"; + print "@x,$y" eq "3 4,1212" ? "ok $test\n" : "not ok $test\n"; + $test++; +} @@ -11,7 +11,7 @@ BEGIN { use warnings; -print "1..47\n"; +print "1..48\n"; # type coersion on assignment $foo = 'foo'; @@ -208,5 +208,15 @@ print $j[0] == 1 ? "ok 43\n" : "not ok 43\n"; print $w =~ /Prototype mismatch/ ? "ok 47\n" : "not ok 47\n# $w"; } +{ + # [17375] rcatline to formerly-defined undef was broken. Fixed in + # do_readline by checking SvOK. AMS, 20020918 + my $x = "not "; + $x = undef; + $x .= <DATA>; + print $x; +} + __END__ ok 44 +ok 48 diff --git a/t/op/magic.t b/t/op/magic.t index 436e253ee2..beed7f5427 100755 --- a/t/op/magic.t +++ b/t/op/magic.t @@ -20,7 +20,7 @@ sub ok { unless( $ok ) { printf "# Failed test at line %d\n", (caller)[2]; - print "# $info" if defined $info; + print "# $info\n" if defined $info; } $test++; @@ -36,7 +36,7 @@ sub skip { return 1; } -print "1..46\n"; +print "1..47\n"; $Is_MSWin32 = $^O eq 'MSWin32'; $Is_NetWare = $^O eq 'NetWare'; @@ -235,7 +235,7 @@ ok $^O; ok $^T > 850000000, $^T; if ($Is_VMS || $Is_Dos || $Is_MacOS) { - skip("%ENV manipulations fail or aren't safe on $^O") for 1..2; + skip("%ENV manipulations fail or aren't safe on $^O") for 1..3; } else { $PATH = $ENV{PATH}; @@ -253,6 +253,15 @@ else { # -- Nikola Knezevic ok ($Is_MSWin32 ? (`set __NoNeSuCh` =~ /^(?:__NoNeSuCh=)?foo$/) : (`echo \$__NoNeSuCh` eq "foo\n") ); + if ($^O =~ /^(linux|freebsd)$/ && + open CMDLINE, "/proc/$$/cmdline") { + chomp(my $line = scalar <CMDLINE>); + my $me = (split /\0/, $line)[0]; + ok($me eq $0, 'altering $0 is effective', 'PL_origarg{c,v} copy breaks this'); + close CMDLINE; + } else { + skip("\$0 check only on Linux and FreeBSD with /proc"); + } } { diff --git a/t/op/mkdir.t b/t/op/mkdir.t index 37da9c34b3..b9c4df785a 100755 --- a/t/op/mkdir.t +++ b/t/op/mkdir.t @@ -1,6 +1,6 @@ #!./perl -print "1..9\n"; +print "1..13\n"; BEGIN { chdir 't' if -d 't'; @@ -23,3 +23,8 @@ print (rmdir('blurfl') ? "not ok 6\n" : "ok 6\n"); print ($! =~ /cannot find|such|exist|not found|not a directory/i ? "ok 7\n" : "# $!\nnot ok 7\n"); print (mkdir('blurfl') ? "ok 8\n" : "not ok 8\n"); print (rmdir('blurfl') ? "ok 9\n" : "not ok 9\n"); +# trailing slashes will be removed before the system call to mkdir +print (mkdir('blurfl///') ? "ok 10\n" : "not ok 10\n"); +print (-d 'blurfl' ? "ok 11\n" : "not ok 11\n"); +print (rmdir('blurfl///') ? "ok 12\n" : "not ok 12\n"); +print (!-d 'blurfl' ? "ok 13\n" : "not ok 13\n"); diff --git a/t/op/override.t b/t/op/override.t index 1a4e5e02f8..a06677ebba 100755 --- a/t/op/override.t +++ b/t/op/override.t @@ -2,11 +2,11 @@ BEGIN { chdir 't' if -d 't'; - @INC = '.'; - push @INC, '../lib'; + @INC = '../lib'; + require './test.pl'; } -print "1..17\n"; +plan tests => 21; # # This file tries to test builtin override using CORE::GLOBAL @@ -15,14 +15,12 @@ my $dirsep = "/"; BEGIN { package Foo; *main::getlogin = sub { "kilroy"; } } -print "not " unless getlogin eq "kilroy"; -print "ok 1\n"; +is( getlogin, "kilroy" ); my $t = 42; BEGIN { *CORE::GLOBAL::time = sub () { $t; } } -print "not " unless 45 == time + 3; -print "ok 2\n"; +is( 45, time + 3 ); # # require has special behaviour @@ -31,44 +29,35 @@ my $r; BEGIN { *CORE::GLOBAL::require = sub { $r = shift; 1; } } require Foo; -print "not " unless $r eq "Foo.pm"; -print "ok 3\n"; +is( $r, "Foo.pm" ); require Foo::Bar; -print "not " unless $r eq join($dirsep, "Foo", "Bar.pm"); -print "ok 4\n"; +is( $r, join($dirsep, "Foo", "Bar.pm") ); require 'Foo'; -print "not " unless $r eq "Foo"; -print "ok 5\n"; +is( $r, "Foo" ); require 5.6; -print "not " unless $r eq "5.6"; -print "ok 6\n"; +is( $r, "5.6" ); require v5.6; -print "not " unless abs($r - 5.006) < 0.001 && $r eq "\x05\x06"; -print "ok 7\n"; +ok( abs($r - 5.006) < 0.001 && $r eq "\x05\x06" ); eval "use Foo"; -print "not " unless $r eq "Foo.pm"; -print "ok 8\n"; +is( $r, "Foo.pm" ); eval "use Foo::Bar"; -print "not " unless $r eq join($dirsep, "Foo", "Bar.pm"); -print "ok 9\n"; +is( $r, join($dirsep, "Foo", "Bar.pm") ); eval "use 5.6"; -print "not " unless $r eq "5.6"; -print "ok 10\n"; +is( $r, "5.6" ); # localizing *CORE::GLOBAL::foo should revert to finding CORE::foo { local(*CORE::GLOBAL::require); $r = ''; eval "require NoNeXiSt;"; - print "not " if $r or $@ !~ /^Can't locate NoNeXiSt/i; - print "ok 11\n"; + ok( ! ( $r or $@ !~ /^Can't locate NoNeXiSt/i ) ); } # @@ -77,14 +66,32 @@ print "ok 10\n"; $r = 11; BEGIN { *CORE::GLOBAL::readline = sub (;*) { ++$r }; } -print <FH> == 12 ? "ok 12\n" : "not ok 12\n"; -print <$fh> == 13 ? "ok 13\n" : "not ok 13\n"; +is( <FH> , 12 ); +is( <$fh> , 13 ); my $pad_fh; -print <$pad_fh> == 14 ? "ok 14\n" : "not ok 14\n"; +is( <$pad_fh> , 14 ); # Non-global readline() override BEGIN { *Rgs::readline = sub (;*) { --$r }; } package Rgs; -print <FH> == 13 ? "ok 15\n" : "not ok 15\n"; -print <$fh> == 12 ? "ok 16\n" : "not ok 16\n"; -print <$pad_fh> == 11 ? "ok 17\n" : "not ok 17\n"; +::is( <FH> , 13 ); +::is( <$fh> , 12 ); +::is( <$pad_fh> , 11 ); + +# Verify that the parsing of overriden keywords isn't messed up +# by the indirect object notation +{ + local $SIG{__WARN__} = sub { + ::like( $_[0], qr/^ok overriden at/ ); + }; + BEGIN { *OverridenWarn::warn = sub { CORE::warn "@_ overriden"; }; } + package OverridenWarn; + sub foo { "ok" } + warn( OverridenWarn->foo() ); + warn OverridenWarn->foo(); +} +BEGIN { *OverridenPop::pop = sub { ::is( $_[0][0], "ok" ) }; } +package OverridenPop; +sub foo { [ "ok" ] } +pop( OverridenPop->foo() ); +pop OverridenPop->foo(); diff --git a/t/op/pack.t b/t/op/pack.t index 1661da5764..f047889155 100755 --- a/t/op/pack.t +++ b/t/op/pack.t @@ -6,7 +6,7 @@ BEGIN { require './test.pl'; } -plan tests => 5819; +plan tests => 5825; use strict; use warnings; @@ -170,6 +170,44 @@ sub list_eq ($$) { eval { $x = unpack 'w', pack 'C*', 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; like($@, qr/^Unterminated compressed integer/); + + eval { $x = pack 'w', -1 }; + like ($@, qr/^Cannot compress negative numbers/); + + eval { $x = pack 'w', '1'x(1 + length ~0) . 'e0' }; + like ($@, qr/^Can only compress unsigned integers/); + + SKIP: { + # Is this a stupid thing to do on VMS, VOS and other unusual platforms? + my $inf = eval '2**10000'; + + skip "Couldn't generate infinity - got error '$@'" + unless defined $inf and $inf == $inf / 2 and $inf + 1 == $inf; + + eval { $x = pack 'w', $inf }; + like ($@, qr/^Cannot compress integer/); + } + + SKIP: { + # This should be about the biggest thing possible on an IEEE double + my $big = eval '2**1023'; + + skip "Couldn't generate 2**1023 - got error '$@'", 3 + unless defined $big and $big != $big / 2; + + eval { $x = pack 'w', $big }; + is ($@, '', "Should be able to pack 'w', $big # 2**1023"); + + my $y = eval {unpack 'w', $x}; + is ($@, '', + "Should be able to unpack 'w' the result of pack 'w', $big # 2**1023"); + + # I'm getting about 1e-16 on FreeBSD + my $quotient = int (100 * ($y - $big) / $big); + ok($quotient < 2 && $quotient > -2, + "Round trip pack, unpack 'w' of $big is withing 1% ($quotient%)"); + } + } # diff --git a/t/op/pat.t b/t/op/pat.t index 767c069d2d..6a1d602d53 100755 --- a/t/op/pat.t +++ b/t/op/pat.t @@ -6,7 +6,7 @@ $| = 1; -print "1..922\n"; +print "1..941\n"; BEGIN { chdir 't' if -d 't'; @@ -2902,3 +2902,97 @@ print "e" =~ /\P{InConsonant}/ ? "ok $test\n" : "not ok $test\n"; $test++; } $test = 923; + +$a = bless qr/foo/, 'Foo'; +print(('goodfood' =~ $a ? '' : 'not '), + "ok $test\t# reblessed qr// matches\n"); +++$test; + +print(($a eq '(?-xism:foo)' ? '' : 'not '), + "ok $test\t# reblessed qr// stringizes\n"); +++$test; + +$x = "\x{3fe}"; +$z=$y = "\317\276"; # $y is byte representation of $x + +$a = qr/$x/; +print(($x =~ $a ? '' : 'not '), "ok $test - utf8 interpolation in qr//\n"); +++$test; + +print(("a$a" =~ $x ? '' : 'not '), + "ok $test - stringifed qr// preserves utf8\n"); +++$test; + +print(("a$x" =~ /^a$a\z/ ? '' : 'not '), + "ok $test - interpolated qr// preserves utf8\n"); +++$test; + +print(("a$x" =~ /^a(??{$a})\z/ ? '' : 'not '), + "ok $test - postponed interpolation of qr// preserves utf8\n"); +++$test; + +print((length(qr/##/x) == 12 ? '' : 'not '), + "ok $test - ## in qr// doesn't corrupt memory [perl #17776]\n"); +++$test; + +{ use re 'eval'; + +print(("$x$x" =~ /^$x(??{$x})\z/ ? '' : 'not '), + "ok $test - postponed utf8 string in utf8 re matches utf8\n"); +++$test; + +print(("$y$x" =~ /^$y(??{$x})\z/ ? '' : 'not '), + "ok $test - postponed utf8 string in non-utf8 re matches utf8\n"); +++$test; + +print(("$y$x" !~ /^$y(??{$y})\z/ ? '' : 'not '), + "ok $test - postponed non-utf8 string in non-utf8 re doesn't match utf8\n"); +++$test; + +print(("$x$x" !~ /^$x(??{$y})\z/ ? '' : 'not '), + "ok $test - postponed non-utf8 string in utf8 re doesn't match utf8\n"); +++$test; + +print(("$y$y" =~ /^$y(??{$y})\z/ ? '' : 'not '), + "ok $test - postponed non-utf8 string in non-utf8 re matches non-utf8\n"); +++$test; + +print(("$x$y" =~ /^$x(??{$y})\z/ ? '' : 'not '), + "ok $test - postponed non-utf8 string in utf8 re matches non-utf8\n"); +++$test; +$y = $z; # reset $y after upgrade + +print(("$x$y" !~ /^$x(??{$x})\z/ ? '' : 'not '), + "ok $test - postponed utf8 string in utf8 re doesn't match non-utf8\n"); +++$test; +$y = $z; # reset $y after upgrade + +print(("$y$y" !~ /^$y(??{$x})\z/ ? '' : 'not '), + "ok $test - postponed utf8 string in non-utf8 re doesn't match non-utf8\n"); +++$test; + +} # no re 'eval' + +print "# more user-defined character properties\n"; + +sub IsSyriac1 { + return <<'END'; +0712 072C +0730 074A +END +} + +print "\x{0712}" =~ /\p{IsSyriac1}/ ? "ok $test\n" : "not ok $test\n"; $test++; +print "\x{072F}" =~ /\P{IsSyriac1}/ ? "ok $test\n" : "not ok $test\n"; $test++; + +sub Syriac1 { + return <<'END'; +0712 072C +0730 074A +END +} + +print "\x{0712}" =~ /\p{Syriac1}/ ? "ok $test\n" : "not ok $test\n"; $test++; +print "\x{072F}" =~ /\P{Syriac1}/ ? "ok $test\n" : "not ok $test\n"; $test++; + +# last test 940 diff --git a/t/op/range.t b/t/op/range.t index e8aecf5fc9..a4f03c5a72 100755 --- a/t/op/range.t +++ b/t/op/range.t @@ -1,6 +1,6 @@ #!./perl -print "1..15\n"; +print "1..19\n"; print join(':',1..5) eq '1:2:3:4:5' ? "ok 1\n" : "not ok 1\n"; @@ -73,3 +73,9 @@ for my $x ("0"..-1) { print "not "; } print "ok 15\n"; + +# [#18165] Should allow "-4".."0", broken by #4730. (AMS 20021031) +print join(":","-4".."0") eq "-4:-3:-2:-1:0" ? "ok 16\n" : "not ok 16\n"; +print join(":","-4".."-0") eq "-4:-3:-2:-1:0" ? "ok 17\n" : "not ok 17\n"; +print join(":","-4\n".."0\n") eq "-4:-3:-2:-1:0" ? "ok 18\n" : "not ok 18\n"; +print join(":","-4\n".."-0\n") eq "-4:-3:-2:-1:0" ? "ok 19\n" : "not ok 19\n"; diff --git a/t/op/re_tests b/t/op/re_tests index 9c5ddc4f2f..d7e24f3b9f 100644 --- a/t/op/re_tests +++ b/t/op/re_tests @@ -922,3 +922,5 @@ ab(?i)cd abCd y - - (.*?)(?<=[bc])c abcd y $1 ab 2(]*)?$\1 2 y $& 2 (??{}) x y - - +a(b)?? abc y <$1> <> # undef [perl #16773] +(\d{1,3}\.){3,} 128.134.142.8 y <$1> <142.> # [perl #18019] diff --git a/t/op/recurse.t b/t/op/recurse.t index 374813c9e4..9d0064068b 100755 --- a/t/op/recurse.t +++ b/t/op/recurse.t @@ -8,7 +8,7 @@ BEGIN { chdir 't' if -d 't'; @INC = qw(. ../lib); require "test.pl"; - plan(tests => 26); + plan(tests => 28); } use strict; @@ -112,6 +112,9 @@ is(takeuchi($x, $y, $z), $z + 1, "takeuchi($x, $y, $z) == $z + 1"); is(sillysum(1000), 1000*1001/2, "recursive sum of 1..1000"); } - - - +# check ok for recursion depth > 65536 +is(runperl( + nolib => 1, + prog => q{$d=0; $e=1; sub c { ++$d; if ($d > 66000) { $e=0 } else { c(); c() unless $d % 32768 } --$d } c(); exit $e}, +), '', "64K deep recursion - no output expected"); +is($?, 0, "64K deep recursion - no coredump expected"); diff --git a/t/op/ref.t b/t/op/ref.t index 4b1d6e37a7..1205a7a824 100755 --- a/t/op/ref.t +++ b/t/op/ref.t @@ -5,7 +5,7 @@ BEGIN { @INC = qw(. ../lib); } -print "1..62\n"; +print "1..63\n"; require 'test.pl'; @@ -214,11 +214,15 @@ print @baa == 3 ? "ok 42\n" : "not ok 42\n"; print grep(ref($_), @baa) == 3 ? "ok 43\n" : "not ok 43\n"; print @bzz == 3 ? "ok 44\n" : "not ok 44\n"; +# also, it can't be an lvalue +eval '\\($x, $y) = (1, 2);'; +print $@ =~ /Can\'t modify.*ref.*in.*assignment/ ? "ok 45\n" : "not ok 45\n"; + # test for proper destruction of lexical objects -sub larry::DESTROY { print "# larry\nok 45\n"; } -sub curly::DESTROY { print "# curly\nok 46\n"; } -sub moe::DESTROY { print "# moe\nok 47\n"; } +sub larry::DESTROY { print "# larry\nok 46\n"; } +sub curly::DESTROY { print "# curly\nok 47\n"; } +sub moe::DESTROY { print "# moe\nok 48\n"; } { my ($joe, @curly, %larry); @@ -232,13 +236,13 @@ print "# left block\n"; # another glob test -$foo = "not ok 48"; +$foo = "not ok 49"; { local(*bar) = "foo" } -$bar = "ok 48"; +$bar = "ok 49"; local(*bar) = *bar; print "$bar\n"; -$var = "ok 49"; +$var = "ok 50"; $_ = \$var; print $$_,"\n"; @@ -247,10 +251,10 @@ print $$_,"\n"; { package A; sub new { bless {}, shift } - DESTROY { print "# destroying 'A'\nok 51\n" } + DESTROY { print "# destroying 'A'\nok 52\n" } package _B; sub new { bless {}, shift } - DESTROY { print "# destroying '_B'\nok 50\n"; bless shift, 'A' } + DESTROY { print "# destroying '_B'\nok 51\n"; bless shift, 'A' } package main; my $b = _B->new; } @@ -262,11 +266,11 @@ print $$_,"\n"; local $SIG{'__DIE__'} = sub { my $m = shift; if ($i++ > 4) { - print "# infinite recursion, bailing\nnot ok 52\n"; + print "# infinite recursion, bailing\nnot ok 53\n"; exit 1; } print "# $m"; - if ($m =~ /^Modification of a read-only/) { print "ok 52\n" } + if ($m =~ /^Modification of a read-only/) { print "ok 53\n" } }; package C; sub new { bless {}, shift } @@ -282,7 +286,7 @@ print $$_,"\n"; { my @a; - $a[1] = "ok 53\n"; + $a[1] = "ok 54\n"; print ${\$_} for @a; } @@ -290,9 +294,9 @@ print $$_,"\n"; $a = [1,2,3]; $a = $a->[1]; print "not " unless $a == 2; -print "ok 54\n"; +print "ok 55\n"; -sub x::DESTROY {print "ok ", 54 + shift->[0], "\n"} +sub x::DESTROY {print "ok ", 55 + shift->[0], "\n"} { my $a1 = bless [4],"x"; my $a2 = bless [3],"x"; { my $a3 = bless [2],"x"; @@ -306,9 +310,9 @@ my $result = runperl (switches=>['-l'], prog=> 'print 1; print qq-*$\*-;print 1;'); my $expect = "1\n*\n*\n1\n"; if ($result eq $expect) { - print "ok 59\n"; + print "ok 60\n"; } else { - print "not ok 59\n"; + print "not ok 60\n"; foreach ($expect, $result) { s/\n/\\n/gs; } @@ -317,7 +321,7 @@ if ($result eq $expect) { # test global destruction -my $test = 60; +my $test = 61; my $test1 = $test + 1; my $test2 = $test + 2; diff --git a/t/op/sprintf.t b/t/op/sprintf.t index c67e65e9d4..b23978ca8b 100755 --- a/t/op/sprintf.t +++ b/t/op/sprintf.t @@ -236,6 +236,8 @@ __END__ >%#e< >-1234.875< >-1.234875e+03< >%.0e< >1234.875< >1e+03< >%#.0e< >1234.875< >1.e+03< +>%.0e< >1.875< >2e+00< +>%.0e< >0.875< >9e-01< >%.*e< >[0, 1234.875]< >1e+03< >%.1e< >1234.875< >1.2e+03< >%-12.4e< >1234.875< >1.2349e+03 < @@ -265,8 +267,10 @@ __END__ >%.0f< >0< >0< >%.0f< >2**38< >274877906944< >Should have exact int'l rep'n< >%.0f< >0.1< >0< ->%.0f< >0.6< >1< >Known to fail with sfio and (irix|nonstop-ux|powerux)< ->%.0f< >-0.6< >-1< >Known to fail with sfio and (irix|nonstop-ux|powerux)< +>%.0f< >0.6< >1< >Known to fail with sfio, (irix|nonstop-ux|powerux); -DHAS_LDBL_SPRINTF_BUG may fix< +>%.0f< >-0.6< >-1< >Known to fail with sfio, (irix|nonstop-ux|powerux); -DHAS_LDBL_SPRINTF_BUG may fix< +>%.0f< >1.6< >2< +>%.0f< >-1.6< >-2< >%.0f< >1< >1< >%#.0f< >1< >1.< >%g< >12345.6789< >12345.7< diff --git a/t/op/stash.t b/t/op/stash.t new file mode 100644 index 0000000000..c8fe0ae14a --- /dev/null +++ b/t/op/stash.t @@ -0,0 +1,18 @@ +#!./perl + +BEGIN { + chdir 't' if -d 't'; + @INC = qw(../lib); +} + +require "./test.pl"; + +plan( tests => 1 ); + +# Used to segfault (bug #15479) +fresh_perl_is( + '%:: = ""', + 'Odd number of elements in hash assignment at - line 1.', + { switches => [ '-w' ] }, + 'delete $::{STDERR} and print a warning', +); diff --git a/t/op/taint.t b/t/op/taint.t index ac1cace999..48e6c6dae3 100755 --- a/t/op/taint.t +++ b/t/op/taint.t @@ -124,7 +124,7 @@ my $echo = "$Invoke_Perl $ECHO"; my $TEST = catfile(curdir(), 'TEST'); -print "1..205\n"; +print "1..206\n"; # First, let's make sure that Perl is checking the dangerous # environment variables. Maybe they aren't set yet, so we'll @@ -894,8 +894,8 @@ else { my @untainted; while (my ($k, $v) = each %ENV) { if (!tainted($v) && - # These we have untainted explicitly earlier. - $k !~ /^(BASH_ENV|CDPATH|ENV|IFS|PATH|TEMP|TERM|TMP)$/) { + # These we have explicitly untainted or set earlier. + $k !~ /^(BASH_ENV|CDPATH|ENV|IFS|PATH|PERL_CORE|TEMP|TERM|TMP)$/) { push @untainted, "# '$k' = '$v'\n"; } } @@ -973,3 +973,10 @@ else # If you add tests here update also the above skip block for VMS. } + +{ + # [ID 20020704.001] taint propagation failure + use re 'taint'; + $TAINT =~ /(.*)/; + test 206, tainted(my $foo = $1); +} diff --git a/t/op/tiearray.t b/t/op/tiearray.t index 337aff689a..e7b547bcd9 100755 --- a/t/op/tiearray.t +++ b/t/op/tiearray.t @@ -99,9 +99,44 @@ sub SPLICE return splice(@$ob,$off,$len,@_); } -package main; +package NegIndex; # 20020220 MJD +@ISA = 'Implement'; + +# simulate indices -2 .. 2 +my $offset = 2; +$NegIndex::NEGATIVE_INDICES = 1; + +sub FETCH { + my ($ob,$id) = @_; +# print "# FETCH @_\n"; + $id += $offset; + $ob->[$id]; +} + +sub STORE { + my ($ob,$id,$value) = @_; +# print "# STORE @_\n"; + $id += $offset; + $ob->[$id] = $value; +} + +sub DELETE { + my ($ob,$id) = @_; +# print "# DELETE @_\n"; + $id += $offset; + delete $ob->[$id]; +} + +sub EXISTS { + my ($ob,$id) = @_; +# print "# EXISTS @_\n"; + $id += $offset; + exists $ob->[$id]; +} -print "1..36\n"; +package main; + +print "1..61\n"; my $test = 1; {my @ary; @@ -240,7 +275,55 @@ untie @ary; # If we survived this far. print "ok ", $test++, "\n"; } + + +{ # 20020220 mjd-perl-patch+@plover.com + my @n; + tie @n => 'NegIndex', ('A' .. 'E'); + + # FETCH + print "not " unless $n[0] eq 'C'; + print "ok ", $test++,"\n"; + print "not " unless $n[1] eq 'D'; + print "ok ", $test++,"\n"; + print "not " unless $n[2] eq 'E'; + print "ok ", $test++,"\n"; + print "not " unless $n[-1] eq 'B'; + print "ok ", $test++,"\n"; + print "not " unless $n[-2] eq 'A'; + print "ok ", $test++,"\n"; + + # STORE + $n[-2] = 'a'; + print "not " unless $n[-2] eq 'a'; + print "ok ", $test++,"\n"; + $n[-1] = 'b'; + print "not " unless $n[-1] eq 'b'; + print "ok ", $test++,"\n"; + $n[0] = 'c'; + print "not " unless $n[0] eq 'c'; + print "ok ", $test++,"\n"; + $n[1] = 'd'; + print "not " unless $n[1] eq 'd'; + print "ok ", $test++,"\n"; + $n[2] = 'e'; + print "not " unless $n[2] eq 'e'; + print "ok ", $test++,"\n"; + + # DELETE and EXISTS + for (-2 .. 2) { + print exists($n[$_]) ? "ok $test\n" : "not ok $test\n"; + $test++; + delete $n[$_]; + print defined($n[$_]) ? "not ok $test\n" : "ok $test\n"; + $test++; + print exists($n[$_]) ? "not ok $test\n" : "ok $test\n"; + $test++; + } +} + + -print "not " unless $seen{'DESTROY'} == 2; +print "not " unless $seen{'DESTROY'} == 3; print "ok ", $test++,"\n"; diff --git a/t/op/tiehandle.t b/t/op/tiehandle.t index 257a613958..818cecf185 100755 --- a/t/op/tiehandle.t +++ b/t/op/tiehandle.t @@ -77,7 +77,7 @@ package main; use Symbol; -print "1..39\n"; +print "1..40\n"; my $fh = gensym; @@ -230,3 +230,15 @@ ok($r == 1); Implement::compare(PRINT => @received); } +{ + # [ID 20020713.001] chomp($data=<tied_fh>) + local *TEST; + tie *TEST, 'CHOMP'; + my $data; + chomp($data = <TEST>); + ok($data eq 'foobar'); + + package CHOMP; + sub TIEHANDLE { bless {}, $_[0] } + sub READLINE { "foobar\n" } +} @@ -6,7 +6,7 @@ BEGIN { require './test.pl'; } -plan tests => 97; +plan tests => 99; my $Is_EBCDIC = (ord('i') == 0x89 & ord('J') == 0xd1); @@ -160,7 +160,7 @@ is($_, '...d.f...j.l...p'); # 20000705 MJD eval "tr/m-d/ /"; -like($@, qr/^Invalid \[\] range "m-d" in transliteration operator/, +like($@, qr/^Invalid range "m-d" in transliteration operator/, 'reversed range check'); eval '$1 =~ tr/x/y/'; @@ -379,3 +379,7 @@ my %foo = (); eval '$foo{bar} =~ tr/N/N/'; is( $@, '', 'implicit count outside hash bounds' ); is( scalar keys %foo, 0, " doesn't extend the hash"); + +$x = \"foo"; +is( $x =~ tr/A/A/, 2, 'non-modifying tr/// on a scalar ref' ); +is( ref $x, 'SCALAR', " doesn't stringify its argument" ); diff --git a/t/run/fresh_perl.t b/t/run/fresh_perl.t index 9c2b42fc03..f8bf4b3178 100644 --- a/t/run/fresh_perl.t +++ b/t/run/fresh_perl.t @@ -616,9 +616,11 @@ for (@locales) { } EXPECT ######## +# [ID 20001202.002] and change #8066 added 'at -e line 1'; +# reversed again as a result of [perl #17763] die qr(x) EXPECT -(?-xism:x) at - line 1. +(?-xism:x) ######## # 20001210.003 mjd@plover.com format REMITOUT_TOP = @@ -844,3 +846,17 @@ ok 1 ######## [ID 20020623.009] nested eval/sub segfaults $eval = eval 'sub { eval "sub { %S }" }'; $eval->({}); +######## [perl #17951] Strange UTF error +-W +# From: "John Kodis" <kodis@mail630.gsfc.nasa.gov> +# Newsgroups: comp.lang.perl.moderated +# Subject: Strange UTF error +# Date: Fri, 11 Oct 2002 16:19:58 -0400 +# Message-ID: <pan.2002.10.11.20.19.48.407190@mail630.gsfc.nasa.gov> +$_ = "foobar\n"; +utf8::upgrade($_); # the original code used a UTF-8 locale (affects STDIN) +# matching is actually irrelevant: avoiding several dozen of these +# Illegal hexadecimal digit ' ' ignored at /usr/lib/perl5/5.8.0/utf8_heavy.pl line 152 +# is what matters. +/^([[:digit:]]+)/; +EXPECT diff --git a/t/run/switches.t b/t/run/switches.t index 996ad5d4c6..bfae4eb60a 100644 --- a/t/run/switches.t +++ b/t/run/switches.t @@ -9,7 +9,7 @@ BEGIN { require "./test.pl"; -plan(tests => 19); +plan(tests => 20); # due to a bug in VMS's piping which makes it impossible for runperl() # to emulate echo -n (ie. stdin always winds up with a newline), these @@ -64,6 +64,12 @@ $r = runperl( ); is( $r, 'abc-def--ghi-jkl-mno--pq-/', '-0777 (slurp mode)' ); +$r = runperl( + switches => [ '-066' ], + prog => 'BEGIN { print qq{($/)} } print qq{[$/]}', +); +is( $r, "(\066)[\066]", '$/ set at compile-time' ); + # Tests for -c my $filename = 'swctest.tmp'; @@ -133,7 +133,16 @@ sub display { sub is { my ($got, $expected, $name, @mess) = @_; - my $pass = $got eq $expected; + + my $pass; + if( !defined $got || !defined $expected ) { + # undef only matches undef + $pass = !defined $got && !defined $expected; + } + else { + $pass = $got eq $expected; + } + unless ($pass) { unshift(@mess, "# got "._q($got)."\n", "# expected "._q($expected)."\n"); @@ -143,7 +152,16 @@ sub is { sub isnt { my ($got, $isnt, $name, @mess) = @_; - my $pass = $got ne $isnt; + + my $pass; + if( !defined $got || !defined $isnt ) { + # undef only matches undef + $pass = defined $got || defined $isnt; + } + else { + $pass = $got ne $isnt; + } + unless( $pass ) { unshift(@mess, "# it should not be "._q($got)."\n", "# but it is.\n"); @@ -266,7 +266,7 @@ * It would fail if the key were bogus, but if the key were bogus then * Really Bad Things would be happening anyway. --dan */ #if (defined(__ALPHA) && (__VMS_VER >= 70000000)) || \ - (defined(__alpha) && defined(__osf__)) /* Available only on >= 4.0 */ + (defined(__alpha) && defined(__osf__) && !defined(__GNUC__)) /* Available only on >= 4.0 */ # define HAS_PTHREAD_UNCHECKED_GETSPECIFIC_NP /* Configure test needed */ #endif @@ -1264,7 +1264,7 @@ S_scan_const(pTHX_ char *start) if (min > max) { Perl_croak(aTHX_ - "Invalid [] range \"%c-%c\" in transliteration operator", + "Invalid range \"%c-%c\" in transliteration operator", (char)min, (char)max); } @@ -1665,17 +1665,18 @@ S_scan_const(pTHX_ char *start) *d = '\0'; SvCUR_set(sv, d - SvPVX(sv)); if (SvCUR(sv) >= SvLEN(sv)) - Perl_croak(aTHX_ "panic: constant overflowed allocated space"); + Perl_croak(aTHX_ "panic: constant overflowed allocated space"); SvPOK_on(sv); if (PL_encoding && !has_utf8) { - sv_recode_to_utf8(sv, PL_encoding); - has_utf8 = TRUE; + sv_recode_to_utf8(sv, PL_encoding); + if (SvUTF8(sv)) + has_utf8 = TRUE; } if (has_utf8) { SvUTF8_on(sv); if (PL_lex_inwhat == OP_TRANS && PL_sublex_info.sub_op) { - PL_sublex_info.sub_op->op_private |= + PL_sublex_info.sub_op->op_private |= (PL_lex_repl ? OPpTRANS_FROM_UTF : OPpTRANS_TO_UTF); } } @@ -1954,7 +1955,7 @@ S_incl_perldb(pTHX) if (pdb) return pdb; - SETERRNO(0,SS$_NORMAL); + SETERRNO(0,SS_NORMAL); return "BEGIN { require 'perl5db.pl' }"; } return ""; @@ -3046,7 +3047,7 @@ Perl_yylex(pTHX) break; /* require real whitespace or :'s */ } tmp = (PL_expect == XOPERATOR ? '=' : '{'); /*'}(' for vi */ - if (*s != ';' && *s != tmp && (tmp != '=' || *s != ')')) { + if (*s != ';' && *s != '}' && *s != tmp && (tmp != '=' || *s != ')')) { char q = ((*s == '\'') ? '"' : '\''); /* If here for an expression, and parsed no attrs, back off. */ if (tmp == '=' && !attrs) { @@ -3769,6 +3770,7 @@ Perl_yylex(pTHX) case 'z': case 'Z': keylookup: { + I32 orig_keyword = 0; gv = Nullgv; gvp = 0; @@ -3833,6 +3835,7 @@ Perl_yylex(pTHX) } } if (ogv) { + orig_keyword = tmp; tmp = 0; /* overridden by import or by GLOBAL */ } else if (gv && !gvp @@ -4008,7 +4011,9 @@ Perl_yylex(pTHX) /* If followed by a bareword, see if it looks like indir obj. */ - if ((isIDFIRST_lazy_if(s,UTF) || *s == '$') && (tmp = intuit_method(s,gv))) + if (!orig_keyword + && (isIDFIRST_lazy_if(s,UTF) || *s == '$') + && (tmp = intuit_method(s,gv))) return tmp; /* Not a method, so call it a subroutine (if defined) */ @@ -4614,10 +4619,14 @@ Perl_yylex(pTHX) char *t; for (d = s; isALNUM_lazy_if(d,UTF); d++) ; t = skipspace(d); - if (strchr("|&*+-=!?:.", *t) && ckWARN_d(WARN_PRECEDENCE)) + if (strchr("|&*+-=!?:.", *t) && ckWARN_d(WARN_PRECEDENCE) + /* [perl #16184] */ + && !(t[0] == '=' && t[1] == '>') + ) { Perl_warner(aTHX_ packWARN(WARN_PRECEDENCE), "Precedence problem: open %.*s should be open(%.*s)", - d-s,s, d-s,s); + d - s, s, d - s, s); + } } LOP(OP_OPEN,XTERM); @@ -5018,6 +5027,8 @@ Perl_yylex(pTHX) if (*s == ':' && s[1] != ':') PL_expect = attrful; + else if (!have_name && *s != '{' && key == KEY_sub) + Perl_croak(aTHX_ "Illegal declaration of anonymous subroutine"); if (have_proto) { PL_nextval[PL_nexttoke].opval = @@ -7005,6 +7016,9 @@ S_scan_str(pTHX_ char *start, int keep_quoted, int keep_delims) sv_catpvn(sv, s, 1); if (has_utf8) SvUTF8_on(sv); + else if (PL_encoding) + sv_recode_to_utf8(sv, PL_encoding); + PL_multi_end = CopLINE(PL_curcop); s++; @@ -1542,6 +1542,7 @@ Perl_swash_init(pTHX_ char* pkg, char* name, SV *listsv, I32 minbits, I32 none) if (PL_curcop == &PL_compiling) { /* XXX ought to be handled by lex_start */ SAVEI32(PL_in_my); + PL_in_my = 0; sv_setpv(tokenbufsv, PL_tokenbuf); } errsv_save = newSVsv(ERRSV); @@ -85,7 +85,7 @@ Perl_safesysmalloc(MEM_SIZE size) else { PerlIO_puts(Perl_error_log,PL_no_mem) FLUSH; my_exit(1); - return Nullch; + return Nullch; } /*NOTREACHED*/ } @@ -1108,7 +1108,7 @@ Perl_vmess(pTHX_ const char *pat, va_list *args) if (CopLINE(cop)) Perl_sv_catpvf(aTHX_ sv, " at %s line %"IVdf, - OutCopFILE(cop), (IV)CopLINE(cop)); + OutCopFILE(cop), (IV)CopLINE(cop)); if (GvIO(PL_last_in_gv) && IoLINES(GvIOp(PL_last_in_gv))) { bool line_mode = (RsSIMPLE(PL_rs) && SvCUR(PL_rs) == 1 && *SvPVX(PL_rs) == '\n'); @@ -1492,85 +1492,84 @@ Perl_vwarner(pTHX_ U32 err, const char* pat, va_list* args) if (ckDEAD(err)) { #ifdef USE_5005THREADS - DEBUG_S(PerlIO_printf(Perl_debug_log, "croak: 0x%"UVxf" %s", PTR2UV(thr), message)); + DEBUG_S(PerlIO_printf(Perl_debug_log, "croak: 0x%"UVxf" %s", PTR2UV(thr), message)); #endif /* USE_5005THREADS */ - if (PL_diehook) { - /* sv_2cv might call Perl_croak() */ - SV *olddiehook = PL_diehook; - ENTER; - SAVESPTR(PL_diehook); - PL_diehook = Nullsv; - cv = sv_2cv(olddiehook, &stash, &gv, 0); - LEAVE; - if (cv && !CvDEPTH(cv) && (CvROOT(cv) || CvXSUB(cv))) { - dSP; - SV *msg; - - ENTER; + if (PL_diehook) { + /* sv_2cv might call Perl_croak() */ + SV *olddiehook = PL_diehook; + ENTER; + SAVESPTR(PL_diehook); + PL_diehook = Nullsv; + cv = sv_2cv(olddiehook, &stash, &gv, 0); + LEAVE; + if (cv && !CvDEPTH(cv) && (CvROOT(cv) || CvXSUB(cv))) { + dSP; + SV *msg; + + ENTER; save_re_context(); - msg = newSVpvn(message, msglen); - SvREADONLY_on(msg); - SAVEFREESV(msg); + msg = newSVpvn(message, msglen); + SvREADONLY_on(msg); + SAVEFREESV(msg); PUSHSTACKi(PERLSI_DIEHOOK); - PUSHMARK(sp); - XPUSHs(msg); - PUTBACK; - call_sv((SV*)cv, G_DISCARD); + PUSHMARK(sp); + XPUSHs(msg); + PUTBACK; + call_sv((SV*)cv, G_DISCARD); POPSTACK; - LEAVE; - } - } - if (PL_in_eval) { - PL_restartop = die_where(message, msglen); - JMPENV_JUMP(3); - } + LEAVE; + } + } + if (PL_in_eval) { + PL_restartop = die_where(message, msglen); + JMPENV_JUMP(3); + } { PerlIO *serr = Perl_error_log; PERL_WRITE_MSG_TO_CONSOLE(serr, message, msglen); (void)PerlIO_flush(serr); } - my_failure_exit(); - + my_failure_exit(); } else { - if (PL_warnhook) { - /* sv_2cv might call Perl_warn() */ - SV *oldwarnhook = PL_warnhook; - ENTER; - SAVESPTR(PL_warnhook); - PL_warnhook = Nullsv; - cv = sv_2cv(oldwarnhook, &stash, &gv, 0); + if (PL_warnhook) { + /* sv_2cv might call Perl_warn() */ + SV *oldwarnhook = PL_warnhook; + ENTER; + SAVESPTR(PL_warnhook); + PL_warnhook = Nullsv; + cv = sv_2cv(oldwarnhook, &stash, &gv, 0); LEAVE; - if (cv && !CvDEPTH(cv) && (CvROOT(cv) || CvXSUB(cv))) { - dSP; - SV *msg; + if (cv && !CvDEPTH(cv) && (CvROOT(cv) || CvXSUB(cv))) { + dSP; + SV *msg; - ENTER; + ENTER; save_re_context(); - msg = newSVpvn(message, msglen); - SvREADONLY_on(msg); - SAVEFREESV(msg); + msg = newSVpvn(message, msglen); + SvREADONLY_on(msg); + SAVEFREESV(msg); PUSHSTACKi(PERLSI_WARNHOOK); - PUSHMARK(sp); - XPUSHs(msg); - PUTBACK; - call_sv((SV*)cv, G_DISCARD); + PUSHMARK(sp); + XPUSHs(msg); + PUTBACK; + call_sv((SV*)cv, G_DISCARD); POPSTACK; - LEAVE; - return; - } - } + LEAVE; + return; + } + } { PerlIO *serr = Perl_error_log; PERL_WRITE_MSG_TO_CONSOLE(serr, message, msglen); #ifdef LEAKTEST DEBUG_L(*message == '!' ? (xstat(message[1]=='!' - ? (message[2]=='!' ? 2 : 1) - : 0) - , 0) + ? (message[2]=='!' ? 2 : 1) + : 0) + , 0) : 0); #endif (void)PerlIO_flush(serr); @@ -1613,9 +1612,9 @@ Perl_my_setenv(pTHX_ char *nam, char *val) for (max = i; environ[max]; max++) ; tmpenv = (char**)safesysmalloc((max+2) * sizeof(char*)); for (j=0; j<max; j++) { /* copy environment */ - int len = strlen(environ[j]); - tmpenv[j] = (char*)safesysmalloc((len+1)*sizeof(char)); - Copy(environ[j], tmpenv[j], len+1, char); + int len = strlen(environ[j]); + tmpenv[j] = (char*)safesysmalloc((len+1)*sizeof(char)); + Copy(environ[j], tmpenv[j], len+1, char); } tmpenv[max] = Nullch; environ = tmpenv; /* tell exec where it is now */ @@ -1648,7 +1647,7 @@ Perl_my_setenv(pTHX_ char *nam, char *val) char *new_env; int nlen = strlen(nam), vlen; if (!val) { - val = ""; + val = ""; } vlen = strlen(val); new_env = (char*)safesysmalloc((nlen + vlen + 2) * sizeof(char)); @@ -2003,7 +2002,7 @@ Perl_my_popen_list(pTHX_ char *mode, int n, SV **args) int fd; for (fd = PL_maxsysfd + 1; fd < NOFILE; fd++) { - if (fd != pp[1]) + if (fd != pp[1]) PerlLIO_close(fd); } } @@ -2141,11 +2140,11 @@ Perl_my_popen(pTHX_ char *cmd, char *mode) #define NOFILE 20 #endif { - int fd; + int fd; for (fd = PL_maxsysfd + 1; fd < NOFILE; fd++) if (fd != pp[1]) - PerlLIO_close(fd); + PerlLIO_close(fd); } #endif /* may or may not use the shell */ @@ -2155,10 +2154,13 @@ Perl_my_popen(pTHX_ char *cmd, char *mode) #endif /* defined OS2 */ /*SUPPRESS 560*/ if ((tmpgv = gv_fetchpv("$",TRUE, SVt_PV))) { - SvREADONLY_off(GvSV(tmpgv)); + SvREADONLY_off(GvSV(tmpgv)); sv_setiv(GvSV(tmpgv), PerlProc_getpid()); - SvREADONLY_on(GvSV(tmpgv)); - } + SvREADONLY_on(GvSV(tmpgv)); + } +#ifdef THREADS_HAVE_PIDS + PL_ppid = (IV)getppid(); +#endif PL_forkprocess = 0; hv_clear(PL_pidstatus); /* we have no children */ return Nullfp; @@ -2379,9 +2381,9 @@ Perl_rsignal_state(pTHX_ int signo) struct sigaction oact; if (sigaction(signo, (struct sigaction *)NULL, &oact) == -1) - return SIG_ERR; + return SIG_ERR; else - return oact.sa_handler; + return oact.sa_handler; } int @@ -2461,7 +2463,7 @@ Perl_rsignal_state(pTHX_ int signo) oldsig = PerlProc_signal(signo, sig_trap); PerlProc_signal(signo, oldsig); if (sig_trapped) - PerlProc_kill(PerlProc_getpid(), signo); + PerlProc_kill(PerlProc_getpid(), signo); return oldsig; } @@ -2563,35 +2565,35 @@ Perl_wait4pid(pTHX_ Pid_t pid, int *statusp, int flags) return -1; #if !defined(HAS_WAITPID) && !defined(HAS_WAIT4) || defined(HAS_WAITPID_RUNTIME) { - SV *sv; - SV** svp; - char spid[TYPE_CHARS(int)]; - - if (pid > 0) { - sprintf(spid, "%"IVdf, (IV)pid); - svp = hv_fetch(PL_pidstatus,spid,strlen(spid),FALSE); - if (svp && *svp != &PL_sv_undef) { - *statusp = SvIVX(*svp); - (void)hv_delete(PL_pidstatus,spid,strlen(spid),G_DISCARD); - return pid; - } - } - else { - HE *entry; - - hv_iterinit(PL_pidstatus); - if ((entry = hv_iternext(PL_pidstatus))) { - SV *sv; - char spid[TYPE_CHARS(int)]; + SV *sv; + SV** svp; + char spid[TYPE_CHARS(int)]; - pid = atoi(hv_iterkey(entry,(I32*)statusp)); - sv = hv_iterval(PL_pidstatus,entry); - *statusp = SvIVX(sv); + if (pid > 0) { sprintf(spid, "%"IVdf, (IV)pid); - (void)hv_delete(PL_pidstatus,spid,strlen(spid),G_DISCARD); - return pid; + svp = hv_fetch(PL_pidstatus,spid,strlen(spid),FALSE); + if (svp && *svp != &PL_sv_undef) { + *statusp = SvIVX(*svp); + (void)hv_delete(PL_pidstatus,spid,strlen(spid),G_DISCARD); + return pid; + } + } + else { + HE *entry; + + hv_iterinit(PL_pidstatus); + if ((entry = hv_iternext(PL_pidstatus))) { + SV *sv; + char spid[TYPE_CHARS(int)]; + + pid = atoi(hv_iterkey(entry,(I32*)statusp)); + sv = hv_iterval(PL_pidstatus,entry); + *statusp = SvIVX(sv); + sprintf(spid, "%"IVdf, (IV)pid); + (void)hv_delete(PL_pidstatus,spid,strlen(spid),G_DISCARD); + return pid; + } } - } } #endif #ifdef HAS_WAITPID @@ -2933,7 +2935,7 @@ Perl_find_script(pTHX_ char *scriptname, bool dosearch, char **search_ext, I32 f #endif ) { - xfound = tmpbuf; /* bingo! */ + xfound = tmpbuf; /* bingo! */ break; } if (!xfailed) @@ -2947,7 +2949,7 @@ Perl_find_script(pTHX_ char *scriptname, bool dosearch, char **search_ext, I32 f seen_dot = 1; /* Disable message. */ if (!xfound) { if (flags & 1) { /* do or die? */ - Perl_croak(aTHX_ "Can't %s %s%s%s", + Perl_croak(aTHX_ "Can't %s %s%s%s", (xfailed ? "execute" : "find"), (xfailed ? xfailed : scriptname), (xfailed ? "" : " on PATH"), @@ -3228,7 +3230,7 @@ Perl_new_struct_thread(pTHX_ struct perl_thread *t) PL_curstash = t->Tcurstash; /* always be set to main? */ PL_tainted = t->Ttainted; - PL_curpm = t->Tcurpm; /* XXX No PMOP ref count */ + PL_curpm = t->Tcurpm; /* XXX No PMOP ref count */ PL_rs = newSVsv(t->Trs); PL_last_in_gv = Nullgv; PL_ofs_sv = t->Tofs_sv ? SvREFCNT_inc(PL_ofs_sv) : Nullsv; @@ -3472,7 +3474,7 @@ Perl_my_fflush_all(pTHX) return 0; } # endif - SETERRNO(EBADF,RMS$_IFI); + SETERRNO(EBADF,RMS_IFI); return EOF; # endif #endif @@ -3481,54 +3483,67 @@ Perl_my_fflush_all(pTHX) void Perl_report_evil_fh(pTHX_ GV *gv, IO *io, I32 op) { - char *vile; - I32 warn_type; char *func = op == OP_READLINE ? "readline" : /* "<HANDLE>" not nice */ op == OP_LEAVEWRITE ? "write" : /* "write exit" not nice */ PL_op_desc[op]; char *pars = OP_IS_FILETEST(op) ? "" : "()"; - char *type = OP_IS_SOCKET(op) || - (gv && io && IoTYPE(io) == IoTYPE_SOCKET) ? - "socket" : "filehandle"; + char *type = OP_IS_SOCKET(op) + || (gv && io && IoTYPE(io) == IoTYPE_SOCKET) + ? "socket" : "filehandle"; char *name = NULL; - if (gv && io && IoTYPE(io) == IoTYPE_CLOSED) { - vile = "closed"; - warn_type = WARN_CLOSED; - } - else { - vile = "unopened"; - warn_type = WARN_UNOPENED; - } - if (gv && isGV(gv)) { name = GvENAME(gv); } if (op == OP_phoney_OUTPUT_ONLY || op == OP_phoney_INPUT_ONLY) { - if (name && *name) - Perl_warner(aTHX_ packWARN(WARN_IO), "Filehandle %s opened only for %sput", - name, - (op == OP_phoney_INPUT_ONLY ? "in" : "out")); - else - Perl_warner(aTHX_ packWARN(WARN_IO), "Filehandle opened only for %sput", - (op == OP_phoney_INPUT_ONLY ? "in" : "out")); - } else if (name && *name) { - Perl_warner(aTHX_ packWARN(warn_type), - "%s%s on %s %s %s", func, pars, vile, type, name); - if (io && IoDIRP(io) && !(IoFLAGS(io) & IOf_FAKE_DIRP)) - Perl_warner(aTHX_ packWARN(warn_type), - "\t(Are you trying to call %s%s on dirhandle %s?)\n", - func, pars, name); + if (ckWARN(WARN_IO)) { + const char *direction = (op == OP_phoney_INPUT_ONLY) ? "in" : "out"; + if (name && *name) + Perl_warner(aTHX_ packWARN(WARN_IO), + "Filehandle %s opened only for %sput", + name, direction); + else + Perl_warner(aTHX_ packWARN(WARN_IO), + "Filehandle opened only for %sput", direction); + } } else { - Perl_warner(aTHX_ packWARN(warn_type), - "%s%s on %s %s", func, pars, vile, type); - if (gv && io && IoDIRP(io) && !(IoFLAGS(io) & IOf_FAKE_DIRP)) - Perl_warner(aTHX_ packWARN(warn_type), + char *vile; + I32 warn_type; + + if (gv && io && IoTYPE(io) == IoTYPE_CLOSED) { + vile = "closed"; + warn_type = WARN_CLOSED; + } + else { + vile = "unopened"; + warn_type = WARN_UNOPENED; + } + + if (ckWARN(warn_type)) { + if (name && *name) { + Perl_warner(aTHX_ packWARN(warn_type), + "%s%s on %s %s %s", func, pars, vile, type, name); + if (io && IoDIRP(io) && !(IoFLAGS(io) & IOf_FAKE_DIRP)) + Perl_warner( + aTHX_ packWARN(warn_type), + "\t(Are you trying to call %s%s on dirhandle %s?)\n", + func, pars, name + ); + } + else { + Perl_warner(aTHX_ packWARN(warn_type), + "%s%s on %s %s", func, pars, vile, type); + if (gv && io && IoDIRP(io) && !(IoFLAGS(io) & IOf_FAKE_DIRP)) + Perl_warner( + aTHX_ packWARN(warn_type), "\t(Are you trying to call %s%s on dirhandle?)\n", - func, pars); + func, pars + ); + } + } } } @@ -3539,36 +3554,36 @@ static const char controllablechars[] = "?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_"; int Perl_ebcdic_control(pTHX_ int ch) { - if (ch > 'a') { - char *ctlp; - - if (islower(ch)) - ch = toupper(ch); - - if ((ctlp = strchr(controllablechars, ch)) == 0) { - Perl_die(aTHX_ "unrecognised control character '%c'\n", ch); - } - - if (ctlp == controllablechars) - return('\177'); /* DEL */ - else - return((unsigned char)(ctlp - controllablechars - 1)); - } else { /* Want uncontrol */ - if (ch == '\177' || ch == -1) - return('?'); - else if (ch == '\157') - return('\177'); - else if (ch == '\174') - return('\000'); - else if (ch == '^') /* '\137' in 1047, '\260' in 819 */ - return('\036'); - else if (ch == '\155') - return('\037'); - else if (0 < ch && ch < (sizeof(controllablechars) - 1)) - return(controllablechars[ch+1]); - else - Perl_die(aTHX_ "invalid control request: '\\%03o'\n", ch & 0xFF); + if (ch > 'a') { + char *ctlp; + + if (islower(ch)) + ch = toupper(ch); + + if ((ctlp = strchr(controllablechars, ch)) == 0) { + Perl_die(aTHX_ "unrecognised control character '%c'\n", ch); } + + if (ctlp == controllablechars) + return('\177'); /* DEL */ + else + return((unsigned char)(ctlp - controllablechars - 1)); + } else { /* Want uncontrol */ + if (ch == '\177' || ch == -1) + return('?'); + else if (ch == '\157') + return('\177'); + else if (ch == '\174') + return('\000'); + else if (ch == '^') /* '\137' in 1047, '\260' in 819 */ + return('\036'); + else if (ch == '\155') + return('\037'); + else if (0 < ch && ch < (sizeof(controllablechars) - 1)) + return(controllablechars[ch+1]); + else + Perl_die(aTHX_ "invalid control request: '\\%03o'\n", ch & 0xFF); + } } #endif @@ -3873,7 +3888,7 @@ return FALSE #define SV_CWD_ISDOT(dp) \ (dp->d_name[0] == '.' && (dp->d_name[1] == '\0' || \ - (dp->d_name[1] == '.' && dp->d_name[2] == '\0'))) + (dp->d_name[1] == '.' && dp->d_name[2] == '\0'))) /* =head1 Miscellaneous Functions @@ -3906,18 +3921,18 @@ Perl_getcwd_sv(pTHX_ register SV *sv) { char buf[MAXPATHLEN]; - /* Some getcwd()s automatically allocate a buffer of the given + /* Some getcwd()s automatically allocate a buffer of the given * size from the heap if they are given a NULL buffer pointer. * The problem is that this behaviour is not portable. */ - if (getcwd(buf, sizeof(buf) - 1)) { - STRLEN len = strlen(buf); - sv_setpvn(sv, buf, len); - return TRUE; - } - else { - sv_setsv(sv, &PL_sv_undef); - return FALSE; - } + if (getcwd(buf, sizeof(buf) - 1)) { + STRLEN len = strlen(buf); + sv_setpvn(sv, buf, len); + return TRUE; + } + else { + sv_setsv(sv, &PL_sv_undef); + return FALSE; + } } #else @@ -3931,7 +3946,7 @@ Perl_getcwd_sv(pTHX_ register SV *sv) (void)SvUPGRADE(sv, SVt_PV); if (PerlLIO_lstat(".", &statbuf) < 0) { - SV_CWD_RETURN_UNDEF; + SV_CWD_RETURN_UNDEF; } orig_cdev = statbuf.st_dev; @@ -3940,96 +3955,96 @@ Perl_getcwd_sv(pTHX_ register SV *sv) cino = orig_cino; for (;;) { - odev = cdev; - oino = cino; - - if (PerlDir_chdir("..") < 0) { - SV_CWD_RETURN_UNDEF; - } - if (PerlLIO_stat(".", &statbuf) < 0) { - SV_CWD_RETURN_UNDEF; - } - - cdev = statbuf.st_dev; - cino = statbuf.st_ino; - - if (odev == cdev && oino == cino) { - break; - } - if (!(dir = PerlDir_open("."))) { - SV_CWD_RETURN_UNDEF; - } - - while ((dp = PerlDir_read(dir)) != NULL) { + odev = cdev; + oino = cino; + + if (PerlDir_chdir("..") < 0) { + SV_CWD_RETURN_UNDEF; + } + if (PerlLIO_stat(".", &statbuf) < 0) { + SV_CWD_RETURN_UNDEF; + } + + cdev = statbuf.st_dev; + cino = statbuf.st_ino; + + if (odev == cdev && oino == cino) { + break; + } + if (!(dir = PerlDir_open("."))) { + SV_CWD_RETURN_UNDEF; + } + + while ((dp = PerlDir_read(dir)) != NULL) { #ifdef DIRNAMLEN - namelen = dp->d_namlen; + namelen = dp->d_namlen; #else - namelen = strlen(dp->d_name); + namelen = strlen(dp->d_name); #endif - /* skip . and .. */ - if (SV_CWD_ISDOT(dp)) { - continue; - } - - if (PerlLIO_lstat(dp->d_name, &statbuf) < 0) { - SV_CWD_RETURN_UNDEF; - } - - tdev = statbuf.st_dev; - tino = statbuf.st_ino; - if (tino == oino && tdev == odev) { - break; - } - } - - if (!dp) { - SV_CWD_RETURN_UNDEF; - } - - if (pathlen + namelen + 1 >= MAXPATHLEN) { - SV_CWD_RETURN_UNDEF; + /* skip . and .. */ + if (SV_CWD_ISDOT(dp)) { + continue; + } + + if (PerlLIO_lstat(dp->d_name, &statbuf) < 0) { + SV_CWD_RETURN_UNDEF; + } + + tdev = statbuf.st_dev; + tino = statbuf.st_ino; + if (tino == oino && tdev == odev) { + break; + } + } + + if (!dp) { + SV_CWD_RETURN_UNDEF; } - SvGROW(sv, pathlen + namelen + 1); + if (pathlen + namelen + 1 >= MAXPATHLEN) { + SV_CWD_RETURN_UNDEF; + } - if (pathlen) { - /* shift down */ - Move(SvPVX(sv), SvPVX(sv) + namelen + 1, pathlen, char); - } + SvGROW(sv, pathlen + namelen + 1); - /* prepend current directory to the front */ - *SvPVX(sv) = '/'; - Move(dp->d_name, SvPVX(sv)+1, namelen, char); - pathlen += (namelen + 1); + if (pathlen) { + /* shift down */ + Move(SvPVX(sv), SvPVX(sv) + namelen + 1, pathlen, char); + } + + /* prepend current directory to the front */ + *SvPVX(sv) = '/'; + Move(dp->d_name, SvPVX(sv)+1, namelen, char); + pathlen += (namelen + 1); #ifdef VOID_CLOSEDIR - PerlDir_close(dir); + PerlDir_close(dir); #else - if (PerlDir_close(dir) < 0) { - SV_CWD_RETURN_UNDEF; - } + if (PerlDir_close(dir) < 0) { + SV_CWD_RETURN_UNDEF; + } #endif } if (pathlen) { - SvCUR_set(sv, pathlen); - *SvEND(sv) = '\0'; - SvPOK_only(sv); + SvCUR_set(sv, pathlen); + *SvEND(sv) = '\0'; + SvPOK_only(sv); if (PerlDir_chdir(SvPVX(sv)) < 0) { - SV_CWD_RETURN_UNDEF; - } + SV_CWD_RETURN_UNDEF; + } } if (PerlLIO_stat(".", &statbuf) < 0) { - SV_CWD_RETURN_UNDEF; + SV_CWD_RETURN_UNDEF; } cdev = statbuf.st_dev; cino = statbuf.st_ino; if (cdev != orig_cdev || cino != orig_cino) { - Perl_croak(aTHX_ "Unstable directory path, " - "current directory changed unexpectedly"); + Perl_croak(aTHX_ "Unstable directory path, " + "current directory changed unexpectedly"); } return TRUE; @@ -4130,39 +4145,38 @@ S_socketpair_udp (int fd[2]) { int sockets[2] = {-1, -1}; struct sockaddr_in addresses[2]; int i; - Sock_size_t size = sizeof (struct sockaddr_in); + Sock_size_t size = sizeof(struct sockaddr_in); unsigned short port; int got; - memset (&addresses, 0, sizeof (addresses)); + memset(&addresses, 0, sizeof(addresses)); i = 1; do { - sockets[i] = PerlSock_socket (AF_INET, SOCK_DGRAM, PF_INET); - if (sockets[i] == -1) - goto tidy_up_and_fail; - - addresses[i].sin_family = AF_INET; - addresses[i].sin_addr.s_addr = htonl (INADDR_LOOPBACK); - addresses[i].sin_port = 0; /* kernel choses port. */ - if (PerlSock_bind (sockets[i], (struct sockaddr *) &addresses[i], - sizeof (struct sockaddr_in)) - == -1) - goto tidy_up_and_fail; + sockets[i] = PerlSock_socket(AF_INET, SOCK_DGRAM, PF_INET); + if (sockets[i] == -1) + goto tidy_up_and_fail; + + addresses[i].sin_family = AF_INET; + addresses[i].sin_addr.s_addr = htonl(INADDR_LOOPBACK); + addresses[i].sin_port = 0; /* kernel choses port. */ + if (PerlSock_bind(sockets[i], (struct sockaddr *) &addresses[i], + sizeof(struct sockaddr_in)) == -1) + goto tidy_up_and_fail; } while (i--); /* Now have 2 UDP sockets. Find out which port each is connected to, and for each connect the other socket to it. */ i = 1; do { - if (PerlSock_getsockname (sockets[i], (struct sockaddr *) &addresses[i], &size) - == -1) - goto tidy_up_and_fail; - if (size != sizeof (struct sockaddr_in)) - goto abort_tidy_up_and_fail; - /* !1 is 0, !0 is 1 */ - if (PerlSock_connect(sockets[!i], (struct sockaddr *) &addresses[i], - sizeof (struct sockaddr_in)) == -1) - goto tidy_up_and_fail; + if (PerlSock_getsockname(sockets[i], (struct sockaddr *) &addresses[i], + &size) == -1) + goto tidy_up_and_fail; + if (size != sizeof(struct sockaddr_in)) + goto abort_tidy_up_and_fail; + /* !1 is 0, !0 is 1 */ + if (PerlSock_connect(sockets[!i], (struct sockaddr *) &addresses[i], + sizeof(struct sockaddr_in)) == -1) + goto tidy_up_and_fail; } while (i--); /* Now we have 2 sockets connected to each other. I don't trust some other @@ -4170,16 +4184,16 @@ S_socketpair_udp (int fd[2]) { a packet from each to the other. */ i = 1; do { - /* I'm going to send my own port number. As a short. - (Who knows if someone somewhere has sin_port as a bitfield and needs - this routine. (I'm assuming crays have socketpair)) */ - port = addresses[i].sin_port; - got = PerlLIO_write (sockets[i], &port, sizeof(port)); - if (got != sizeof(port)) { - if (got == -1) - goto tidy_up_and_fail; - goto abort_tidy_up_and_fail; - } + /* I'm going to send my own port number. As a short. + (Who knows if someone somewhere has sin_port as a bitfield and needs + this routine. (I'm assuming crays have socketpair)) */ + port = addresses[i].sin_port; + got = PerlLIO_write(sockets[i], &port, sizeof(port)); + if (got != sizeof(port)) { + if (got == -1) + goto tidy_up_and_fail; + goto abort_tidy_up_and_fail; + } } while (i--); /* Packets sent. I don't trust them to have arrived though. @@ -4193,54 +4207,54 @@ S_socketpair_udp (int fd[2]) { */ { - struct timeval waitfor = {0, 100000}; /* You have 0.1 seconds */ - int max = sockets[1] > sockets[0] ? sockets[1] : sockets[0]; - fd_set rset; - - FD_ZERO (&rset); - FD_SET (sockets[0], &rset); - FD_SET (sockets[1], &rset); - - got = PerlSock_select (max + 1, &rset, NULL, NULL, &waitfor); - if (got != 2 || !FD_ISSET (sockets[0], &rset) - || !FD_ISSET (sockets[1], &rset)) { - /* I hope this is portable and appropriate. */ - if (got == -1) - goto tidy_up_and_fail; - goto abort_tidy_up_and_fail; - } + struct timeval waitfor = {0, 100000}; /* You have 0.1 seconds */ + int max = sockets[1] > sockets[0] ? sockets[1] : sockets[0]; + fd_set rset; + + FD_ZERO(&rset); + FD_SET(sockets[0], &rset); + FD_SET(sockets[1], &rset); + + got = PerlSock_select(max + 1, &rset, NULL, NULL, &waitfor); + if (got != 2 || !FD_ISSET(sockets[0], &rset) + || !FD_ISSET(sockets[1], &rset)) { + /* I hope this is portable and appropriate. */ + if (got == -1) + goto tidy_up_and_fail; + goto abort_tidy_up_and_fail; + } } /* And the paranoia department even now doesn't trust it to have arrive (hence MSG_DONTWAIT). Or that what arrives was sent by us. */ { - struct sockaddr_in readfrom; - unsigned short buffer[2]; + struct sockaddr_in readfrom; + unsigned short buffer[2]; - i = 1; - do { + i = 1; + do { #ifdef MSG_DONTWAIT - got = PerlSock_recvfrom (sockets[i], (char *) &buffer, sizeof(buffer), - MSG_DONTWAIT, - (struct sockaddr *) &readfrom, &size); + got = PerlSock_recvfrom(sockets[i], (char *) &buffer, + sizeof(buffer), MSG_DONTWAIT, + (struct sockaddr *) &readfrom, &size); #else - got = PerlSock_recvfrom (sockets[i], (char *) &buffer, sizeof(buffer), - 0, - (struct sockaddr *) &readfrom, &size); + got = PerlSock_recvfrom(sockets[i], (char *) &buffer, + sizeof(buffer), 0, + (struct sockaddr *) &readfrom, &size); #endif - if (got == -1) - goto tidy_up_and_fail; - if (got != sizeof(port) - || size != sizeof (struct sockaddr_in) - /* Check other socket sent us its port. */ - || buffer[0] != (unsigned short) addresses[!i].sin_port - /* Check kernel says we got the datagram from that socket. */ - || readfrom.sin_family != addresses[!i].sin_family - || readfrom.sin_addr.s_addr != addresses[!i].sin_addr.s_addr - || readfrom.sin_port != addresses[!i].sin_port) - goto abort_tidy_up_and_fail; - } while (i--); + if (got == -1) + goto tidy_up_and_fail; + if (got != sizeof(port) + || size != sizeof(struct sockaddr_in) + /* Check other socket sent us its port. */ + || buffer[0] != (unsigned short) addresses[!i].sin_port + /* Check kernel says we got the datagram from that socket */ + || readfrom.sin_family != addresses[!i].sin_family + || readfrom.sin_addr.s_addr != addresses[!i].sin_addr.s_addr + || readfrom.sin_port != addresses[!i].sin_port) + goto abort_tidy_up_and_fail; + } while (i--); } /* My caller (my_socketpair) has validated that this is non-NULL */ fd[0] = sockets[0]; @@ -4253,13 +4267,13 @@ S_socketpair_udp (int fd[2]) { errno = ECONNABORTED; tidy_up_and_fail: { - int save_errno = errno; - if (sockets[0] != -1) - PerlLIO_close (sockets[0]); - if (sockets[1] != -1) - PerlLIO_close (sockets[1]); - errno = save_errno; - return -1; + int save_errno = errno; + if (sockets[0] != -1) + PerlLIO_close(sockets[0]); + if (sockets[1] != -1) + PerlLIO_close(sockets[1]); + errno = save_errno; + return -1; } } #endif /* EMULATE_SOCKETPAIR_UDP */ @@ -4281,62 +4295,65 @@ Perl_my_socketpair (int family, int type, int protocol, int fd[2]) { #ifdef AF_UNIX || family != AF_UNIX #endif - ) { - errno = EAFNOSUPPORT; - return -1; + ) { + errno = EAFNOSUPPORT; + return -1; } if (!fd) { - errno = EINVAL; - return -1; + errno = EINVAL; + return -1; } #ifdef EMULATE_SOCKETPAIR_UDP if (type == SOCK_DGRAM) - return S_socketpair_udp (fd); + return S_socketpair_udp(fd); #endif - listener = PerlSock_socket (AF_INET, type, 0); + listener = PerlSock_socket(AF_INET, type, 0); if (listener == -1) - return -1; - memset (&listen_addr, 0, sizeof (listen_addr)); + return -1; + memset(&listen_addr, 0, sizeof(listen_addr)); listen_addr.sin_family = AF_INET; - listen_addr.sin_addr.s_addr = htonl (INADDR_LOOPBACK); + listen_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); listen_addr.sin_port = 0; /* kernel choses port. */ - if (PerlSock_bind (listener, (struct sockaddr *) &listen_addr, sizeof (listen_addr)) - == -1) - goto tidy_up_and_fail; + if (PerlSock_bind(listener, (struct sockaddr *) &listen_addr, + sizeof(listen_addr)) == -1) + goto tidy_up_and_fail; if (PerlSock_listen(listener, 1) == -1) - goto tidy_up_and_fail; + goto tidy_up_and_fail; - connector = PerlSock_socket (AF_INET, type, 0); + connector = PerlSock_socket(AF_INET, type, 0); if (connector == -1) - goto tidy_up_and_fail; + goto tidy_up_and_fail; /* We want to find out the port number to connect to. */ - size = sizeof (connect_addr); - if (PerlSock_getsockname (listener, (struct sockaddr *) &connect_addr, &size) == -1) - goto tidy_up_and_fail; - if (size != sizeof (connect_addr)) - goto abort_tidy_up_and_fail; + size = sizeof(connect_addr); + if (PerlSock_getsockname(listener, (struct sockaddr *) &connect_addr, + &size) == -1) + goto tidy_up_and_fail; + if (size != sizeof(connect_addr)) + goto abort_tidy_up_and_fail; if (PerlSock_connect(connector, (struct sockaddr *) &connect_addr, - sizeof (connect_addr)) == -1) - goto tidy_up_and_fail; + sizeof(connect_addr)) == -1) + goto tidy_up_and_fail; - size = sizeof (listen_addr); - acceptor = PerlSock_accept (listener, (struct sockaddr *) &listen_addr, &size); + size = sizeof(listen_addr); + acceptor = PerlSock_accept(listener, (struct sockaddr *) &listen_addr, + &size); if (acceptor == -1) - goto tidy_up_and_fail; - if (size != sizeof (listen_addr)) - goto abort_tidy_up_and_fail; - PerlLIO_close (listener); + goto tidy_up_and_fail; + if (size != sizeof(listen_addr)) + goto abort_tidy_up_and_fail; + PerlLIO_close(listener); /* Now check we are talking to ourself by matching port and host on the two sockets. */ - if (PerlSock_getsockname (connector, (struct sockaddr *) &connect_addr, &size) == -1) - goto tidy_up_and_fail; - if (size != sizeof (connect_addr) - || listen_addr.sin_family != connect_addr.sin_family - || listen_addr.sin_addr.s_addr != connect_addr.sin_addr.s_addr - || listen_addr.sin_port != connect_addr.sin_port) { - goto abort_tidy_up_and_fail; + if (PerlSock_getsockname(connector, (struct sockaddr *) &connect_addr, + &size) == -1) + goto tidy_up_and_fail; + if (size != sizeof(connect_addr) + || listen_addr.sin_family != connect_addr.sin_family + || listen_addr.sin_addr.s_addr != connect_addr.sin_addr.s_addr + || listen_addr.sin_port != connect_addr.sin_port) { + goto abort_tidy_up_and_fail; } fd[0] = connector; fd[1] = acceptor; @@ -4346,15 +4363,15 @@ Perl_my_socketpair (int family, int type, int protocol, int fd[2]) { errno = ECONNABORTED; /* I hope this is portable and appropriate. */ tidy_up_and_fail: { - int save_errno = errno; - if (listener != -1) - PerlLIO_close (listener); - if (connector != -1) - PerlLIO_close (connector); - if (acceptor != -1) - PerlLIO_close (acceptor); - errno = save_errno; - return -1; + int save_errno = errno; + if (listener != -1) + PerlLIO_close(listener); + if (connector != -1) + PerlLIO_close(connector); + if (acceptor != -1) + PerlLIO_close(acceptor); + errno = save_errno; + return -1; } } #else diff --git a/utils/c2ph.PL b/utils/c2ph.PL index d676218ce3..655ae294c1 100644 --- a/utils/c2ph.PL +++ b/utils/c2ph.PL @@ -184,9 +184,9 @@ declarations at least, but that's quite a bit. Prior to this point, anyone programming in perl who wanted to interact with C programs, like the kernel, was forced to guess the layouts of -the C strutures, and then hardwire these into his program. Of course, +the C structures, and then hardwire these into his program. Of course, when you took your wonderfully crafted program to a system where the -sgtty structure was laid out differently, you program broke. Which is +sgtty structure was laid out differently, your program broke. Which is a shame. We've had Larry's h2ph translator, which helped, but that only works on diff --git a/utils/dprofpp.PL b/utils/dprofpp.PL index d04f61dc44..aff0f9b1e3 100644 --- a/utils/dprofpp.PL +++ b/utils/dprofpp.PL @@ -228,7 +228,7 @@ calling level then it is displayed once with a repeat count. =item B<-S> -Display I<merged> subroutine call tree to stdout. Statistics is +Display I<merged> subroutine call tree to stdout. Statistics are displayed for each branch of the tree. When a function is called multiple (I<not necessarily consecutive>) diff --git a/utils/h2ph.PL b/utils/h2ph.PL index 2868414685..04dc1325a6 100644 --- a/utils/h2ph.PL +++ b/utils/h2ph.PL @@ -42,8 +42,8 @@ use Config; use File::Path qw(mkpath); use Getopt::Std; -getopts('Dd:rlhaQ'); -use vars qw($opt_D $opt_d $opt_r $opt_l $opt_h $opt_a $opt_Q); +getopts('Dd:rlhaQe'); +use vars qw($opt_D $opt_d $opt_r $opt_l $opt_h $opt_a $opt_Q $opt_e); die "-r and -a options are mutually exclusive\n" if ($opt_r and $opt_a); my @inc_dirs = inc_dirs() if $opt_a; @@ -65,13 +65,21 @@ my %isatype; @isatype{@isatype} = (1) x @isatype; my $inif = 0; my %Is_converted; +my %bad_file = (); @ARGV = ('-') unless @ARGV; build_preamble_if_necessary(); +sub reindent($) { + my($text) = shift; + $text =~ s/\n/\n /g; + $text =~ s/ /\t/g; + $text; +} + my ($t, $tab, %curargs, $new, $eval_index, $dir, $name, $args, $outfile); -my ($incl, $next); +my ($incl, $incl_type, $next); while (defined (my $file = next_file())) { if (-l $file and -d $file) { link_if_possible($file) if ($opt_l); @@ -169,22 +177,31 @@ while (defined (my $file = next_file())) { print OUT $t,"unless(defined(\&$name)) {\n sub $name () {\t",$new,";}\n}\n"; } } - } elsif (/^(include|import)\s*[<"](.*)[>"]/) { - ($incl = $2) =~ s/\.h$/.ph/; - print OUT $t,"require '$incl';\n"; - } elsif(/^include_next\s*[<"](.*)[>"]/) { - ($incl = $1) =~ s/\.h$/.ph/; + } elsif (/^(include|import|include_next)\s*[<\"](.*)[>\"]/) { + $incl_type = $1; + $incl = $2; + if (($incl_type eq 'include_next') || + ($opt_e && exists($bad_file{$incl}))) { + $incl =~ s/\.h$/.ph/; print OUT ($t, "eval {\n"); $tab += 4; $t = "\t" x ($tab / 8) . ' ' x ($tab % 8); + print OUT ($t, "my(\@REM);\n"); + if ($incl_type eq 'include_next') { print OUT ($t, "my(\%INCD) = map { \$INC{\$_} => 1 } ", - "(grep { \$_ eq \"$incl\" } keys(\%INC));\n"); + "(grep { \$_ eq \"$incl\" } ", + "keys(\%INC));\n"); print OUT ($t, - "my(\@REM) = map { \"\$_/$incl\" } ", + "\@REM = map { \"\$_/$incl\" } ", "(grep { not exists(\$INCD{\"\$_/$incl\"})", - "and -f \"\$_/$incl\" } \@INC);\n"); + " and -f \"\$_/$incl\" } \@INC);\n"); + } else { + print OUT ($t, + "\@REM = map { \"\$_/$incl\" } ", + "(grep {-r \"\$_/$incl\" } \@INC);\n"); + } print OUT ($t, "require \"\$REM[0]\" if \@REM;\n"); $tab -= 4; @@ -193,6 +210,10 @@ while (defined (my $file = next_file())) { "};\n"); print OUT ($t, "warn(\$\@) if \$\@;\n"); + } else { + $incl =~ s/\.h$/.ph/; + print OUT $t,"require '$incl';\n"; + } } elsif (/^ifdef\s+(\w+)/) { print OUT $t,"if(defined(&$1)) {\n"; $tab += 4; @@ -274,22 +295,22 @@ while (defined (my $file = next_file())) { } } } - print OUT "1;\n"; - $Is_converted{$file} = 1; + if ($opt_e && exists($bad_file{$file})) { + unlink($Dest_dir . '/' . $outfile); + $next = ''; + } else { + print OUT "1;\n"; queue_includes_from($file) if ($opt_a); + } } -exit $Exit; - - -sub reindent($) { - my($text) = shift; - $text =~ s/\n/\n /g; - $text =~ s/ /\t/g; - $text; +if ($opt_e && (scalar(keys %bad_file) > 0)) { + warn "Was unable to convert the following files:\n"; + warn "\t" . join("\n\t",sort(keys %bad_file)) . "\n"; } +exit $Exit; sub expr { my $joined_args; @@ -485,7 +506,15 @@ sub next_line $in =~ s!\'T KNOW!!) { $out =~ s!I DON$!I_DO_NOT_KNOW!; } else { + if ($opt_e) { + warn "Cannot parse $file:\n$in\n"; + $bad_file{$file} = 1; + $in = ''; + $out = undef; + last READ; + } else { die "Cannot parse:\n$in\n"; + } } } diff --git a/utils/perldoc.PL b/utils/perldoc.PL index 76caaabda0..e2c65369d9 100644 --- a/utils/perldoc.PL +++ b/utils/perldoc.PL @@ -42,7 +42,7 @@ INIT { eval { umask(0077) } } # doubtless someone has no mask $Config{pager} /../ my \@pagers = (); -push \@pagers, \$pager if -x \$pager; +push \@pagers, \$pager if -x (split /\\s+/, \$pager)[0]; (my \$bindir = <<'/../') =~ s/\\s*\\z//; $Config{scriptdirexp} @@ -94,6 +94,7 @@ my $Is_VMS = $^O eq 'VMS'; my $Is_MSWin32 = $^O eq 'MSWin32'; my $Is_Dos = $^O eq 'dos'; my $Is_OS2 = $^O eq 'os2'; +my $Is_BeOS = $^O eq 'beos'; sub usage{ warn "@_\n" if @_; @@ -109,7 +110,7 @@ Options: -r Recursive search (slow) -i Ignore case -t Display pod using pod2text instead of pod2man and nroff - (-t is the default on win32) + (-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 @@ -118,7 +119,6 @@ Options: -v Verbosely describe what's going on -X use index if present (looks for pod.idx at $Config{archlib}) -q Search the text of questions (not answers) in perlfaq[1-9] - -U Run in insecure mode (superuser only) PageName|ModuleName... is the name of a piece of documentation that you want to look at. You @@ -147,7 +147,7 @@ if (defined $ENV{"PERLDOC"}) { } !NO!SUBS! -my $getopts = "mhtluvriFf:Xq:n:U"; +my $getopts = "mhtluvriFf:Xq:n:"; print OUT <<"!GET!OPTS!"; use vars qw( @{[map "\$opt_$_", ($getopts =~ /\w/g)]} ); @@ -159,15 +159,13 @@ print OUT <<'!NO!SUBS!'; usage if $opt_h; -# refuse to run if we should be tainting and aren't -# (but regular users deserve protection too, though!) -if (!($Is_VMS || $Is_MSWin32 || $Is_Dos || $Is_OS2) && ($> == 0 || $< == 0) - && !am_taint_checking()) -{{ - if ($opt_U) { - my $id = eval { getpwnam("nobody") }; - $id = eval { getpwnam("nouser") } unless defined $id; - $id = -2 unless defined $id; +# attempt to drop privs if we should be tainting and aren't +if (!($Is_VMS || $Is_MSWin32 || $Is_Dos || $Is_OS2 || $Is_BeOS) + && ($> == 0 || $< == 0) && !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 @@ -186,18 +184,15 @@ if (!($Is_VMS || $Is_MSWin32 || $Is_Dos || $Is_OS2) && ($> == 0 || $< == 0) # 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 - }; - last if !$@ && $< && $>; - } - die "Superuser must not run $0 without security audit and taint checks.\n"; -}} - -$opt_n = "nroff" if !$opt_n; + eval { + $< = $id; # real uid + $> = $id; # effective uid + $< = $id; # real uid + $> = $id; # effective uid + }; + die "Superuser must not run $0 without security audit and taint checks.\n" + unless !$@ && $< && $>; +} my $podidx; if ($opt_X) { @@ -208,15 +203,16 @@ if ($opt_X) { if ((my $opts = do{ no warnings; $opt_t + $opt_u + $opt_m + $opt_l }) > 1) { usage("only one of -t, -u, -m or -l") } -elsif ($Is_MSWin32 - || $Is_Dos - || !($ENV{TERM} && $ENV{TERM} !~ /dumb|emacs|none|unknown/i)) +elsif ($Is_MSWin32 || $Is_Dos || $Is_BeOS + || !($ENV{TERM} && $ENV{TERM} !~ /dumb|emacs|none|unknown/i)) { - $opt_t = 1 unless $opts; + $opt_t = 1 unless ( $opts || $opt_n ); } if ($opt_t) { require Pod::Text; import Pod::Text; } +$opt_n = "nroff" if !$opt_n; + my @pages; if ($opt_f) { @pages = ("perlfunc"); @@ -746,15 +742,6 @@ The B<-X> option looks for an entry whose basename matches the name given on the command line in the file C<$Config{archlib}/pod.idx>. The pod.idx file should contain fully qualified filenames, one per line. -=item B<-U> run insecurely - -Because B<perldoc> does not run properly tainted, and is known to -have security issues, it will not normally execute as the superuser. -If you use the B<-U> flag, it will do so, but only after setting -the effective and real IDs to nobody's or nouser's account, or -2 -if unavailable. If it cannot relinquish its privileges, it will not -run. - =item B<PageName|ModuleName|ProgramName> The item you want to look up. Nested modules (such as C<File::Basename>) @@ -763,6 +750,14 @@ give a descriptive name of a page, such as C<perlfunc>. =back +=head1 SECURITY + +Because B<perldoc> does not run properly tainted, and is known to +have security issues, when run as the superuser it will attempt to +drop privileges by setting the effective and real IDs to nobody's +or nouser's account, or -2 if unavailable. If it cannot relinquish +its privileges, it will not run. + =head1 ENVIRONMENT Any switches in the C<PERLDOC> environment variable will be used before the @@ -779,7 +774,7 @@ One useful value for C<PERLDOC_PAGER> is C<less -+C -E>. =head1 VERSION -This is perldoc v2.03. +This is perldoc v2.05. =head1 AUTHOR @@ -791,8 +786,14 @@ and others. =cut # +# 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@crypt0.demon.co.uk> +# 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> diff --git a/vms/descrip_mms.template b/vms/descrip_mms.template index 9d95e5a696..da73856ff7 100644 --- a/vms/descrip_mms.template +++ b/vms/descrip_mms.template @@ -200,11 +200,9 @@ THRLIBS2 = sys$share:cma$open_lib_shr/share|sys$share:cma$open_rtl/share .ifdef FAKETHREADED THREADDEF = THREADH = fakethr.h -acth = $(ARCHCORE)fakethr.h THREAD = THREAD .else THREADH = -acth = .endif # C preprocessor manifest "DEBUGGING" ==> perl -D, not the VMS debugger @@ -283,15 +281,19 @@ h = $(h0) $(h1) $(h2) $(h3) $(h4) $(h5) $(h6) ac0 = $(ARCHCORE)$(sockh) $(ARCHCORE)av.h $(ARCHCORE)cc_runtime.h ac1 = $(ARCHCORE)config.h $(ARCHCORE)cop.h $(ARCHCORE)cv.h $(ARCHCORE)embed.h -ac2 = $(ARCHCORE)embedvar.h $(ARCHCORE)extern.h $(acth) +ac2 = $(ARCHCORE)embedvar.h $(ARCHCORE)EXTERN.h $(ARCHCORE)fakethr.h ac3 = $(ARCHCORE)form.h $(ARCHCORE)gv.h $(ARCHCORE)handy.h $(ARCHCORE)hv.h -ac4 = $(ARCHCORE)intern.h $(ARCHCORE)intrpvar.h $(ARCHCORE)iperlsys.h +ac4 = $(ARCHCORE)INTERN.h $(ARCHCORE)intrpvar.h $(ARCHCORE)iperlsys.h ac5 = $(ARCHCORE)keywords.h $(ARCHCORE)mg.h $(ARCHCORE)nostdio.h ac6 = $(ARCHCORE)op.h $(ARCHCORE)opcode.h ac7 = $(ARCHCORE)opnames.h $(ARCHCORE)patchlevel.h $(ARCHCORE)perl.h ac8 = $(ARCHCORE)perlapi.h $(ARCHCORE)perlio.h $(ARCHCORE)perlsdio.h -ac9 = $(ARCHCORE)perlvars.h $(ARCHCORE)perly.h $(ARCHCORE)pp.h +ac9 = $(ARCHCORE)perlsfio.h $(ARCHCORE)perlvars.h $(ARCHCORE)perly.h $(ARCHCORE)pp.h +.ifdef THREADED +ac10 = $(ARCHCORE)pp_proto.h $(ARCHCORE)proto.h $(ARCHCORE)reentr.h $(ARCHCORE)regcomp.h +.else ac10 = $(ARCHCORE)pp_proto.h $(ARCHCORE)proto.h $(ARCHCORE)regcomp.h +.endif ac11 = $(ARCHCORE)regexp.h $(ARCHCORE)regnodes.h $(ARCHCORE)scope.h .ifdef SOCKARCH ac12 = $(ARCHCORE)sv.h $(ARCHCORE)thrdvar.h $(SOCKARCH) @@ -385,7 +387,7 @@ pod = $(pod0) $(pod1) $(pod2) $(pod3) $(pod4) $(pod5) $(pod6) $(pod7) $(pod8) $( perlpods : $(pod) @ $(NOOP) -archcorefiles : $(ac) $(acth) $(ARCHAUTO)time.stamp +archcorefiles : $(ac) $(ARCHAUTO)time.stamp @ $(NOOP) [.lib]re.pm : [.ext.re]re.pm @@ -983,14 +985,12 @@ $(ARCHCORE)embed.h : embed.h $(ARCHCORE)embedvar.h : embedvar.h @ If F$Search("$(ARCHDIR)CORE.dir").eqs."" Then Create/Directory $(ARCHCORE) Copy/Log $(MMS$SOURCE) $(MMS$TARGET) -$(ARCHCORE)extern.h : extern.h +$(ARCHCORE)EXTERN.h : EXTERN.h @ If F$Search("$(ARCHDIR)CORE.dir").eqs."" Then Create/Directory $(ARCHCORE) Copy/Log $(MMS$SOURCE) $(MMS$TARGET) -.ifdef FAKETHREADED $(ARCHCORE)fakethr.h : fakethr.h @ If F$Search("$(ARCHDIR)CORE.dir").eqs."" Then Create/Directory $(ARCHCORE) Copy/Log $(MMS$SOURCE) $(MMS$TARGET) -.endif $(ARCHCORE)form.h : form.h @ If F$Search("$(ARCHDIR)CORE.dir").eqs."" Then Create/Directory $(ARCHCORE) Copy/Log $(MMS$SOURCE) $(MMS$TARGET) @@ -1003,7 +1003,7 @@ $(ARCHCORE)handy.h : handy.h $(ARCHCORE)hv.h : hv.h @ If F$Search("$(ARCHDIR)CORE.dir").eqs."" Then Create/Directory $(ARCHCORE) Copy/Log $(MMS$SOURCE) $(MMS$TARGET) -$(ARCHCORE)intern.h : intern.h +$(ARCHCORE)INTERN.h : INTERN.h @ If F$Search("$(ARCHDIR)CORE.dir").eqs."" Then Create/Directory $(ARCHCORE) Copy/Log $(MMS$SOURCE) $(MMS$TARGET) $(ARCHCORE)intrpvar.h : intrpvar.h @@ -1045,6 +1045,9 @@ $(ARCHCORE)perlio.h : perlio.h $(ARCHCORE)perlsdio.h : perlsdio.h @ If F$Search("$(ARCHDIR)CORE.dir").eqs."" Then Create/Directory $(ARCHCORE) Copy/Log $(MMS$SOURCE) $(MMS$TARGET) +$(ARCHCORE)perlsfio.h : perlsfio.h + @ If F$Search("$(ARCHDIR)CORE.dir").eqs."" Then Create/Directory $(ARCHCORE) + Copy/Log $(MMS$SOURCE) $(MMS$TARGET) $(ARCHCORE)perlvars.h : perlvars.h @ If F$Search("$(ARCHDIR)CORE.dir").eqs."" Then Create/Directory $(ARCHCORE) Copy/Log $(MMS$SOURCE) $(MMS$TARGET) @@ -1060,6 +1063,11 @@ $(ARCHCORE)pp_proto.h : pp_proto.h $(ARCHCORE)proto.h : proto.h @ If F$Search("$(ARCHDIR)CORE.dir").eqs."" Then Create/Directory $(ARCHCORE) Copy/Log $(MMS$SOURCE) $(MMS$TARGET) +.ifdef THREADED +$(ARCHCORE)reentr.h : reentr.h + @ If F$Search("$(ARCHDIR)CORE.dir").eqs."" Then Create/Directory $(ARCHCORE) + Copy/Log $(MMS$SOURCE) $(MMS$TARGET) +.endif $(ARCHCORE)regcomp.h : regcomp.h @ If F$Search("$(ARCHDIR)CORE.dir").eqs."" Then Create/Directory $(ARCHCORE) Copy/Log $(MMS$SOURCE) $(MMS$TARGET) @@ -1168,7 +1176,7 @@ pp_pack$(O) : pp_pack.c extern.h perl.h config.h embed.h handy.h vmsish.h $(SOCK pp_sort$(O) : pp_sort.c extern.h perl.h config.h embed.h handy.h vmsish.h $(SOCKH) iperlsys.h perlsdio.h perl.h regexp.h sv.h util.h form.h gv.h cv.h opnames.h op.h cop.h av.h hv.h mg.h scope.h warnings.h utf8.h perly.h thread.h pp.h proto.h pp_proto.h opcode.h embedvar.h intrpvar.h thrdvar.h perlvars.h patchlevel.h pp_sys$(O) : pp_sys.c extern.h perl.h config.h embed.h handy.h vmsish.h $(SOCKH) iperlsys.h perlsdio.h perl.h regexp.h sv.h util.h form.h gv.h cv.h opnames.h op.h cop.h av.h hv.h mg.h scope.h warnings.h utf8.h perly.h thread.h pp.h proto.h pp_proto.h opcode.h embedvar.h intrpvar.h thrdvar.h perlvars.h patchlevel.h reentr.h $(CC) $(CORECFLAGS) $(MMS$SOURCE) -reentr(O) : reentr.c extern.h perl.h config.h embed.h handy.h vmsish.h $(SOCKH) iperlsys.h perlsdio.h perl.h regexp.h sv.h util.h form.h gv.h cv.h opnames.h op.h cop.h av.h hv.h mg.h scope.h warnings.h utf8.h perly.h thread.h pp.h proto.h pp_proto.h opcode.h embedvar.h intrpvar.h thrdvar.h perlvars.h patchlevel.h intern.h reentr.h +reentr$(O) : reentr.c extern.h perl.h config.h embed.h handy.h vmsish.h $(SOCKH) iperlsys.h perlsdio.h perl.h regexp.h sv.h util.h form.h gv.h cv.h opnames.h op.h cop.h av.h hv.h mg.h scope.h warnings.h utf8.h perly.h thread.h pp.h proto.h pp_proto.h opcode.h embedvar.h intrpvar.h thrdvar.h perlvars.h patchlevel.h intern.h reentr.h regcomp$(O) : regcomp.c extern.h perl.h config.h embed.h handy.h vmsish.h $(SOCKH) iperlsys.h perlsdio.h perl.h regexp.h sv.h util.h form.h gv.h cv.h opnames.h op.h cop.h av.h hv.h mg.h scope.h warnings.h utf8.h perly.h thread.h pp.h proto.h pp_proto.h opcode.h embedvar.h intrpvar.h thrdvar.h perlvars.h patchlevel.h intern.h regcomp.h regnodes.h $(CC) $(CORECFLAGS) $(MMS$SOURCE) regexec$(O) : regexec.c extern.h perl.h config.h embed.h handy.h vmsish.h $(SOCKH) iperlsys.h perlsdio.h perl.h regexp.h sv.h util.h form.h gv.h cv.h opnames.h op.h cop.h av.h hv.h mg.h scope.h warnings.h utf8.h perly.h thread.h pp.h proto.h pp_proto.h opcode.h embedvar.h intrpvar.h thrdvar.h perlvars.h patchlevel.h regcomp.h regnodes.h diff --git a/vms/ext/filespec.t b/vms/ext/filespec.t index 7123ffc51c..559659f2af 100644 --- a/vms/ext/filespec.t +++ b/vms/ext/filespec.t @@ -18,16 +18,17 @@ plan(tests => scalar(2*@tests)+6); foreach $test (@tests) { ($arg,$func,$expect) = split(/\s+/,$test); + $expect = undef if $expect eq 'undef'; $rslt = eval "$func('$arg')"; - is($@, '', "eval func('$arg')"); - is($rslt, $expect, " result"); + is($@, '', "eval ${func}('$arg')"); + is($rslt, $expect, "${func}('$arg'): '$rslt'"); } $defwarn = <<'EOW'; # Note: This failure may have occurred because your default device # was set using a non-concealed logical name. If this is the case, # you will need to determine by inspection that the two resultant -# file specifications shwn above are in fact equivalent. +# file specifications shown above are in fact equivalent. EOW is(uc(rmsexpand('[]')), "\U$ENV{DEFAULT}", 'rmsexpand()') || print $defwarn; @@ -86,9 +87,9 @@ __down_:[__the_.__garden_.__path_] fileify __down_:[__the_.__garden_]__path_ __down_/__the_/__garden_/__path_ fileify __down_/__the_/__garden_/__path_.dir;1 __down_:[__the_.__garden_]__path_ fileify __down_:[__the_.__garden_]__path_.dir;1 __down_:[__the_.__garden_]__path_. fileify # N.B. trailing . ==> null type -__down_:[__the_]__garden_.__path_ fileify +__down_:[__the_]__garden_.__path_ fileify undef /__down_/__the_/__garden_/__path_. fileify # N.B. trailing . ==> null type -/__down_/__the_/__garden_.__path_ fileify +/__down_/__the_/__garden_.__path_ fileify undef # and pathifying them __down_:[__the_.__garden_]__path_.dir;1 pathify __down_:[__the_.__garden_.__path_] @@ -97,15 +98,15 @@ __down_:[__the_.__garden_]__path_.dir;1 pathify __down_:[__the_.__garden_ __down_/__the_/__garden_/__path_.dir pathify __down_/__the_/__garden_/__path_/ __down_:[__the_.__garden_]__path_ pathify __down_:[__the_.__garden_.__path_] __down_:[__the_.__garden_]__path_. pathify # N.B. trailing . ==> null type -__down_:[__the_]__garden_.__path_ pathify +__down_:[__the_]__garden_.__path_ pathify undef /__down_/__the_/__garden_/__path_. pathify # N.B. trailing . ==> null type -/__down_/__the_/__garden_.__path_ pathify +/__down_/__the_/__garden_.__path_ pathify undef __down_:[__the_.__garden_]__path_.dir;2 pathify #N.B. ;2 __path_ pathify __path_/ /__down_/__the_/__garden_/. pathify /__down_/__the_/__garden_/./ /__down_/__the_/__garden_/.. pathify /__down_/__the_/__garden_/../ /__down_/__the_/__garden_/... pathify /__down_/__the_/__garden_/.../ -__path_.notdir pathify +__path_.notdir pathify undef # Both VMS/Unix and file/path conversions __down_:[__the_.__garden_]__path_.dir;1 unixpath /__down_/__the_/__garden_/__path_/ diff --git a/win32/Makefile b/win32/Makefile index 0877f4d91b..61b2943b96 100644 --- a/win32/Makefile +++ b/win32/Makefile @@ -522,6 +522,7 @@ MICROCORE_SRC = \ ..\mg.c \ ..\numeric.c \ ..\op.c \ + ..\pad.c \ ..\perl.c \ ..\perlapi.c \ ..\perly.c \ diff --git a/win32/makefile.mk b/win32/makefile.mk index d2f76e7805..b839716413 100644 --- a/win32/makefile.mk +++ b/win32/makefile.mk @@ -34,7 +34,7 @@ INST_TOP *= $(INST_DRV)\perl # versioned installation can be obtained by setting INST_TOP above to a # path that includes an arbitrary version string. # -INST_VER *= \5.8.0 +INST_VER *= \5.9.0 # # Comment this out if you DON'T want your perl installation to have @@ -98,6 +98,9 @@ CCTYPE *= MSVC60 #CCTYPE *= BORLAND # mingw32+gcc-2.95.2 or better #CCTYPE *= GCC +# Uncomment this if you are using the latest MinGW release (2.0.0) +# with gcc3.2 +#USE_GCC_V3_2 *= define # # uncomment this if your Borland compiler is older than v5.4. @@ -388,6 +391,9 @@ LINK_FLAGS += -L"$(CCLIBDIR)\Release" CC = gcc LINK32 = gcc +.IF "$(USE_GCC_V3_2)" == "define" +LINK32 = g++ +.END LIB32 = ar rc IMPLIB = dlltool RSC = rc @@ -666,6 +672,7 @@ MICROCORE_SRC = \ ..\mg.c \ ..\numeric.c \ ..\op.c \ + ..\pad.c \ ..\perl.c \ ..\perlapi.c \ ..\perly.c \ diff --git a/win32/win32.c b/win32/win32.c index 41788273b7..3a13c4523d 100644 --- a/win32/win32.c +++ b/win32/win32.c @@ -15,7 +15,8 @@ #define Win32_Winsock #endif #include <windows.h> -#ifndef __MINGW32__ /* GCC/Mingw32-2.95.2 forgot the WINAPI on CommandLineToArgvW() */ +/* GCC-2.95.2/Mingw32-1.1 forgot the WINAPI on CommandLineToArgvW() */ +#if defined(__MINGW32__) && (__MINGW32_MAJOR_VERSION==1) # include <shellapi.h> #else LPWSTR* WINAPI CommandLineToArgvW(LPCWSTR lpCommandLine, int * pNumArgs); @@ -60,8 +61,8 @@ int _CRT_glob = 0; #endif -#if defined(__MINGW32__) -/* Mingw32 is missing some prototypes */ +#if defined(__MINGW32__) && (__MINGW32_MAJOR_VERSION==1) +/* Mingw32-1.1 is missing some prototypes */ FILE * _wfopen(LPCWSTR wszFileName, LPCWSTR wszMode); FILE * _wfdopen(int nFd, LPCWSTR wszMode); FILE * _freopen(LPCWSTR wszFileName, LPCWSTR wszMode, FILE * pOldStream); diff --git a/wince/Makefile.ce b/wince/Makefile.ce index 91e4780852..b501d25725 100644 --- a/wince/Makefile.ce +++ b/wince/Makefile.ce @@ -55,8 +55,8 @@ NOOP = @echo NULL = -CFG=DEBUG -#CFG=RELEASE +#CFG=DEBUG +CFG=RELEASE !if "$(MACHINE)" == "" MACHINE=wince-arm-hpc-wce300 diff --git a/wince/compile.bat b/wince/compile.bat index 582d422e81..851c68fb06 100644 --- a/wince/compile.bat +++ b/wince/compile.bat @@ -6,7 +6,7 @@ rem set ARG-1=PV= set ARG-2=INST_VER= -set ARG-3=INSTALL_ROOT=\Storage Card\perl-tests\perl@16376 +set ARG-3=INSTALL_ROOT=\Storage Card\perl58 set ARG-4=WCEROOT=%SDKROOT% set ARG-5=CEPATH=%WCEROOT% set ARG-6=CELIBDLLDIR=d:\personal\pocketPC\celib-palm-3.0 @@ -20,6 +20,6 @@ set ARG-10=MACHINE=wince-mips-pocket-wce300 set ARG-11=PERLCEDIR=$(MAKEDIR) set ARG-12=MSVCDIR=D:\MSVStudio\VC98 set ARG-13=CECOPY=$(HPERL) -I$(PERLCEDIR)\lib $(PERLCEDIR)\comp.pl --copy -set ARG-14=USE_PERLIO=undef +set ARG-14= nmake -f Makefile.ce "%ARG-1%" "%ARG-2%" "%ARG-3%" "%ARG-4%" "%ARG-5%" "%ARG-6%" "%ARG-7%" "%ARG-8%" "%ARG-9%" "%ARG-10%" "%ARG-11%" "%ARG-12%" "%ARG-13%" "%ARG-14%" %1 %2 %3 %4 %5 %6 %7 %8 %9 diff --git a/wince/win32io.c b/wince/win32io.c index 3683490ac4..22a142749b 100644 --- a/wince/win32io.c +++ b/wince/win32io.c @@ -53,9 +53,9 @@ PerlIOWin32_fileno(pTHX_ PerlIO *f) } IV -PerlIOWin32_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg) +PerlIOWin32_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab) { - IV code = PerlIOBase_pushed(aTHX_ f,mode,arg); + IV code = PerlIOBase_pushed(aTHX_ f,mode,arg,tab); if (*PerlIONext(f)) { PerlIOWin32 *s = PerlIOSelf(f,PerlIOWin32); diff --git a/wince/wince.c b/wince/wince.c index 8aefe6ca17..16bf2d2990 100644 --- a/wince/wince.c +++ b/wince/wince.c @@ -995,15 +995,15 @@ win32_eof(int fd) DllExport int win32_dup(int fd) { - Perl_croak(aTHX_ PL_no_func, "dup"); - return -1; + //vv Perl_croak(aTHX_ PL_no_func, "dup"); + return xcedup(fd); // from celib/ceio.c; requires some more work on it. } DllExport int win32_dup2(int fd1,int fd2) { - Perl_croak(aTHX_ PL_no_func, "dup2"); - return -1; + //Perl_croak(aTHX_ PL_no_func, "dup2"); + return xcedup2(fd1,fd2); } DllExport int diff --git a/x2p/s2p.PL b/x2p/s2p.PL index 1e2ee1a6ac..4b2daa918d 100644 --- a/x2p/s2p.PL +++ b/x2p/s2p.PL @@ -786,7 +786,7 @@ sub makey($$$){ my $fc = substr($fr,$i,1); my $tc = substr($to,$i,1); if( exists( $tr{$fc} ) && $tr{$fc} ne $tc ){ - Warn( "ambiguos translation for character `$fc' in `y' command", + Warn( "ambiguous translation for character `$fc' in `y' command", $fl ); $error++; } @@ -1860,7 +1860,7 @@ See L<"Additional Atoms">. =over 4 -=item ambiguos translation for character `%s' in `y' command +=item ambiguous translation for character `%s' in `y' command The indicated character appears twice, with different translations. @@ -299,7 +299,7 @@ str_gets(register STR *str, register FILE *fp) FILE_ptr(fp) = (void*)ptr; /* LHS STDCHAR* cast non-portable */ i = getc(fp); /* get more characters */ cnt = FILE_cnt(fp); - ptr = FILE_ptr(fp); /* reregisterize cnt and ptr */ + ptr = (STDCHAR*)FILE_ptr(fp); /* reregisterize cnt and ptr */ bpx = bp - str->str_ptr; /* prepare for possible relocation */ GROWSTR(&(str->str_ptr), &(str->str_len), str->str_cur + cnt + 1); @@ -316,7 +316,7 @@ str_gets(register STR *str, register FILE *fp) thats_all_folks: FILE_cnt(fp) = cnt; /* put these back or we're in trouble */ - FILE_ptr(fp) = (STDCHAR*)ptr; + FILE_ptr(fp) = (void*)ptr; /* LHS STDCHAR* cast non-portable */ *bp = '\0'; str->str_cur = bp - str->str_ptr; /* set length */ |