This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Integrate mainline
authorNick Ing-Simmons <nik@tiuk.ti.com>
Mon, 20 Aug 2001 06:24:31 +0000 (06:24 +0000)
committerNick Ing-Simmons <nik@tiuk.ti.com>
Mon, 20 Aug 2001 06:24:31 +0000 (06:24 +0000)
p4raw-id: //depot/perlio@11721

71 files changed:
Changes
Configure
INSTALL
MANIFEST
Porting/apply [new file with mode: 0644]
configure.com
dump.c
embed.pl
embedvar.h
lib/CGI.pm
lib/CGI/Fast.pm
lib/CGI/Util.pm
lib/CGI/t/form.t
lib/CGI/t/function.t
lib/Lingua/KO/Hangul/Util.pm [new file with mode: 0644]
lib/Lingua/KO/Hangul/Util/Changes [new file with mode: 0644]
lib/Lingua/KO/Hangul/Util/README [new file with mode: 0644]
lib/Lingua/KO/Hangul/Util/t/test.t [new file with mode: 0644]
lib/Net/ChangeLog.libnet
lib/Net/Cmd.pm
lib/Net/Config.pm
lib/Net/Domain.pm
lib/Net/FTP.pm
lib/Net/FTP/A.pm
lib/Net/FTP/I.pm
lib/Net/FTP/dataconn.pm
lib/Net/NNTP.pm
lib/Net/Netrc.pm
lib/Net/POP3.pm
lib/Net/README.config [deleted file]
lib/Net/README.libnet
lib/Net/SMTP.pm
lib/Net/Time.pm
lib/Net/demos/snpp [deleted file]
lib/Net/libnet.ppd [deleted file]
lib/Net/libnetFAQ.pod
lib/Net/t/ftp.t
lib/Unicode/Collate.pm [new file with mode: 0644]
lib/Unicode/Collate/Changes [new file with mode: 0644]
lib/Unicode/Collate/README [new file with mode: 0644]
lib/Unicode/Collate/keys.txt [new file with mode: 0644]
lib/Unicode/Collate/t/test.t [new file with mode: 0644]
lib/Unicode/Normalize.pm [new file with mode: 0644]
lib/Unicode/Normalize/Changes [new file with mode: 0644]
lib/Unicode/Normalize/README [new file with mode: 0644]
lib/Unicode/Normalize/t/norm.t [new file with mode: 0644]
lib/Unicode/Normalize/t/test.t [new file with mode: 0644]
mg.c
miniperlmain.c
numeric.c
op.h
patchlevel.h
perl.c
perl.h
perlapi.h
pod/perlapi.pod
pod/perlunicode.pod
pp.c
pp_hot.c
proto.h
regcomp.c
regexec.c
sharedsv.c
sharedsv.h
sv.c
t/op/index.t
t/op/misc.t
t/op/pat.t
t/op/re_tests
thrdvar.h
vms/vms.c

diff --git a/Changes b/Changes
index 9bf644d..550538f 100644 (file)
--- a/Changes
+++ b/Changes
@@ -31,6 +31,179 @@ or any other branch.
 Version v5.7.2         Development release working toward v5.8
 --------------
 ____________________________________________________________________________
+[ 11709] By: jhi                                   on 2001/08/17  13:47:53
+        Log: Upgrade to libnet 1.0704.
+     Branch: perl
+          - lib/Net/README.config lib/Net/demos/snpp lib/Net/libnet.ppd
+          ! MANIFEST lib/Net/ChangeLog.libnet lib/Net/Cmd.pm
+          ! lib/Net/Config.pm lib/Net/Domain.pm lib/Net/FTP.pm
+          ! lib/Net/FTP/A.pm lib/Net/FTP/I.pm lib/Net/FTP/dataconn.pm
+          ! lib/Net/NNTP.pm lib/Net/Netrc.pm lib/Net/POP3.pm
+          ! lib/Net/README.libnet lib/Net/SMTP.pm lib/Net/Time.pm
+          ! lib/Net/libnetFAQ.pod lib/Net/t/ftp.t
+____________________________________________________________________________
+[ 11708] By: sky                                   on 2001/08/17  13:34:04
+        Log: Let perl_clone copy PL_exit_flags
+     Branch: perl
+          ! sv.c
+____________________________________________________________________________
+[ 11707] By: sky                                   on 2001/08/17  12:28:41
+        Log: Protext sharedsv_space better. Extended EDIT and RELEASE macro
+     Branch: perl
+          ! sharedsv.c sharedsv.h
+____________________________________________________________________________
+[ 11706] By: jhi                                   on 2001/08/17  11:59:28
+        Log: The metaconfig unit change for #11705.
+     Branch: metaconfig/U/perl
+          ! Extensions.U
+____________________________________________________________________________
+[ 11705] By: jhi                                   on 2001/08/17  11:58:48
+        Log: Allow the threads extension to be found if present.
+     Branch: perl
+          ! Configure
+____________________________________________________________________________
+[ 11704] By: nick                                  on 2001/08/17  11:47:54
+        Log: Mail -> change script (pre-alpha)
+     Branch: perl
+          + Porting/apply
+____________________________________________________________________________
+[ 11703] By: sky                                   on 2001/08/17  07:11:24
+        Log: Fixed macros for localtime_r under USE_REENTRANT_API, also fixed for HP-UX 10.20
+             Thanks to Tom Hospel for pointing out my error.
+     Branch: perl
+          ! op.h
+____________________________________________________________________________
+[ 11702] By: sky                                   on 2001/08/17  04:18:11
+        Log: Adds PERL_EXIT_DESTRUCT_END to PL_exit_flags which if set moves END block running to perl_destruct, changes prototype of perl_destruct to return exitstatus.
+     Branch: perl
+          ! embed.pl miniperlmain.c perl.c perl.h proto.h
+____________________________________________________________________________
+[ 11701] By: jhi                                   on 2001/08/17  03:22:38
+        Log: Integrate Lingua::KO::Hangul::Util 0.02, Unicode::Normalize,
+             and Unicode::Collate 0.07, from SADAHIRO Tomoyuki.
+     Branch: perl
+          + lib/Lingua/KO/Hangul/Util.pm lib/Lingua/KO/Hangul/Util/Changes
+          + lib/Lingua/KO/Hangul/Util/README
+          + lib/Lingua/KO/Hangul/Util/t/test.t lib/Unicode/Collate.pm
+          + lib/Unicode/Collate/Changes lib/Unicode/Collate/README
+          + lib/Unicode/Collate/keys.txt lib/Unicode/Collate/t/test.t
+          + lib/Unicode/Normalize.pm lib/Unicode/Normalize/Changes
+          + lib/Unicode/Normalize/README lib/Unicode/Normalize/t/norm.t
+          + lib/Unicode/Normalize/t/test.t
+          ! MANIFEST
+____________________________________________________________________________
+[ 11700] By: jhi                                   on 2001/08/17  02:58:59
+        Log: Subject: [PATCH perl@11683] IEEE float tweak for VMS
+             Date: Thu, 16 Aug 2001 22:46:15 -0500
+             From: "Craig A. Berry" <craigberry@mac.com>
+             Message-Id: <5.1.0.14.0.20010816204836.01ab4e58@exchi01>
+     Branch: perl
+          ! configure.com numeric.c
+____________________________________________________________________________
+[ 11699] By: jhi                                   on 2001/08/17  02:33:00
+        Log: It seems that Tru64 has "naturally" threadsafe APIs only for
+             of the usual suspects (like getpwent) but not for others
+             (like localtime and rand).  The _r versions are available
+             for all of them, so lets' use them.
+     Branch: perl
+          ! perl.h
+____________________________________________________________________________
+[ 11698] By: jhi                                   on 2001/08/17  01:53:02
+        Log: (Accidental apply; thankfully empty.)
+     Branch: perl
+          ! hints/os390.sh
+____________________________________________________________________________
+[ 11697] By: jhi                                   on 2001/08/17  01:50:55
+        Log: Subject: Re: [ID 20010803.016] Possible regex bug in 5.6.1 
+             From: Hugo van der Sanden <hv@crypt.compulink.co.uk>
+             Date: Thu, 16 Aug 2001 16:27:49 +0100
+             Message-Id: <200108161527.f7GFRnH09419@crypt.compulink.co.uk>
+     Branch: perl
+          ! regexec.c t/op/re_tests
+____________________________________________________________________________
+[ 11696] By: jhi                                   on 2001/08/17  01:50:01
+        Log: Subject: Re: [ID 20010814.004] pos() doesn't work when using =~m// in list context 
+             From: Hugo van der Sanden <hv@crypt.compulink.co.uk>
+             Date: Thu, 16 Aug 2001 18:50:01 +0100
+             Message-Id: <200108161750.f7GHo1l22207@crypt.compulink.co.uk>
+     Branch: perl
+          ! pp_hot.c t/op/pat.t
+____________________________________________________________________________
+[ 11695] By: jhi                                   on 2001/08/17  01:49:12
+        Log: Subject: [PATCH] *time_r again
+             From: "Arthur Bergman" <arthur@contiller.se>
+             Date: Thu, 16 Aug 2001 16:01:54 +0200
+             Message-ID: <00ca01c1265c$0175f940$21000a0a@vogw2kdev>
+     Branch: perl
+          ! op.h
+____________________________________________________________________________
+[ 11694] By: jhi                                   on 2001/08/17  01:47:53
+        Log: system() and backtick error handling cleanup from Craig A. Berry.
+     Branch: perl
+          ! vms/vms.c
+____________________________________________________________________________
+[ 11693] By: gsar                                  on 2001/08/17  01:07:21
+        Log: change#10334 leaks memory, copies string when it doesn't
+             need to
+     Branch: perl
+          ! perl.c
+____________________________________________________________________________
+[ 11692] By: jhi                                   on 2001/08/16  12:22:29
+        Log: One more twist to the sprintf + utf8 testing.
+     Branch: perl
+          ! t/op/misc.t
+____________________________________________________________________________
+[ 11691] By: jhi                                   on 2001/08/16  11:46:02
+        Log: Fix for 20010407.008 sprintf removes utf8-ness.
+     Branch: perl
+          ! pp.c t/op/misc.t
+____________________________________________________________________________
+[ 11690] By: jhi                                   on 2001/08/16  11:31:00
+        Log: Subject: [PATCH] *time_r fixes
+             From: "Arthur Bergman" <arthur@contiller.se>
+             Message-ID: <00b901c1264e$1cbe6970$21000a0a@vogw2kdev>
+             Date: Thu, 16 Aug 2001 14:22:27 +0200
+     Branch: perl
+          ! op.h
+____________________________________________________________________________
+[ 11689] By: jhi                                   on 2001/08/16  11:29:30
+        Log: Upgrade to CGI.pm 2.77.
+     Branch: perl
+          ! lib/CGI.pm lib/CGI/Fast.pm lib/CGI/Util.pm lib/CGI/t/form.t
+          ! lib/CGI/t/function.t
+____________________________________________________________________________
+[ 11688] By: jhi                                   on 2001/08/16  01:07:21
+        Log: Document the bytes-to-Unicode upgrading.
+     Branch: perl
+          ! pod/perlunicode.pod
+____________________________________________________________________________
+[ 11687] By: jhi                                   on 2001/08/16  00:29:29
+        Log: Add a test for Unicode sprintf.
+     Branch: perl
+          ! t/op/misc.t
+____________________________________________________________________________
+[ 11686] By: jhi                                   on 2001/08/16  00:20:40
+        Log: Add Unicode tests for index/rindex.
+     Branch: perl
+          ! t/op/index.t
+____________________________________________________________________________
+[ 11685] By: jhi                                   on 2001/08/15  22:51:53
+        Log: Document a bit the art of minimizing the installation,
+             based on the p5p discussion.
+     Branch: perl
+          ! INSTALL
+____________________________________________________________________________
+[ 11684] By: nick                                  on 2001/08/15  15:03:31
+        Log: Integrate mainline
+     Branch: perlio
+         +> sharedsv.c sharedsv.h
+         !> (integrate 53 files)
+____________________________________________________________________________
+[ 11683] By: jhi                                   on 2001/08/15  13:49:07
+        Log: Update Changes.
+     Branch: perl
+          ! Changes patchlevel.h
+____________________________________________________________________________
 [ 11682] By: jhi                                   on 2001/08/15  13:26:00
         Log: The #11673 necessitated a test tweak.
      Branch: perl
index c6c4ff3..ee9b059 100755 (executable)
--- a/Configure
+++ b/Configure
@@ -20,7 +20,7 @@
 
 # $Id: Head.U,v 3.0.1.9 1997/02/28 15:02:09 ram Exp $
 #
-# Generated on Thu Aug  9 16:34:00 EET DST 2001 [metaconfig 3.0 PL70]
+# Generated on Fri Aug 17 15:57:38 EET DST 2001 [metaconfig 3.0 PL70]
 # (with additional metaconfig patches by perlbug@perl.org)
 
 cat >c1$$ <<EOF
@@ -16428,6 +16428,14 @@ for xxx in $known_extensions ; do
                         esac
                esac
                ;;
+       threads)
+                case "$usethreads" in
+                true|$define|y)
+                        case "$useithreads" in
+                        $define|true|[yY]*) avail_ext="$avail_ext $xxx" ;;
+                        esac
+               esac
+               ;;
        IPC/SysV|ipc/sysv)
                : XXX Do we need a useipcsysv variable here
                case "${d_msg}${d_sem}${d_shm}" in 
diff --git a/INSTALL b/INSTALL
index 844537d..a9c673f 100644 (file)
--- a/INSTALL
+++ b/INSTALL
@@ -2267,6 +2267,132 @@ available in TeX format.  Type
 
        (cd pod && make tex && <process the latex files>)
 
+=head1 Minimizing the Perl installation
+
+The following section is meant for people worrying about squeezing the
+Perl installation into minimal systems (for example when installing
+operating systems, or in really small filesystems).
+
+In the following we offer two different slimmed down installation
+recipes.  They are informative, not normative: the choice of files
+depends on what you need.
+
+Firstly, the bare minimum to run this script
+
+  use strict;
+  use warnings;
+  foreach my $f (</*>) {
+     print("$f\n");
+  }
+
+in Solaris is as follows (under $Config{prefix}):
+
+  ./bin/perl
+  ./lib/perl5/5.6.1/sun4-solaris-64int/auto/DynaLoader/autosplit.ix
+  ./lib/perl5/5.6.1/sun4-solaris-64int/auto/DynaLoader/dl_expandspec.al
+  ./lib/perl5/5.6.1/sun4-solaris-64int/auto/DynaLoader/dl_find_symbol_anywhere.al
+  ./lib/perl5/5.6.1/sun4-solaris-64int/auto/DynaLoader/dl_findfile.al
+  ./lib/perl5/5.6.1/sun4-solaris-64int/auto/File/Glob/Glob.so
+  ./lib/perl5/5.6.1/sun4-solaris-64int/auto/File/Glob/autosplit.ix
+  ./lib/perl5/5.6.1/sun4-solaris-64int/Config.pm
+  ./lib/perl5/5.6.1/sun4-solaris-64int/XSLoader.pm
+  ./lib/perl5/5.6.1/sun4-solaris-64int/DynaLoader.pm
+  ./lib/perl5/5.6.1/sun4-solaris-64int/CORE/libperl.so
+  ./lib/perl5/5.6.1/strict.pm
+  ./lib/perl5/5.6.1/warnings.pm
+  ./lib/perl5/5.6.1/Carp.pm
+  ./lib/perl5/5.6.1/Exporter.pm
+  ./lib/perl5/5.6.1/File/Glob.pm
+  ./lib/perl5/5.6.1/AutoLoader.pm
+  ./lib/perl5/5.6.1/vars.pm
+  ./lib/perl5/5.6.1/warnings/register.pm
+  ./lib/perl5/5.6.1/Carp/Heavy.pm
+  ./lib/perl5/5.6.1/Exporter/Heavy.pm
+
+Secondly, Debian perl-base package contains the following files,
+size about 1.2MB in its i386 version:
+
+  /usr/share/doc/perl/Documentation
+  /usr/share/doc/perl/README.Debian
+  /usr/share/doc/perl/copyright
+  /usr/share/doc/perl/AUTHORS.gz
+  /usr/share/doc/perl/changelog.Debian.gz
+  /usr/share/man/man1/perl.1.gz
+  /usr/share/perl/5.6.1/AutoLoader.pm
+  /usr/share/perl/5.6.1/Carp.pm
+  /usr/share/perl/5.6.1/Carp/Heavy.pm
+  /usr/share/perl/5.6.1/Cwd.pm
+  /usr/share/perl/5.6.1/Exporter.pm
+  /usr/share/perl/5.6.1/Exporter/Heavy.pm
+  /usr/share/perl/5.6.1/File/Spec.pm
+  /usr/share/perl/5.6.1/File/Spec/Unix.pm
+  /usr/share/perl/5.6.1/FileHandle.pm
+  /usr/share/perl/5.6.1/Getopt/Long.pm
+  /usr/share/perl/5.6.1/IO/Socket/INET.pm
+  /usr/share/perl/5.6.1/IO/Socket/UNIX.pm
+  /usr/share/perl/5.6.1/IPC/Open2.pm
+  /usr/share/perl/5.6.1/IPC/Open3.pm
+  /usr/share/perl/5.6.1/SelectSaver.pm
+  /usr/share/perl/5.6.1/Symbol.pm
+  /usr/share/perl/5.6.1/Text/Tabs.pm
+  /usr/share/perl/5.6.1/Text/Wrap.pm
+  /usr/share/perl/5.6.1/attributes.pm
+  /usr/share/perl/5.6.1/auto/Getopt/Long/GetOptions.al
+  /usr/share/perl/5.6.1/auto/Getopt/Long/FindOption.al
+  /usr/share/perl/5.6.1/auto/Getopt/Long/Configure.al
+  /usr/share/perl/5.6.1/auto/Getopt/Long/config.al
+  /usr/share/perl/5.6.1/auto/Getopt/Long/Croak.al
+  /usr/share/perl/5.6.1/auto/Getopt/Long/autosplit.ix
+  /usr/share/perl/5.6.1/base.pm
+  /usr/share/perl/5.6.1/constant.pm
+  /usr/share/perl/5.6.1/fields.pm
+  /usr/share/perl/5.6.1/integer.pm
+  /usr/share/perl/5.6.1/lib.pm
+  /usr/share/perl/5.6.1/locale.pm
+  /usr/share/perl/5.6.1/overload.pm
+  /usr/share/perl/5.6.1/strict.pm
+  /usr/share/perl/5.6.1/vars.pm
+  /usr/share/perl/5.6.1/warnings.pm
+  /usr/share/perl/5.6.1/warnings/register.pm
+  /usr/bin/perl
+  /usr/lib/perl/5.6.1/Config.pm
+  /usr/lib/perl/5.6.1/Data/Dumper.pm
+  /usr/lib/perl/5.6.1/DynaLoader.pm
+  /usr/lib/perl/5.6.1/Errno.pm
+  /usr/lib/perl/5.6.1/Fcntl.pm
+  /usr/lib/perl/5.6.1/File/Glob.pm
+  /usr/lib/perl/5.6.1/IO.pm
+  /usr/lib/perl/5.6.1/IO/File.pm
+  /usr/lib/perl/5.6.1/IO/Handle.pm
+  /usr/lib/perl/5.6.1/IO/Pipe.pm
+  /usr/lib/perl/5.6.1/IO/Seekable.pm
+  /usr/lib/perl/5.6.1/IO/Select.pm
+  /usr/lib/perl/5.6.1/IO/Socket.pm
+  /usr/lib/perl/5.6.1/POSIX.pm
+  /usr/lib/perl/5.6.1/Socket.pm
+  /usr/lib/perl/5.6.1/XSLoader.pm
+  /usr/lib/perl/5.6.1/auto/Data/Dumper/Dumper.so
+  /usr/lib/perl/5.6.1/auto/Data/Dumper/Dumper.bs
+  /usr/lib/perl/5.6.1/auto/DynaLoader/dl_findfile.al
+  /usr/lib/perl/5.6.1/auto/DynaLoader/dl_expandspec.al
+  /usr/lib/perl/5.6.1/auto/DynaLoader/dl_find_symbol_anywhere.al
+  /usr/lib/perl/5.6.1/auto/DynaLoader/autosplit.ix
+  /usr/lib/perl/5.6.1/auto/DynaLoader/DynaLoader.a
+  /usr/lib/perl/5.6.1/auto/DynaLoader/extralibs.ld
+  /usr/lib/perl/5.6.1/auto/Fcntl/Fcntl.so
+  /usr/lib/perl/5.6.1/auto/Fcntl/Fcntl.bs
+  /usr/lib/perl/5.6.1/auto/File/Glob/Glob.bs
+  /usr/lib/perl/5.6.1/auto/File/Glob/Glob.so
+  /usr/lib/perl/5.6.1/auto/File/Glob/autosplit.ix
+  /usr/lib/perl/5.6.1/auto/IO/IO.so
+  /usr/lib/perl/5.6.1/auto/IO/IO.bs
+  /usr/lib/perl/5.6.1/auto/POSIX/POSIX.bs
+  /usr/lib/perl/5.6.1/auto/POSIX/POSIX.so
+  /usr/lib/perl/5.6.1/auto/POSIX/autosplit.ix
+  /usr/lib/perl/5.6.1/auto/POSIX/load_imports.al
+  /usr/lib/perl/5.6.1/auto/Socket/Socket.so
+  /usr/lib/perl/5.6.1/auto/Socket/Socket.bs
+
 =head1 Reporting Problems
 
 If you have difficulty building perl, and none of the advice in this file
index 9b9b265..8144f71 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -945,6 +945,10 @@ lib/IPC/Open3.t                    See if IPC::Open3 works
 lib/IPC/SysV.t                 See if IPC::SysV works
 lib/less.pm                    For "use less"
 lib/lib_pm.PL                  For "use lib", produces lib/lib.pm
+lib/Lingua/KO/Hangul/Util/Changes      Lingua::KO::Hangul::Util
+lib/Lingua/KO/Hangul/Util/README       Lingua::KO::Hangul::Util
+lib/Lingua/KO/Hangul/Util/t/test.t             Lingua::KO::Hangul::Util
+lib/Lingua/KO/Hangul/Util.pm           Lingua::KO::Hangul::Util
 lib/locale.pm                  For "use locale"
 lib/locale.t                   See if locale support works
 lib/Locale/Codes/t/all.t       See if Locale::Codes work
@@ -1015,7 +1019,6 @@ lib/Net/demos/nntp                libnet
 lib/Net/demos/nntp.mirror      libnet
 lib/Net/demos/pop3             libnet
 lib/Net/demos/smtp.self                libnet
-lib/Net/demos/snpp             libnet
 lib/Net/demos/time             libnet
 lib/Net/Domain.pm              libnet
 lib/Net/FTP.pm                 libnet
@@ -1027,7 +1030,6 @@ lib/Net/FTP/L.pm          libnet
 lib/Net/hostent.pm             By-name interface to Perl's builtin gethost*
 lib/Net/hostent.t              See if Net::hostent works
 lib/Net/Hostname.eg            libnet
-lib/Net/libnet.ppd             libnet
 lib/Net/libnetFAQ.pod          libnet
 lib/Net/netent.pm              By-name interface to Perl's builtin getnet*
 lib/Net/netent.t               See if Net::netent works
@@ -1037,7 +1039,6 @@ lib/Net/Ping.pm                   Hello, anybody home?
 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
-lib/Net/README.config          libnet
 lib/Net/README.libnet          libnet
 lib/Net/servent.pm             By-name interface to Perl's builtin getserv*
 lib/Net/servent.t              See if Net::servtent works
@@ -1175,7 +1176,19 @@ lib/Time/localtime.pm            By-name interface to Perl's builtin localtime
 lib/Time/localtime.t           Test for Time::localtime
 lib/Time/tm.pm                 Internal object for Time::{gm,local}time
 lib/timelocal.pl               Perl library supporting inverse of localtime, gmtime
+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/test.t   Unicode::Collate
+lib/Unicode/Normalize.pm       Unicode::Normalize
+lib/Unicode/Normalize/Changes  Unicode::Normalize
+lib/Unicode/Normalize/README   Unicode::Normalize
+lib/Unicode/Normalize/t/norm.t Unicode::Normalize
+lib/Unicode/Normalize/t/test.t Unicode::Normalize
 lib/unicode/README             Explanation why this is there is.
+lib/Unicode/UCD.pm             Unicode character database
+lib/Unicode/UCD.t              See if Unicode character database works
 lib/unicore/ArabLink.pl                Unicode character database
 lib/unicore/ArabLnkGrp.pl      Unicode character database
 lib/unicore/ArabShap.txt       Unicode character database
@@ -1498,8 +1511,6 @@ lib/unicore/UCD.html              Unicode character database
 lib/unicore/Unicode.html       Unicode character database
 lib/unicore/Unicode.txt                Unicode character database
 lib/unicore/version            The version of the Unicode
-lib/Unicode/UCD.pm             Unicode character database
-lib/Unicode/UCD.t              See if Unicode character database works
 lib/UNIVERSAL.pm               Base class for ALL classes
 lib/User/grent.pm              By-name interface to Perl's builtin getgr*
 lib/User/grent.t               See if User::grwent works
@@ -1780,6 +1791,7 @@ pod/rofftoc                       Generate a table of contents in troff format
 pod/splitman                   Splits perlfunc into multiple man pages
 pod/splitpod                   Splits perlfunc into multiple pod pages
 Policy_sh.SH           Hold site-wide preferences between Configure runs.
+Porting/apply          Apply patches sent by mail
 Porting/config.sh      Sample config.sh
 Porting/config_H       Sample config.h
 Porting/Contract       Social contract for contributed modules in Perl core
diff --git a/Porting/apply b/Porting/apply
new file mode 100644 (file)
index 0000000..a0b01cc
--- /dev/null
@@ -0,0 +1,71 @@
+#!/usr/bin/perl -w
+my $file = pop(@ARGV);
+my %meta;
+$ENV{'P4PORT'} = 'bactrian:1667';
+$ENV{'P4CLIENT'} = 'camel-linux';
+open(FILE,$file) || die "Cannot open $file:$!";
+while (<FILE>)
+ {
+  if (/^(From|Subject|Date|Message-ID):(.*)$/i)
+   {
+    $meta{lc($1)} = $2;
+   }
+ }
+my @results = `patch @ARGV <$file 2>&1`;
+warn @results;
+my $code = $?;
+warn "$code from patch\n";
+foreach (@results)
+ {
+  if (/patching\s+file\s*(.*?)\s*$/)
+   {
+    push(@edit,$1);
+   }
+ }
+my @have = `p4 have @edit`;
+
+if ($code == 0)
+ {
+  System("p4 edit @edit");
+  open(PIPE,"|p4 change -i") || die "Cannot open pipe to p4:$!";
+  print PIPE "Change: new\n";
+  print PIPE "Description:\n";
+  foreach my $key (qw(Subject From Date Message-Id))
+   {
+    if (exists $meta{lc($key)})
+     {
+      print PIPE "\t$key: ",$meta{lc($key)},"\n";
+      print "$key: ",$meta{lc($key)},"\n";
+     }
+   }
+  print PIPE "Files:\n";
+  foreach (@have)
+   {
+    if (m,^(.*)#,)
+     {
+      print PIPE "\t$1\n"
+     }
+   }
+  close(PIPE);
+ }
+else
+ {
+  if (@edit)
+   {
+    System("p4 revert @edit");
+   }
+ }
+
+sub System
+{
+ my $cmd = join(' ',@_);
+ warn "$cmd\n";
+ if (fork)
+  {
+   wait;
+  }
+ else
+  {
+   _exit(exec $cmd);
+  }
+}
index 04ed20c..7777baf 100644 (file)
@@ -2352,9 +2352,10 @@ $   IF ans .EQS. "" THEN ans="''dflt'"
 $   be_case_sensitive = "''ans'"
 $! IEEE math?
 $   echo ""
-$   echo "Perl normally uses G_FLOAT format floating point numbers"
-$   echo "internally, as do most things on VMS.  You can, however, build"
-$   echo "with IEEE floating point numbers instead if you need to."
+$   echo "Perl normally uses IEEE format (T_FLOAT) floating point numbers"
+$   echo "internally on Alpha, but if you need G_FLOAT for binary compatibility"
+$   echo "with an external library or existing data, you may wish to disable"
+$   echo "the IEEE math option."
 $   dflt = use_ieee_math
 $   rp = "Use IEEE math? [''dflt'] "
 $   GOSUB myread
diff --git a/dump.c b/dump.c
index c2f7746..6729db8 100644 (file)
--- a/dump.c
+++ b/dump.c
@@ -994,7 +994,6 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo
     default:
        if (SvEVALED(sv))       sv_catpv(d, "EVALED,");
        if (SvIsUV(sv))         sv_catpv(d, "IsUV,");
-       if (SvUTF8(sv))         sv_catpv(d, "UTF8");
        break;
     case SVt_PVBM:
        if (SvTAIL(sv))         sv_catpv(d, "TAIL,");
@@ -1005,6 +1004,8 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo
                                sv_catpv(d, "TYPED,");
        break;
     }
+    if (SvPOK(sv) && SvUTF8(sv))
+        sv_catpv(d, "UTF8");
 
     if (*(SvEND(d) - 1) == ',')
        SvPVX(d)[--SvCUR(d)] = '\0';
index 71144cb..84ff77b 100755 (executable)
--- a/embed.pl
+++ b/embed.pl
@@ -1339,7 +1339,7 @@ Ajno      |PerlInterpreter*       |perl_alloc_using \
 #endif
 Ajnod  |PerlInterpreter*       |perl_alloc
 Ajnod  |void   |perl_construct |PerlInterpreter* interp
-Ajnod  |void   |perl_destruct  |PerlInterpreter* interp
+Ajnod  |int    |perl_destruct  |PerlInterpreter* interp
 Ajnod  |void   |perl_free      |PerlInterpreter* interp
 Ajnod  |int    |perl_run       |PerlInterpreter* interp
 Ajnod  |int    |perl_parse     |PerlInterpreter* interp|XSINIT_t xsinit \
index d0a7ec4..b5c6340 100644 (file)
@@ -94,6 +94,7 @@
 #define PL_reg_start_tmpl      (vTHX->Treg_start_tmpl)
 #define PL_reg_starttry                (vTHX->Treg_starttry)
 #define PL_reg_sv              (vTHX->Treg_sv)
+#define PL_reg_sv_utf8         (vTHX->Treg_sv_utf8)
 #define PL_reg_whilem_seen     (vTHX->Treg_whilem_seen)
 #define PL_regbol              (vTHX->Tregbol)
 #define PL_regcc               (vTHX->Tregcc)
 #define PL_reg_start_tmpl      (aTHXo->interp.Treg_start_tmpl)
 #define PL_reg_starttry                (aTHXo->interp.Treg_starttry)
 #define PL_reg_sv              (aTHXo->interp.Treg_sv)
+#define PL_reg_sv_utf8         (aTHXo->interp.Treg_sv_utf8)
 #define PL_reg_whilem_seen     (aTHXo->interp.Treg_whilem_seen)
 #define PL_regbol              (aTHXo->interp.Tregbol)
 #define PL_regcc               (aTHXo->interp.Tregcc)
 #define PL_reg_start_tmpl      (aTHX->Treg_start_tmpl)
 #define PL_reg_starttry                (aTHX->Treg_starttry)
 #define PL_reg_sv              (aTHX->Treg_sv)
+#define PL_reg_sv_utf8         (aTHX->Treg_sv_utf8)
 #define PL_reg_whilem_seen     (aTHX->Treg_whilem_seen)
 #define PL_regbol              (aTHX->Tregbol)
 #define PL_regcc               (aTHX->Tregcc)
 #define PL_Treg_start_tmpl     PL_reg_start_tmpl
 #define PL_Treg_starttry       PL_reg_starttry
 #define PL_Treg_sv             PL_reg_sv
+#define PL_Treg_sv_utf8                PL_reg_sv_utf8
 #define PL_Treg_whilem_seen    PL_reg_whilem_seen
 #define PL_Tregbol             PL_regbol
 #define PL_Tregcc              PL_regcc
index fe0fb32..3e8ed35 100644 (file)
@@ -18,8 +18,8 @@ use Carp 'croak';
 # The most recent version and complete docs are available at:
 #   http://stein.cshl.org/WWW/software/CGI/
 
-$CGI::revision = '$Id: CGI.pm,v 1.49 2001/02/04 23:08:39 lstein Exp $';
-$CGI::VERSION='2.753';
+$CGI::revision = '$Id: CGI.pm,v 1.51 2001/08/07 12:28:43 lstein Exp $';
+$CGI::VERSION='2.77';
 
 # HARD-CODED LOCATION FOR FILE UPLOAD TEMPORARY FILES.
 # UNCOMMENT THIS ONLY IF YOU KNOW WHAT YOU'RE DOING.
@@ -546,7 +546,7 @@ sub parse_params {
     my($param,$value);
     foreach (@pairs) {
        ($param,$value) = split('=',$_,2);
-       next if $NO_UNDEF_PARAMS and not $value;
+       next if $NO_UNDEF_PARAMS and not defined $value;
        $value = '' unless defined $value;
        $param = unescape($param);
        $value = unescape($value);
@@ -1034,7 +1034,7 @@ sub Dump {
        }
        push(@result,"</UL>");
     }
-    push(@result,"</UL>\n");
+    push(@result,"</UL>");
     return join("\n",@result);
 }
 END_OF_FUNC
@@ -1203,6 +1203,7 @@ sub header {
     foreach (@other) {
         next unless my($header,$value) = /([^\s=]+)=\"?(.+?)\"?$/;
        ($_ = $header) =~ s/^(\w)(.*)/$1 . lc ($2) . ': '.$self->unescapeHTML($value)/e;
+        $header = ucfirst($header);
     }
 
     $type ||= 'text/html' unless defined($type);
@@ -1231,7 +1232,7 @@ sub header {
     push(@header,"Date: " . expires(0,'http')) if $expires || $cookie || $nph;
     push(@header,"Pragma: no-cache") if $self->cache();
     push(@header,"Content-Disposition: attachment; filename=\"$attachment\"") if $attachment;
-    push(@header,@other);
+    push(@header,map {ucfirst $_} @other);
     push(@header,"Content-Type: $type") if $type ne '';
 
     my $header = join($CRLF,@header)."${CRLF}${CRLF}";
@@ -2100,7 +2101,7 @@ sub popup_menu {
        $result .= "<option $selectit value=\"$value\">$label</option>\n";
     }
 
-    $result .= "</select>\n";
+    $result .= "</select>";
     return $result;
 }
 END_OF_FUNC
@@ -2153,7 +2154,7 @@ sub scrolling_list {
        my($value)=$self->escapeHTML($_,1);
        $result .= "<option $selectit value=\"$value\">$label</option>\n";
     }
-    $result .= "</select>\n";
+    $result .= "</select>";
     $self->register_parameter($name);
     return $result;
 }
@@ -2915,7 +2916,7 @@ sub read_multipart {
            last if defined($filehandle = Fh->new($filename,$tmp,$PRIVATE_TEMPFILES));
             $seqno += int rand(100);
           }
-          die "CGI open of tmpfile: $!\n" unless $filehandle;
+          die "CGI open of tmpfile: $!\n" unless defined $filehandle;
          $CGI::DefaultClass->binmode($filehandle) if $CGI::needs_binmode;
 
          my ($data);
@@ -3112,7 +3113,7 @@ sub new {
 
        # BUG: IE 3.01 on the Macintosh uses just the boundary -- not
        # the two extra hyphens.  We do a special case here on the user-agent!!!!
-       $boundary = "--$boundary" unless CGI::user_agent('MSIE\s+3\.0[12];\s*Mac');
+       $boundary = "--$boundary" unless CGI::user_agent('MSIE\s+3\.0[12];\s*Mac|DreamPassport');
 
     } else { # otherwise we find it ourselves
        my($old);
@@ -6261,12 +6262,17 @@ mode, CGI.pm will output the necessary extra header information when
 the header() and redirect() methods are
 called.
 
-The Microsoft Internet Information Server requires NPH mode.  As of version
-2.30, CGI.pm will automatically detect when the script is running under IIS
-and put itself into this mode.  You do not need to do this manually, although
-it won't hurt anything if you do.
-
-There are a number of ways to put CGI.pm into NPH mode:
+The Microsoft Internet Information Server requires NPH mode.  As of
+version 2.30, CGI.pm will automatically detect when the script is
+running under IIS and put itself into this mode.  You do not need to
+do this manually, although it won't hurt anything if you do.  However,
+note that if you have applied Service Pack 6, much of the
+functionality of NPH scripts, including the ability to redirect while
+setting a cookie, b<do not work at all> on IIS without a special patch
+from Microsoft.  See
+http://support.microsoft.com/support/kb/articles/Q280/3/41.ASP:
+Non-Parsed Headers Stripped From CGI Applications That Have nph-
+Prefix in Name.
 
 =over 4
 
index b485186..669b38e 100644 (file)
@@ -16,7 +16,7 @@ package CGI::Fast;
 # The most recent version and complete docs are available at:
 #   http://www.genome.wi.mit.edu/ftp/pub/software/WWW/cgi_docs.html
 #   ftp://ftp-genome.wi.mit.edu/pub/software/WWW/
-$CGI::Fast::VERSION='1.02';
+$CGI::Fast::VERSION='1.04';
 
 use CGI;
 use FCGI;
@@ -31,13 +31,32 @@ sub save_request {
     # no-op
 }
 
+# If ENV{FCGI_SOCKET_PATH} is specified, we maintain a FCGI Request handle
+# in this package variable.
+use vars qw($Ext_Request);
+BEGIN {
+   # If ENV{FCGI_SOCKET_PATH} is given, explicitly open the socket,
+   # and keep the request handle around from which to call Accept().
+   if ($ENV{FCGI_SOCKET_PATH}) {
+       my $path    = $ENV{FCGI_SOCKET_PATH};
+       my $backlog = $ENV{FCGI_LISTEN_QUEUE} || 100;
+       my $socket  = FCGI::OpenSocket( $path, $backlog );
+       $Ext_Request = FCGI::Request( \*STDIN, \*STDOUT, \*STDERR, 
+                                       \%ENV, $socket, 1 );
+   }
+}
+
 # New is slightly different in that it calls FCGI's
 # accept() method.
 sub new {
      my ($self, $initializer, @param) = @_;
      unless (defined $initializer) {
+       if ($Ext_Request) {
+          return undef unless $Ext_Request->Accept() >= 0;
+       } else {
          return undef unless FCGI::accept() >= 0;
      }
+     }
      return $CGI::Q = $self->SUPER::new($initializer, @param);
 }
 
@@ -139,7 +158,7 @@ the Apache server, the following line must be added to srm.conf:
 FastCGI scripts must end in the extension .fcgi.  For each script you
 install, you must add something like the following to srm.conf:
 
-   AppClass /usr/etc/httpd/fcgi-bin/file_upload.fcgi -processes 2
+    FastCgiServer /usr/etc/httpd/fcgi-bin/file_upload.fcgi -processes 2
 
 This instructs Apache to launch two copies of file_upload.fcgi at 
 startup time.
@@ -150,6 +169,43 @@ Any script that works correctly as a FastCGI script will also work
 correctly when installed as a vanilla CGI script.  However it will
 not see any performance benefit.
 
+=head1 EXTERNAL FASTCGI SERVER INVOCATION
+
+FastCGI supports a TCP/IP transport mechanism which allows FastCGI scripts to run
+external to the webserver, perhaps on a remote machine.  To configure the
+webserver to connect to an external FastCGI server, you would add the following
+to your srm.conf:
+
+    FastCgiExternalServer /usr/etc/httpd/fcgi-bin/file_upload.fcgi -host sputnik:8888
+
+Two environment variables affect how the C<CGI::Fast> object is created,
+allowing C<CGI::Fast> to be used as an external FastCGI server.  (See C<FCGI>
+documentation for C<FCGI::OpenSocket> for more information.)
+
+=over
+
+=item FCGI_SOCKET_PATH
+
+The address (TCP/IP) or path (UNIX Domain) of the socket the external FastCGI
+script to which bind an listen for incoming connections from the web server.
+
+=item FCGI_LISTEN_QUEUE
+
+Maximum length of the queue of pending connections.  
+
+=back
+
+For example:
+
+    #!/usr/local/bin/perl    # must be a FastCGI version of perl!
+    use CGI::Fast;
+    &do_some_initialization();
+    $ENV{FCGI_SOCKET_PATH} = "sputnik:8888";
+    $ENV{FCGI_LISTEN_QUEUE} = 100;
+    while ($q = new CGI::Fast) {
+       &process_request($q);
+    }
+
 =head1 CAVEATS
 
 I haven't tested this very much.
index aba0ba5..2b48ff2 100644 (file)
@@ -115,7 +115,12 @@ sub make_attributes {
     foreach (keys %{$attr}) {
        my($key) = $_;
        $key=~s/^\-//;     # get rid of initial - if present
-       $key=~tr/A-Z_/a-z-/; # parameters are lower case, use dashes
+
+       # old way: breaks EBCDIC!
+       # $key=~tr/A-Z_/a-z-/; # parameters are lower case, use dashes
+
+       ($key="\L$key") =~ tr/_/-/; # parameters are lower case, use dashes
+
        my $value = $escape ? simple_escape($attr->{$_}) : $attr->{$_};
        push(@att,defined($attr->{$_}) ? qq/$key="$value"/ : qq/$key/);
     }
@@ -134,6 +139,45 @@ sub simple_escape {
   $toencode;
 }
 
+sub utf8_chr ($) {
+        my $c = shift(@_);
+
+        if ($c < 0x80) {
+                return sprintf("%c", $c);
+        } elsif ($c < 0x800) {
+                return sprintf("%c%c", 0xc0 | ($c >> 6), 0x80 | ($c & 0x3f));
+        } elsif ($c < 0x10000) {
+                return sprintf("%c%c%c",
+                                           0xe0 |  ($c >> 12),
+                                           0x80 | (($c >>  6) & 0x3f),
+                                           0x80 | ( $c          & 0x3f));
+        } elsif ($c < 0x200000) {
+                return sprintf("%c%c%c%c",
+                                           0xf0 |  ($c >> 18),
+                                           0x80 | (($c >> 12) & 0x3f),
+                                           0x80 | (($c >>  6) & 0x3f),
+                                           0x80 | ( $c          & 0x3f));
+        } elsif ($c < 0x4000000) {
+                return sprintf("%c%c%c%c%c",
+                                           0xf8 |  ($c >> 24),
+                                           0x80 | (($c >> 18) & 0x3f),
+                                           0x80 | (($c >> 12) & 0x3f),
+                                           0x80 | (($c >>  6) & 0x3f),
+                                           0x80 | ( $c          & 0x3f));
+
+        } elsif ($c < 0x80000000) {
+                return sprintf("%c%c%c%c%c%c",
+                                           0xfe |  ($c >> 30),
+                                           0x80 | (($c >> 24) & 0x3f),
+                                           0x80 | (($c >> 18) & 0x3f),
+                                           0x80 | (($c >> 12) & 0x3f),
+                                           0x80 | (($c >> 6)  & 0x3f),
+                                           0x80 | ( $c          & 0x3f));
+        } else {
+                return utf8(0xfffd);
+        }
+}
+
 # unescape URL-encoded data
 sub unescape {
   shift() if ref($_[0]) || (defined $_[1] && $_[0] eq $CGI::DefaultClass);
@@ -144,7 +188,8 @@ sub unescape {
     if ($EBCDIC) {
       $todecode =~ s/%([0-9a-fA-F]{2})/chr $A2E[hex($1)]/ge;
     } else {
-      $todecode =~ s/%([0-9a-fA-F]{2})/chr hex($1)/ge;
+      $todecode =~ s/%(?:([0-9a-fA-F]{2})|u([0-9a-fA-F]{4}))/
+       defined($1)? chr hex($1) : utf8_chr(hex($2))/ge;
     }
   return $todecode;
 }
index 2922903..05d1b49 100755 (executable)
@@ -80,7 +80,7 @@ test(15, checkbox_group(-name=>'game',-Values=>[qw/checkers chess cribbage/]) eq
 test(16, checkbox_group(-name=>'game',-values=>[qw/checkers chess cribbage/],-defaults=>['cribbage'],-override=>1) eq 
      qq(<input type="checkbox" name="game" value="checkers" />checkers <input type="checkbox" name="game" value="chess" />chess <input type="checkbox" name="game" value="cribbage" checked />cribbage),
      'checkbox_group()');
-test(17, popup_menu(-name=>'game',-values=>[qw/checkers chess cribbage/],-default=>'cribbage',-override=>1) eq <<END,'checkbox_group()');
+test(17, popup_menu(-name=>'game',-values=>[qw/checkers chess cribbage/],-default=>'cribbage',-override=>1)."\n" eq <<END,'checkbox_group()');
 <select name="game">
 <option  value="checkers">checkers</option>
 <option  value="chess">chess</option>
index b670e33..9f5deb8 100755 (executable)
@@ -105,7 +105,7 @@ if ($Config{d_fork}) {
   print "ok 23 # Skip\n";
   print "ok 24 # Skip\n";
 }
-test(25,redirect('http://somewhere.else') eq "Status: 302 Moved${CRLF}location: http://somewhere.else${CRLF}${CRLF}","CGI::redirect() 1");
+test(25,redirect('http://somewhere.else') eq "Status: 302 Moved${CRLF}Location: http://somewhere.else${CRLF}${CRLF}","CGI::redirect() 1");
 my $h = redirect(-Location=>'http://somewhere.else',-Type=>'text/html');
-test(26,$h eq "Status: 302 Moved${CRLF}location: http://somewhere.else${CRLF}Content-Type: text/html; charset=ISO-8859-1${CRLF}${CRLF}","CGI::redirect() 2");
-test(27,redirect(-Location=>'http://somewhere.else/bin/foo&bar',-Type=>'text/html') eq "Status: 302 Moved${CRLF}location: http://somewhere.else/bin/foo&bar${CRLF}Content-Type: text/html; charset=ISO-8859-1${CRLF}${CRLF}","CGI::redirect() 2");
+test(26,$h eq "Status: 302 Moved${CRLF}Location: http://somewhere.else${CRLF}Content-Type: text/html; charset=ISO-8859-1${CRLF}${CRLF}","CGI::redirect() 2");
+test(27,redirect(-Location=>'http://somewhere.else/bin/foo&bar',-Type=>'text/html') eq "Status: 302 Moved${CRLF}Location: http://somewhere.else/bin/foo&bar${CRLF}Content-Type: text/html; charset=ISO-8859-1${CRLF}${CRLF}","CGI::redirect() 2");
diff --git a/lib/Lingua/KO/Hangul/Util.pm b/lib/Lingua/KO/Hangul/Util.pm
new file mode 100644 (file)
index 0000000..3848592
--- /dev/null
@@ -0,0 +1,278 @@
+package Lingua::KO::Hangul::Util;
+
+use 5.006;
+use strict;
+use warnings;
+
+require Exporter;
+
+our @ISA = qw(Exporter);
+our %EXPORT_TAGS = ();
+our @EXPORT_OK = ();
+our @EXPORT = qw(
+  decomposeHangul
+  composeHangul
+  getHangulName
+  parseHangulName
+);
+our $VERSION = '0.02';
+
+our @JamoL = ( # Initial (HANGUL CHOSEONG)
+    "G", "GG", "N", "D", "DD", "R", "M", "B", "BB",
+    "S", "SS", "", "J", "JJ", "C", "K", "T", "P", "H",
+  );
+
+our @JamoV = ( # Medial  (HANGUL JUNGSEONG)
+    "A", "AE", "YA", "YAE", "EO", "E", "YEO", "YE", "O",
+    "WA", "WAE", "OE", "YO", "U", "WEO", "WE", "WI",
+    "YU", "EU", "YI", "I",
+  );
+
+our @JamoT = ( # Final    (HANGUL JONGSEONG)
+    "", "G", "GG", "GS", "N", "NJ", "NH", "D", "L", "LG", "LM",
+    "LB", "LS", "LT", "LP", "LH", "M", "B", "BS",
+    "S", "SS", "NG", "J", "C", "K", "T", "P", "H",
+  );
+
+our $BlockName = "HANGUL SYLLABLE ";
+
+use constant SBase  => 0xAC00;
+use constant LBase  => 0x1100;
+use constant VBase  => 0x1161;
+use constant TBase  => 0x11A7;
+use constant LCount => 19;     # scalar @JamoL
+use constant VCount => 21;     # scalar @JamoV
+use constant TCount => 28;     # scalar @JamoT
+use constant NCount => 588;    # VCount * TCount
+use constant SCount => 11172;  # LCount * NCount
+use constant SFinal => 0xD7A3; # SBase -1 + SCount
+
+our(%CodeL, %CodeV, %CodeT);
+@CodeL{@JamoL} = 0 .. LCount-1;
+@CodeV{@JamoV} = 0 .. VCount-1;
+@CodeT{@JamoT} = 0 .. TCount-1;
+
+sub getHangulName {
+    my $code = shift;
+    return undef unless SBase <= $code && $code <= SFinal;
+    my $SIndex = $code - SBase;
+    my $LIndex = int( $SIndex / NCount);
+    my $VIndex = int(($SIndex % NCount) / TCount);
+    my $TIndex =      $SIndex % TCount;
+    "$BlockName$JamoL[$LIndex]$JamoV[$VIndex]$JamoT[$TIndex]";
+}
+
+sub parseHangulName {
+    my $arg = shift;
+    return undef unless $arg =~ s/$BlockName//o;
+    return undef unless $arg =~ /^([^AEIOUWY]*)([AEIOUWY]+)([^AEIOUWY]*)$/;
+    return undef unless  exists $CodeL{$1}
+               && exists $CodeV{$2}
+               && exists $CodeT{$3};
+    SBase + $CodeL{$1} * NCount + $CodeV{$2} * TCount + $CodeT{$3};
+}
+
+sub decomposeHangul {
+    my $code = shift;
+    return unless SBase <= $code && $code <= SFinal;
+    my $SIndex = $code - SBase;
+    my $LIndex = int( $SIndex / NCount);
+    my $VIndex = int(($SIndex % NCount) / TCount);
+    my $TIndex =      $SIndex % TCount;
+    my @ret = (
+       LBase + $LIndex,
+       VBase + $VIndex,
+      $TIndex ? (TBase + $TIndex) : (),
+    );
+    wantarray ? @ret : pack('U*', @ret);
+}
+
+#
+# To Do:
+#  s/(\p{JamoL}\p{JamoV})/toHangLV($1)/ge;
+#  s/(\p{HangLV}\p{JamoT})/toHangLVT($1)/ge;
+#
+sub composeHangul {
+    my $str = shift;
+    return $str unless length $str;
+    my(@ret);
+
+    foreach my $ch (unpack('U*', $str)) # Makes list! The string be short!
+    {
+      push(@ret, $ch) and next unless @ret;
+
+      # 1. check to see if $ret[-1] is L and $ch is V.
+      my $LIndex = $ret[-1] - LBase;
+      if(0 <= $LIndex && $LIndex < LCount)
+      {
+        my $VIndex = $ch - VBase;
+        if(0 <= $VIndex && $VIndex < VCount)
+        {
+          $ret[-1] = SBase + ($LIndex * VCount + $VIndex) * TCount;
+          next; # discard $ch
+        }
+      }
+
+      # 2. check to see if $ret[-1] is LV and $ch is T.
+      my $SIndex = $ret[-1] - SBase;
+      if(0 <= $SIndex && $SIndex < SCount && $SIndex % TCount == 0)
+      {
+        my $TIndex = $ch - TBase;
+        if(0 <= $TIndex && $TIndex < TCount)
+        {
+          $ret[-1] += $TIndex;
+          next; # discard $ch
+        }
+      }
+
+      # 3. just append $ch
+      push(@ret, $ch);
+    }
+    wantarray ? @ret : pack('U*', @ret);
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Lingua::KO::Hangul::Util - utility functions for Hangul Syllables
+
+=head1 SYNOPSIS
+
+  use Lingua::KO::Hangul::Util;
+
+  decomposeHangul(0xAC00);
+    # (0x1100,0x1161) or "\x{1100}\x{1161}"
+
+  composeHangul("\x{1100}\x{1161}");
+    # "\x{AC00}"
+
+  getHangulName(0xAC00);
+    # "HANGUL SYLLABLE GA"
+
+  parseHangulName("HANGUL SYLLABLE GA");
+    # 0xAC00
+
+=head1 DESCRIPTION
+
+A Hangul syllable consists of Hangul Jamo.
+
+Hangul Jamo are classified into three classes:
+
+  CHOSEONG  (the initial sound) as a leading consonant (L),
+  JUNGSEONG (the medial sound)  as a vowel (V),
+  JONGSEONG (the final sound)   as a trailing consonant (T).
+
+Any Hangul syllable is a composition of
+
+   i) CHOSEONG + JUNGSEONG (L + V)
+
+    or
+
+  ii) CHOSEONG + JUNGSEONG + JONGSEONG (L + V + T).
+
+Names of Hangul Syllables have a format of C<"HANGUL SYLLABLE %s">.
+
+=head2 Composition and Decomposition
+
+=over 4
+
+=item C<$string_decomposed = decomposeHangul($codepoint)>
+
+=item C<@codepoints = decomposeHangul($codepoint)>
+
+Accepts unicode codepoint integer.
+
+If the specified codepoint is of a Hangul syllable,
+returns a list of codepoints (in a list context)
+or a UTF-8 string (in a scalar context)
+of its decomposition.
+
+   decomposeHangul(0xAC00) # U+AC00 is HANGUL SYLLABLE GA.
+      returns "\x{1100}\x{1161}" or (0x1100, 0x1161);
+
+   decomposeHangul(0xAE00) # U+AE00 is HANGUL SYLLABLE GEUL.
+      returns "\x{1100}\x{1173}\x{11AF}" or (0x1100, 0x1173, 0x11AF);
+
+Otherwise, returns false (empty string or empty list).
+
+   decomposeHangul(0x0041) # outside Hangul Syllables
+      returns empty string or empty list.
+
+=item C<$string_composed = composeHangul($src_string)>
+
+=item C<@codepoints_composed = composeHangul($src_string)>
+
+Any sequence of an initial Jamo C<L> and a medial Jamo C<V>
+is composed into a syllable C<LV>;
+then any sequence of a syllable C<LV> and a final Jamo C<T>
+is composed into a syllable C<LVT>.
+
+Any characters other than Hangul Jamo and Hangul Syllables
+are unaffected.
+
+   composeHangul("Hangul \x{1100}\x{1161}\x{1100}\x{1173}\x{11AF}.")
+    returns "Hangul \x{AC00}\x{AE00}." or
+     (0x48,0x61,0x6E,0x67,0x75,0x6C,0x20,0xAC00,0xAE00,0x2E);
+
+=back
+
+=head2 Hangul Syllable Name
+
+=over 4
+
+=item C<$name = getHangulName($codepoint)>
+
+If the specified codepoint is of a Hangul syllable,
+returns its name; otherwise returns undef.
+
+   getHangulName(0xAC00) returns "HANGUL SYLLABLE GA";
+   getHangulName(0x0041) returns undef.
+
+=item C<$codepoint = parseHangulName($name)>
+
+If the specified name is of a Hangul syllable,
+returns its codepoint; otherwise returns undef. 
+
+   parseHangulName("HANGUL SYLLABLE GEUL") returns 0xAE00;
+
+   parseHangulName("LATIN SMALL LETTER A") returns undef;
+
+   parseHangulName("HANGUL SYLLABLE PERL") returns undef;
+    # Regrettably, HANGUL SYLLABLE PERL does not exist :-)
+
+=back
+
+=head2 EXPORT
+
+By default,
+
+  decomposeHangul
+  composeHangul
+  getHangulName
+  parseHangulName
+
+=head1 AUTHOR
+
+SADAHIRO Tomoyuki 
+
+  bqw10602@nifty.com
+  http://homepage1.nifty.com/nomenclator/perl/
+
+  Copyright(C) 2001, SADAHIRO Tomoyuki. Japan. All rights reserved.
+
+  This program is free software; you can redistribute it and/or 
+  modify it under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+=over 4
+
+=item http://www.unicode.org/unicode/reports/tr15
+
+Annex 10: Hangul, in Unicode Normalization Forms (UAX #15).
+
+=back
+
+=cut
diff --git a/lib/Lingua/KO/Hangul/Util/Changes b/lib/Lingua/KO/Hangul/Util/Changes
new file mode 100644 (file)
index 0000000..2e43817
--- /dev/null
@@ -0,0 +1,11 @@
+Revision history for Perl extension Lingua::KO::Hangul::Util.
+
+0.02  Sat Aug 11 00:16:02 2001
+       - fix SEE ALSO (the Unicode Normalization Forms is UAX #15)
+       - getHangulName and parseHangulName return
+         a list (undef) of one element in list context.
+
+0.01  Fri Aug  3 21:25:11 2001
+       - original version; created by h2xs 1.21 with options
+               -A -X -n Lingua::KO::Hangul::Util
+
diff --git a/lib/Lingua/KO/Hangul/Util/README b/lib/Lingua/KO/Hangul/Util/README
new file mode 100644 (file)
index 0000000..9fc04d8
--- /dev/null
@@ -0,0 +1,44 @@
+Lingua/KO/Hangul/Util version 0.02
+==================================
+
+SYNOPSIS
+
+  use Lingua::KO::Hangul::Util;
+
+  decomposeHangul(0xAC00);
+    # (0x1100,0x1161) or "\x{1100}\x{1161}"
+
+  composeHangul("\x{1100}\x{1161}");
+    # "\x{AC00}"
+
+  getHangulName(0xAC00);
+    # "HANGUL SYLLABLE GA"
+
+  parseHangulName("HANGUL SYLLABLE GA");
+    # 0xAC00
+
+INSTALLATION
+
+To install this module type the following:
+
+   perl Makefile.PL
+   make
+   make test
+   make install
+
+DEPENDENCIES
+
+Perl 5.006 or later
+
+COPYRIGHT AND LICENCE
+
+SADAHIRO Tomoyuki
+
+  bqw10602@nifty.com
+
+  http://homepage1.nifty.com/nomenclator/perl/
+
+  Copyright(C) 2001, SADAHIRO Tomoyuki. Japan. All rights reserved.
+
+  This program is free software; you can redistribute it and/or 
+  modify it under the same terms as Perl itself.
diff --git a/lib/Lingua/KO/Hangul/Util/t/test.t b/lib/Lingua/KO/Hangul/Util/t/test.t
new file mode 100644 (file)
index 0000000..d4a5df5
--- /dev/null
@@ -0,0 +1,55 @@
+# Before `make install' is performed this script should be runnable with
+# `make test'. After `make install' it should work as `perl test.pl'
+
+#########################
+
+use Test;
+use strict;
+BEGIN { plan tests => 22 };
+use Lingua::KO::Hangul::Util;
+ok(1); # If we made it this far, we're ok.
+
+#########################
+
+sub unpk { 
+  join ':', map sprintf("%04X", $_), 
+     @_ == 1 ? unpack('U*', shift) : @_;
+}
+
+ok(getHangulName(0xAC00), "HANGUL SYLLABLE GA");
+ok(getHangulName(0xAE00), "HANGUL SYLLABLE GEUL");
+ok(getHangulName(0xC544), "HANGUL SYLLABLE A");
+ok(getHangulName(0xD7A3), "HANGUL SYLLABLE HIH");
+ok(getHangulName(0x11A3),  undef);
+ok(getHangulName(0x0000),  undef);
+
+ok(unpk(decomposeHangul(0xAC00)), "1100:1161");
+ok(unpk(decomposeHangul(0xAE00)), "1100:1173:11AF");
+ok(unpk(scalar decomposeHangul(0xAC00)), "1100:1161");
+ok(unpk(scalar decomposeHangul(0xAE00)), "1100:1173:11AF");
+ok(scalar decomposeHangul(0x0041), undef);
+ok(scalar decomposeHangul(0x0000), undef);
+
+ok(composeHangul("Hangul \x{1100}\x{1161}\x{1100}\x{1173}\x{11AF}."),
+    "Hangul \x{AC00}\x{AE00}.");
+
+ok(parseHangulName("HANGUL SYLLABLE GA"),   0xAC00);
+ok(parseHangulName("HANGUL SYLLABLE GEUL"), 0xAE00);
+ok(parseHangulName("HANGUL SYLLABLE A"),    0xC544);
+ok(parseHangulName("HANGUL SYLLABLE HIH"),  0xD7A3);
+ok(parseHangulName("HANGUL SYLLABLE PERL"), undef);
+ok(parseHangulName("LATIN LETTER SMALL A"), undef);
+
+my $ng;
+
+$ng = 0;
+foreach my $i (0xAC00..0xD7A3){
+  $ng ++ if $i != parseHangulName(getHangulName($i));
+}
+ok($ng, 0);
+
+$ng = 0;
+foreach my $i (0xAC00..0xD7A3){
+  $ng ++ if $i != (composeHangul scalar decomposeHangul($i))[0];
+}
+ok($ng, 0);
index ccfcac5..fcd4576 100644 (file)
@@ -1,3 +1,138 @@
+Change 625 on 2001/08/17 by <gbarr@pobox.com> (Graham Barr)
+
+       Doc updates and add cc and bcc as aliases for recipient
+
+Change 624 on 2001/08/17 by <gbarr@pobox.com> (Graham Barr)
+
+       Don't set ENV variables
+
+Change 623 on 2001/08/17 by <gbarr@pobox.com> (Graham Barr)
+
+       Support mixed case in the EHLO response
+
+Change 622 on 2001/08/06 by <gbarr@pobox.com> (Graham Barr)
+
+       Documentation update
+
+Change 621 on 2001/08/06 by <gbarr@pobox.com> (Graham Barr)
+
+       Set the status if command returns due to the connection being closed
+
+Change 620 on 2001/08/06 by <gbarr@pobox.com> (Graham Barr)
+
+       Fix for _msg_spec when passed the same msg number twice, pass N instead of N-N
+
+Change 619 on 2001/05/29 by <gbarr@pobox.com> (Graham Barr)
+
+       Remove DummyInetd
+
+Change 618 on 2001/05/29 by <gbarr@pobox.com> (Graham Barr)
+
+       Move snpp into its own distribution
+
+Change 615 on 2001/05/29 by <gbarr@pobox.com> (Graham Barr)
+
+       Move PH to its own dist
+
+Change 614 on 2001/05/29 by <gbarr@pobox.com> (Graham Barr)
+
+       Move TFTP out of libnet
+
+Change 612 on 2001/03/29 by <gbarr@pobox.com> (Graham Barr)
+
+       Support some non standard servers that return more than
+       just a number in response to SIZE. But the size must be
+       the last thing on the response line [Jeffery W Long]
+
+Change 603 on 2000/10/06 by <gbarr@pobox.com> (Graham Barr)
+
+       Net::Config
+       - Added documentation for ftp_firewall_type
+
+Change 574 on 2000/08/24 by <gbarr@pobox.com> (Graham Barr)
+
+       Net::FTP
+       - Make listen socket listen on same interfacce as the command connection
+         this fixes a problem when going via a SOCKS firewall
+
+Change 458 on 2000/03/29 by <gbarr@pobox.com> (Graham Barr)
+
+       Net::Cmd, Net::FTP
+       - Support for os390, modified from a patch from Dan Campbell
+
+Change 455 on 2000/03/29 by <gbarr@pobox.com> (Graham Barr)
+
+       Net::Domain
+       - silence warnings on Win32 that domainname does not exist
+
+Change 454 on 2000/03/29 by <gbarr@pobox.com> (Graham Barr)
+
+       Net::FTP
+       - More error checking in ->get()
+
+Change 453 on 2000/03/29 by <gbarr@pobox.com> (Graham Barr)
+
+       Net::FTP
+       - update pattern to dig out unique filename from stou
+
+Change 452 on 2000/03/29 by <gbarr@pobox.com> (Graham Barr)
+
+       t/ftp.t
+       - silently pass if the stor to /pub fails
+
+Change 451 on 2000/03/29 by <gbarr@pobox.com> (Graham Barr)
+
+       Net::FTP
+       - Add Timeout to listen socket
+
+Change 450 on 2000/03/29 by <gbarr@pobox.com> (Graham Barr)
+
+       Makefile.PL
+       - only add ppd conditional on perl version
+
+Change 449 on 2000/03/29 by <gbarr@pobox.com> (Graham Barr)
+
+       Fixed mput example in FAQ to use glob()
+
+Change 448 on 2000/03/29 by <gbarr@pobox.com> (Graham Barr)
+
+       Update README to reflect new way Configure works
+
+Change 447 on 2000/03/29 by <gbarr@pobox.com> (Graham Barr)
+
+       Net::Config
+       - Check that $home is defined before we use it
+
+Change 446 on 2000/03/29 by <gbarr@pobox.com> (Graham Barr)
+
+       Net::FTP
+       - add link to autoftp example
+
+Change 445 on 2000/03/29 by <gbarr@pobox.com> (Graham Barr)
+
+       Net::FTP::A, Net::FTP::I
+       - Move the timeout check into the loop to prevent hanging
+         on write.
+
+Change 444 on 2000/03/29 by <gbarr@pobox.com> (Graham Barr)
+
+       Net::Cmd, Net::FTP::A, Net::FTP::I
+       - MacOS does not like the setting of $SIG{PIPE} so check $^O
+
+Change 432 on 2000/03/29 by <gbarr@pobox.com> (Graham Barr)
+
+       POD cleanup
+
+Change 431 on 2000/03/29 by <gbarr@pobox.com> (Graham Barr)
+
+       Net::NNTP
+       - Allow a filehandle to be passed to article, head and body
+
+Change 430 on 2000/03/29 by <gbarr@pobox.com> (Graham Barr)
+
+       Net::TFTP
+       - There is no quit method, so don't document one
+
 Change 402 on 2000/03/23 by <gbarr@pobox.com> (Graham Barr)
 
        Net::Config
index 22b8d48..a23a437 100644 (file)
@@ -1,4 +1,4 @@
-# Net::Cmd.pm
+# Net::Cmd.pm $Id: //depot/libnet/Net/Cmd.pm#25 $
 #
 # Copyright (c) 1995-1997 Graham Barr <gbarr@pobox.com>. All rights reserved.
 # This program is free software; you can redistribute it and/or
@@ -13,7 +13,14 @@ use strict;
 use vars qw(@ISA @EXPORT $VERSION);
 use Carp;
 
-$VERSION = "2.18";
+BEGIN {
+  if ($^O eq 'os390') {
+    require Convert::EBCDIC;
+#    Convert::EBCDIC->import;
+  }
+}
+
+$VERSION = "2.19";
 @ISA     = qw(Exporter);
 @EXPORT  = qw(CMD_INFO CMD_OK CMD_MORE CMD_REJECT CMD_ERROR CMD_PENDING);
 
@@ -26,6 +33,32 @@ sub CMD_PENDING { 0 }
 
 my %debug = ();
 
+my $tr = $^O eq 'os390' ? Convert::EBCDIC->new() : undef;
+
+sub toebcdic
+{
+ my $cmd = shift;
+
+ unless (exists ${*$cmd}{'net_cmd_asciipeer'})
+  {
+   my $string = $_[0];
+   my $ebcdicstr = $tr->toebcdic($string);
+   ${*$cmd}{'net_cmd_asciipeer'} = $string !~ /^\d+/ && $ebcdicstr =~ /^\d+/;
+  }
+
+  ${*$cmd}{'net_cmd_asciipeer'}
+    ? $tr->toebcdic($_[0])
+    : $_[0];
+}
+
+sub toascii
+{
+  my $cmd = shift;
+  ${*$cmd}{'net_cmd_asciipeer'}
+    ? $tr->toascii($_[0])
+    : $_[0];
+}
+
 sub _print_isa
 {
  no strict qw(refs);
@@ -159,19 +192,27 @@ sub command
 {
  my $cmd = shift;
 
- return $cmd unless defined fileno($cmd);
+ unless (defined fileno($cmd))
+  {
+    $cmd->set_status("599", "Connection closed");
+    return $cmd;
+  }
+
+
  $cmd->dataend()
     if(exists ${*$cmd}{'net_cmd_lastch'});
 
  if (scalar(@_))
   {
-   local $SIG{PIPE} = 'IGNORE';
+   local $SIG{PIPE} = 'IGNORE' unless $^O eq 'MacOS';
+
+   my $str =  join(" ", map { /\n/ ? do { my $n = $_; $n =~ tr/\n/ /; $n } : $_; } @_);
+   $str = $cmd->toascii($str) if $tr;
+   $str .= "\015\012";
 
-   my $str =  join(" ", map { /\n/ ? do { my $n = $_; $n =~ tr/\n/ /; $n } : $_; } @_) . "\015\012";
    my $len = length $str;
    my $swlen;
-   
+
    $cmd->close
        unless (defined($swlen = syswrite($cmd,$str,$len)) && $swlen == $len);
 
@@ -214,7 +255,7 @@ sub getline
  my $partial = defined(${*$cmd}{'net_cmd_partial'})
                ? ${*$cmd}{'net_cmd_partial'} : "";
  my $fd = fileno($cmd);
+
  return undef
        unless defined $fd;
 
@@ -255,6 +296,14 @@ sub getline
 
  ${*$cmd}{'net_cmd_partial'} = $partial;
 
+ if ($tr) 
+  {
+   foreach my $ln (@{${*$cmd}{'net_cmd_lines'}}) 
+    {
+     $ln = $cmd->toebcdic($ln);
+    }
+  }
+
  shift @{${*$cmd}{'net_cmd_lines'}};
 }
 
@@ -437,7 +486,7 @@ Net::Cmd - Network Command class (as used by FTP, SMTP etc)
 =head1 SYNOPSIS
 
     use Net::Cmd;
-    
+
     @ISA = qw(Net::Cmd);
 
 =head1 DESCRIPTION
@@ -588,4 +637,8 @@ Copyright (c) 1995-1997 Graham Barr. All rights reserved.
 This program is free software; you can redistribute it and/or modify
 it under the same terms as Perl itself.
 
+=for html <hr>
+
+I<$Id: //depot/libnet/Net/Cmd.pm#25 $>
+
 =cut
index e0dd1d9..db503b5 100644 (file)
@@ -1,6 +1,10 @@
+# Net::Config.pm
+#
+# Copyright (c) 2000 Graham Barr <gbarr@pobox.com>. All rights reserved.
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
 
 package Net::Config;
-# $Id: //depot/libnet/Net/Config.pm#6 $
 
 require Exporter;
 use vars qw(@ISA @EXPORT %NetConfig $VERSION $CONFIGURE $LIBNET_CFG);
@@ -9,7 +13,7 @@ use strict;
 
 @EXPORT  = qw(%NetConfig);
 @ISA     = qw(Net::LocalCfg Exporter);
-$VERSION = "1.04";
+$VERSION = "1.05"; # $Id: //depot/libnet/Net/Config.pm#9 $
 
 eval { local $SIG{__DIE__}; require Net::LocalCfg };
 
@@ -40,12 +44,13 @@ if ( -f $file ) {
     }
 }
 if ($< == $> and !$CONFIGURE)  {
-    use File::Spec;
-    my $home = eval { (getpwuid($>))[7] } || $ENV{HOME} || $ENV{HOMEDRIVE} || $ENV{HOMEPATH} || File::Spec->curdir;
-    $file = File::Spec->catfile($home, ".libnetrc");
-    $ref = eval { do $file } if -f $file;
-    %NetConfig = (%NetConfig, %{ $ref })
-       if ref($ref) eq 'HASH'; 
+    my $home = eval { (getpwuid($>))[7] } || $ENV{HOME};
+    if (defined $home) {
+       $file = $home . "/.libnetrc";
+       $ref = eval { do $file } if -f $file;
+       %NetConfig = (%NetConfig, %{ $ref })
+           if ref($ref) eq 'HASH';     
+    }
 }
 my ($k,$v);
 while(($k,$v) = each %NetConfig) {
@@ -168,6 +173,73 @@ then this value should be set to the firewall hostname. If your firewall
 does not listen to port 21, then this value should be set to
 C<"hostname:port"> (eg C<"hostname:99">)
 
+=item ftp_firewall_type
+
+There are many different ftp firewall products avaliable. But unfortunately there
+is not standard for how to traverse a firewall.  The list below shows the
+sequence of commands that Net::FTP will use
+
+  user        Username for remote host
+  pass        Password for remote host
+  fwuser      Username for firewall
+  fwpass      Password for firewall
+  remote.host The hostname of the remote ftp server
+
+=over 4
+
+=item 0
+
+There is no firewall
+
+=item 1
+
+     USER user@remote.host
+     PASS pass
+
+=item 2
+
+     USER fwuser
+     PASS fwpass
+     USER user@remote.host
+     PASS pass
+
+=item 3
+
+     USER fwuser
+     PASS fwpass
+     SITE remote.site
+     USER user
+     PASS pass
+
+=item 4
+
+     USER fwuser
+     PASS fwpass
+     OPEN remote.site
+     USER user
+     PASS pass
+
+=item 5
+
+     USER user@fwuser@remote.site
+     PASS pass@fwpass
+
+=item 6
+
+     USER fwuser@remote.site
+     PASS fwpass
+     USER user
+     PASS pass
+
+=item 7
+
+     USER user@remote.host
+     PASS pass
+     AUTH fwuser
+     RESP fwpass
+
+=back
+
 =item ftp_ext_passive
 
 =item ftp_int_pasive
@@ -210,4 +282,8 @@ If true the C<Configure> will check each hostname given that it exists
 
 =back
 
+=for html <hr>
+
+I<$Id: //depot/libnet/Net/Config.pm#9 $>
+
 =cut
index 189bb73..229bc16 100644 (file)
@@ -16,7 +16,7 @@ use Net::Config;
 @ISA = qw(Exporter);
 @EXPORT_OK = qw(hostname hostdomain hostfqdn domainname);
 
-$VERSION = "2.13"; # $Id: //depot/libnet/Net/Domain.pm#10 $
+$VERSION = "2.14"; # $Id: //depot/libnet/Net/Domain.pm#15 $
 
 my($host,$domain,$fqdn) = (undef,undef,undef);
 
@@ -28,7 +28,7 @@ sub _hostname {
     return $host
        if(defined $host);
 
-    if ($^O eq 'MSWin32' || $^O eq 'cygwin') {
+    if ($^O eq 'MSWin32') {
         require Socket;
         my ($name,$alias,$type,$len,@addr) =  gethostbyname($ENV{'COMPUTERNAME'}||'localhost');
         while (@addr)
@@ -101,7 +101,7 @@ sub _hostname {
            $host = "";
        };
     }
+
     # remove garbage 
     $host =~ s/[\0\r\n]+//go;
     $host =~ s/(\A\.+|\.+\Z)//go;
@@ -165,7 +165,7 @@ sub _hostdomain {
         };
 
        chop($dom = `domainname 2>/dev/null`)
-               unless(defined $dom);
+               unless(defined $dom || $^O eq 'MSWin32');
 
        if(defined $dom) {
            my @h = ();
@@ -199,7 +199,7 @@ sub _hostdomain {
 
     # Look for environment variable
 
-    $domain ||= $ENV{LOCALDOMAIN} ||= $ENV{DOMAIN} || undef;
+    $domain ||= $ENV{LOCALDOMAIN} || $ENV{DOMAIN};
 
     if(defined $domain) {
        $domain =~ s/[\r\n\0]+//g;
@@ -236,7 +236,7 @@ sub domainname {
     # Determine from @host & @domain the FQDN
 
     my @d = @domain;
+
 LOOP:
     while(1) {
        my @h = @host;
@@ -328,4 +328,8 @@ Copyright (c) 1995-1998 Graham Barr. All rights reserved.
 This program is free software; you can redistribute it and/or modify
 it under the same terms as Perl itself.
 
+=for html <hr>
+
+I<$Id: //depot/libnet/Net/Domain.pm#15 $>
+
 =cut
index dd86300..a1daedc 100644 (file)
@@ -21,7 +21,7 @@ use Net::Cmd;
 use Net::Config;
 # use AutoLoader qw(AUTOLOAD);
 
-$VERSION = "2.56"; # $Id:$
+$VERSION = "2.58"; # $Id: //depot/libnet/Net/FTP.pm#57 $
 @ISA     = qw(Exporter Net::Cmd IO::Socket::INET);
 
 # Someday I will "use constant", when I am not bothered to much about
@@ -36,6 +36,12 @@ sub pasv_xfer_unique {
     $sftp->pasv_xfer($sfile,$dftp,$dfile,1);
 }
 
+BEGIN {
+  # make a constant so code is fast'ish
+  my $is_os390 = $^O eq 'os390';
+  *trEBCDIC = sub () { $is_os390 }
+}
+
 1;
 # Having problems with AutoLoader
 #__END__
@@ -205,7 +211,7 @@ sub size {
   my $io;
   if($ftp->supported("SIZE")) {
     return $ftp->_SIZE($file)
-       ? ($ftp->message =~ /(\d+)/)[0]
+       ? ($ftp->message =~ /(\d+)$/)[0]
        : undef;
  }
  elsif($ftp->supported("STAT")) {
@@ -399,7 +405,7 @@ sub abort
  send($ftp,pack("CCC", $TELNET_IAC, $TELNET_IP, $TELNET_IAC),MSG_OOB);
 
  $ftp->command(pack("C",$TELNET_DM) . "ABOR");
+
  ${*$ftp}{'net_ftp_dataconn'}->close()
     if defined ${*$ftp}{'net_ftp_dataconn'};
 
@@ -469,6 +475,13 @@ sub get
  while(1)
   {
    last unless $len = $data->read($buf,$blksize);
+
+   if (trEBCDIC && $ftp->type ne 'I')
+    {
+     $buf = $ftp->toebcdic($buf);
+     $len = length($buf);
+    }
+
    if($hashh) {
     $count += $len;
     print $hashh "#" x (int($count / $hashb));
@@ -487,10 +500,20 @@ sub get
 
  print $hashh "\n" if $hashh;
 
- close($loc)
-       unless defined $localfd;
- $data->close(); # implied $ftp->response
+ unless (defined $localfd)
+  {
+   unless (close($loc))
+    {
+     carp "Cannot close file $local (perhaps disk space) $!\n";
+     return undef;
+    }
+  }
+
+ unless ($data->close()) # implied $ftp->response
+  {
+   carp "Unable to close datastream";
+   return undef;
+  }
 
  return $local;
 }
@@ -542,7 +565,7 @@ sub rmdir
     my $ok;
 
     return $ok
-       if $ftp->_RMD( $dir ) || !$recurse;
+       if $ok = $ftp->_RMD( $dir ) or !$recurse;
 
     # Try to delete the contents
     # Get a list of all the files in the directory
@@ -573,6 +596,18 @@ sub rmdir
     return $ftp->_RMD($dir) ;
 }
 
+sub restart
+{
+  @_ == 2 || croak 'usage: $ftp->restart( BYTE_OFFSET )';
+
+  my($ftp,$where) = @_;
+
+  ${*$ftp}{'net_ftp_rest'} = $where;
+
+  return undef;
+}
+
+
 sub mkdir
 {
  @_ == 2 || @_ == 3 or croak 'usage: $ftp->mkdir( DIR [, RECURSE ] )';
@@ -606,7 +641,7 @@ sub mkdir
     {
      my($status,$message) = ($ftp->status,$ftp->message);
      my $pwd = $ftp->pwd;
-     
+
      if($pwd && $ftp->cwd($dir))
       {
        $path = $dir;
@@ -701,6 +736,12 @@ sub _store_cmd
   {
    last unless $len = sysread($loc,$buf="",$blksize);
 
+   if (trEBCDIC)
+    {
+     $buf = $ftp->toascii($buf); 
+     $len = length($buf);
+    }
+
    if($hashh) {
     $count += $len;
     print $hashh "#" x (int($count / $hashb));
@@ -726,8 +767,11 @@ sub _store_cmd
  $sock->close() or
        return undef;
 
- ($remote) = $ftp->message =~ /unique file name:\s*(\S*)\s*\)/
-       if ('STOU' eq uc $cmd);
+ if ('STOU' eq uc $cmd and $ftp->message =~ m/unique\ file\ name:(.*)\)|"(.*)"/)
+  {
+   require File::Basename;
+   $remote = File::Basename::basename($+) 
+  }
 
  return $remote;
 }
@@ -747,11 +791,13 @@ sub port
 
    ${*$ftp}{'net_ftp_listen'} ||= IO::Socket::INET->new(Listen    => 5,
                                                        Proto     => 'tcp',
+                                                       Timeout   => $ftp->timeout,
+                                                       LocalAddr => $ftp->sockhost,
                                                       );
-  
+
    my $listen = ${*$ftp}{'net_ftp_listen'};
 
-   my($myport, @myaddr) = ($listen->sockport, split(/\./,$ftp->sockhost));
+   my($myport, @myaddr) = ($listen->sockport, split(/\./,$listen->sockhost));
 
    $port = join(',', @myaddr, $myport >> 8, $myport & 0xff);
 
@@ -923,6 +969,11 @@ sub _list_cmd
 
  $data->close();
 
+ if (trEBCDIC)
+  {
+   for (@$list) { $_ = $ftp->toebcdic($_) }
+  }
+
  wantarray ? @{$list}
            : $list;
 }
@@ -996,9 +1047,9 @@ sub _data_cmd
    return $data;
  }
 
+
  close(delete ${*$ftp}{'net_ftp_listen'});
+
  return undef;
 }
 
@@ -1151,7 +1202,7 @@ Net::FTP - FTP Client class
 =head1 SYNOPSIS
 
     use Net::FTP;
-    
+
     $ftp = Net::FTP->new("some.host.name", Debug => 0);
     $ftp->login("anonymous",'me@here.there');
     $ftp->cwd("/pub");
@@ -1307,6 +1358,13 @@ Change directory to the parent of the current directory.
 
 Returns the full pathname of the current directory.
 
+=item restart ( WHERE )
+
+Set the byte offset at which to begin the next data transfer. Net::FTP simply
+records this value and uses it when during the next data transfer. For this
+reason this method will not return an error, but setting it may cause
+a subsequent data transfer to fail.
+
 =item rmdir ( DIR )
 
 Remove the directory with the name C<DIR>.
@@ -1343,7 +1401,7 @@ not be transfered, and the remaining bytes will be appended to
 the local file if it already exists.
 
 Returns C<LOCAL_FILE>, or the generated local file name if C<LOCAL_FILE>
-is not given.
+is not given. If an error was encountered undef is returned.
 
 =item put ( LOCAL_FILE [, REMOTE_FILE ] )
 
@@ -1546,6 +1604,10 @@ given the the timeout value from the command connection will be used.
 
 Returns the number of bytes written before any <CRLF> translation.
 
+=item bytes_read ()
+
+Returns the number of bytes read so far.
+
 =item abort ()
 
 Abort the current data transfer.
@@ -1625,6 +1687,19 @@ L<Net::Cmd>
 ftp(1), ftpd(8), RFC 959
 http://www.cis.ohio-state.edu/htbin/rfc/rfc959.html
 
+=head1 USE EXAMPLES
+
+For an example of the use of Net::FTP see
+
+=over 4
+
+=item http://www.csh.rit.edu/~adam/Progs/autoftp-2.0.tar.gz
+
+C<autoftp> is a program that can retrieve, send, or list files via
+the FTP protocol in a non-interactive manner.
+
+=back
+
 =head1 CREDITS
 
 Henry Gabryjelski <henryg@WPI.EDU> - for the suggestion of creating directories
@@ -1640,4 +1715,8 @@ Copyright (c) 1995-1998 Graham Barr. All rights reserved.
 This program is free software; you can redistribute it and/or modify it
 under the same terms as Perl itself.
 
+=for html <hr>
+
+I<$Id: //depot/libnet/Net/FTP.pm#57 $>
+
 =cut
index 46791e8..764e915 100644 (file)
@@ -1,4 +1,4 @@
-##
+## $Id: //depot/libnet/Net/FTP/A.pm#16 $
 ## Package to read/write on ASCII data connections
 ##
 
@@ -10,7 +10,7 @@ use Carp;
 require Net::FTP::dataconn;
 
 @ISA = qw(Net::FTP::dataconn);
-$VERSION = "1.13"; # $Id: //depot/libnet/Net/FTP/A.pm#9 $
+$VERSION = "1.15";
 
 sub read {
   my    $data   = shift;
@@ -71,23 +71,25 @@ sub write {
   my    $size  = shift || croak 'write($buf,$size,[$timeout])';
   my    $timeout = @_ ? shift : $data->timeout;
 
-  $data->can_write($timeout) or
-        croak "Timeout";
-
   (my $tmp = substr($buf,0,$size)) =~ s/\n/\015\012/sg;
 
   # If the remote server has closed the connection we will be signal'd
   # when we write. This can happen if the disk on the remote server fills up
 
-  local $SIG{PIPE} = 'IGNORE';
+  local $SIG{PIPE} = 'IGNORE' unless $^O eq 'MacOS';
 
   my $len = length($tmp);
   my $off = 0;
   my $wrote = 0;
 
+  my $blksize = ${*$data}{'net_ftp_blksize'};
+
   while($len) {
+    $data->can_write($timeout) or
+        croak "Timeout";
+
     $off += $wrote;
-    $wrote = syswrite($data, substr($tmp,$off), $len);
+    $wrote = syswrite($data, substr($tmp,$off), $len > $blksize ? $blksize : $len);
     return undef
       unless defined($wrote);
     $len -= $wrote;
index 4548c12..486dc96 100644 (file)
@@ -1,4 +1,4 @@
-##
+## $Id: //depot/libnet/Net/FTP/I.pm#11 $
 ## Package to read/write on BINARY data connections
 ##
 
@@ -10,7 +10,7 @@ use Carp;
 require Net::FTP::dataconn;
 
 @ISA = qw(Net::FTP::dataconn);
-$VERSION = "1.08"; # $Id: //depot/libnet/Net/FTP/I.pm#6$
+$VERSION = "1.10"; 
 
 sub read {
   my    $data   = shift;
@@ -47,18 +47,19 @@ sub write {
   my    $size    = shift || croak 'write($buf,$size,[$timeout])';
   my    $timeout = @_ ? shift : $data->timeout;
 
-  $data->can_write($timeout) or
-        croak "Timeout";
-
   # If the remote server has closed the connection we will be signal'd
   # when we write. This can happen if the disk on the remote server fills up
 
-  local $SIG{PIPE} = 'IGNORE';
+  local $SIG{PIPE} = 'IGNORE' unless $^O eq 'MacOS';
   my $sent = $size;
   my $off = 0;
 
+  my $blksize = ${*$data}{'net_ftp_blksize'};
   while($sent > 0) {
-    my $n = syswrite($data, $buf, $sent,$off);
+    $data->can_write($timeout) or
+        croak "Timeout";
+
+    my $n = syswrite($data, $buf, $sent > $blksize ? $blksize : $sent ,$off);
     return undef unless defined($n);
     $sent -= $n;
     $off += $n;
index e43c6e6..6ca437b 100644 (file)
@@ -5,9 +5,10 @@
 package Net::FTP::dataconn;
 
 use Carp;
-use vars qw(@ISA $timeout);
+use vars qw(@ISA $timeout $VERSION);
 use Net::Cmd;
 
+$VERSION = '0.10';
 @ISA = qw(IO::Socket::INET);
 
 sub reading
@@ -120,4 +121,10 @@ sub cmd
  ${*$ftp}{'net_ftp_cmd'};
 }
 
+sub bytes_read {
+ my $ftp = shift;
+
+ ${*$ftp}{'net_ftp_bytesread'} || 0;
+}
+
 1;
index 2644397..56c97b3 100644 (file)
@@ -14,7 +14,7 @@ use Carp;
 use Time::Local;
 use Net::Config;
 
-$VERSION = "2.19"; # $Id: //depot/libnet/Net/NNTP.pm#8$
+$VERSION = "2.20"; # $Id: //depot/libnet/Net/NNTP.pm#13 $
 @ISA     = qw(Net::Cmd IO::Socket::INET);
 
 sub new
@@ -60,7 +60,7 @@ sub new
 
  my $c = $obj->code;
  my @m = $obj->message;
+
  unless(exists $arg{Reader} && $arg{Reader} == 0) {
    # if server is INN and we have transfer rights the we are currently
    # talking to innd not nnrpd
@@ -514,9 +514,14 @@ sub _msg_arg
   {
    if(ref($spec))
     {
-     $arg = $spec->[0] . "-";
-     $arg .= $spec->[1]
-       if defined $spec->[1] && $spec->[1] > $spec->[0];
+     $arg = $spec->[0];
+     if(defined $spec->[1])
+      {
+       $arg .= "-"
+         if $spec->[1] != $spec->[0];
+       $arg .= $spec->[1]
+         if $spec->[1] > $spec->[0];
+      }
     }
    else
     {
@@ -660,7 +665,7 @@ Net::NNTP - NNTP Client class
 =head1 SYNOPSIS
 
     use Net::NNTP;
-    
+
     $nntp = Net::NNTP->new("some.host.name");
     $nntp->quit;
 
@@ -799,8 +804,8 @@ that it will allow posting.
 
 Obtain information about all the active newsgroups. The results is a reference
 to a hash where the key is a group name and each value is a reference to an
-array. The elements in this array are:- the first article number in the group,
-the last article number in the group and any information flags about the group.
+array. The elements in this array are:- the last article number in the group,
+the first article number in the group and any information flags about the group.
 
 =item newgroups ( SINCE [, DISTRIBUTIONS ])
 
@@ -1057,4 +1062,8 @@ Copyright (c) 1995-1997 Graham Barr. All rights reserved.
 This program is free software; you can redistribute it and/or modify
 it under the same terms as Perl itself.
 
+=for html <hr>
+
+I<$Id: //depot/libnet/Net/NNTP.pm#13 $>
+
 =cut
index 0c63310..bbd62ab 100644 (file)
@@ -11,7 +11,7 @@ use strict;
 use FileHandle;
 use vars qw($VERSION);
 
-$VERSION = "2.10"; # $Id: //depot/libnet/Net/Netrc.pm#4$
+$VERSION = "2.11"; # $Id: //depot/libnet/Net/Netrc.pm#10 $
 
 my %netrc = ();
 
@@ -19,7 +19,7 @@ sub _readrc
 {
  my $host = shift;
  my($home,$file);
+
  if($^O eq "MacOS") {
    $home = $ENV{HOME} || `pwd`;
    chomp($home);
@@ -37,7 +37,10 @@ sub _readrc
  $netrc{default} = undef;
 
  # OS/2 and Win32 do not handle stat in a way compatable with this check :-(
- unless($^O eq 'os2' || $^O eq 'MSWin32' || $^O eq 'MacOS')
+ unless($^O eq 'os2'
+     || $^O eq 'MSWin32'
+     || $^O eq 'MacOS'
+     || $^O =~ /^cygwin/)
   { 
    my @stat = stat($file);
 
@@ -199,7 +202,7 @@ Net::Netrc - OO interface to users netrc file
 =head1 SYNOPSIS
 
     use Net::Netrc;
-    
+
     $mach = Net::Netrc->lookup('some.machine');
     $login = $mach->login;
     ($login, $password, $account) = $mach->lpa;
@@ -323,4 +326,8 @@ Copyright (c) 1995-1998 Graham Barr. All rights reserved.
 This program is free software; you can redistribute it and/or modify
 it under the same terms as Perl itself.
 
+=for html <hr>
+
+$Id: //depot/libnet/Net/Netrc.pm#10 $
+
 =cut
index 6a05147..fb91916 100644 (file)
@@ -13,7 +13,7 @@ use Net::Cmd;
 use Carp;
 use Net::Config;
 
-$VERSION = "2.21"; # $Id$
+$VERSION = "2.22"; # $Id: //depot/libnet/Net/POP3.pm#19 $
 
 @ISA = qw(Net::Cmd IO::Socket::INET);
 
@@ -118,7 +118,7 @@ sub apop
               : "";
   }
 
- my $md = new MD5;
+ my $md = MD5->new;
  $md->add($banner,$pass);
 
  return undef
@@ -159,7 +159,7 @@ sub reset
 
  return 0 
    unless($me->_RSET);
-  
+
  if(defined ${*$me}{'net_pop3_mail'})
   {
    local $_;
@@ -215,7 +215,7 @@ sub list
    $me->message =~ /\d+\D+(\d+)/;
    return $1 || undef;
   }
+
  my $info = $me->read_until_dot
        or return undef;
 
@@ -277,7 +277,7 @@ sub ping
  ($1 || 0, $2 || 0);
 }
 
+
 sub _STAT { shift->command('STAT')->response() == CMD_OK }
 sub _LIST { shift->command('LIST',@_)->response() == CMD_OK }
 sub _RETR { shift->command('RETR',$_[0])->response() == CMD_OK }
@@ -353,7 +353,7 @@ Net::POP3 - Post Office Protocol 3 Client class (RFC1081)
 =head1 SYNOPSIS
 
     use Net::POP3;
-    
+
     # Constructors
     $pop = Net::POP3->new('pop3host');
     $pop = Net::POP3->new('pop3host', Timeout => 60);
@@ -518,4 +518,8 @@ Copyright (c) 1995-1997 Graham Barr. All rights reserved.
 This program is free software; you can redistribute it and/or modify
 it under the same terms as Perl itself.
 
+=for html <hr>
+
+I<$Id: //depot/libnet/Net/POP3.pm#19 $>
+
 =cut
diff --git a/lib/Net/README.config b/lib/Net/README.config
deleted file mode 100644 (file)
index 4dc7380..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-Hopefully the next release of libnet will be release 2.00. For this
-release I want to completely re-write the configuration system.
-
-My current thoughts are that a hash of values is not sufficient and that
-Net::Config should be code. This is what I have planned, if you see any
-problems or have any ideas please let me know by sending an Email
-to gbarr@pobox.com
-
-Net::Config will become an object based interface.  Methods will be called
-as static methods on the package. Net::Config will inherit from
-Net::LocalCfg and Net::Config::default. Net::LocalCfg is a package
-that local sys-admins can write to override the defaulr behaviour of
-Net::Config.
-
-Most of the variables that are currently stored in Net::Config will
-be turned into method calls, eg $NetConfig{'nntp_hosts'} will
-become Net::Config->nntp_hosts
-
-This approach will allow for a better implementation of the firewall code,
-which currently makes a lot of assumptions. To aid this Net::Config::default
-will provide a method 'reachable' which will take a single argument as
-a hostname and should return true it the host is reachable directly.
-
-This will also allow people who have dialup accounts, and appear in different
-domains at different times, to do what they need.
-
-Graham
-gbarr@pobox.com
index 0b6b0cd..59001ac 100644 (file)
@@ -18,10 +18,6 @@ Net::NNTP    RFC977          Network News Transfer Protocol
 Net::POP3      RFC1939         Post Office Protocol 3
 Net::SNPP      RFC1861         Simple Network Pager Protocol
 
-The distribution also contains a module (Net::PH) which facilitates
-comunicate with with servers using the CCSO Nameserver Server-Client
-Protocol
-
 FUTURE WORK
 
 AVAILABILITY
@@ -57,11 +53,20 @@ together with libnet.  These packages should be available on CPAN
 
 CONFIGURE
 
-Normally when perl Makefile.PL is run it will run Configure which will ask some
-questions about your system. The results of these questions will be stored in
-the Net::Config package. If you are on a system when this script cannot be run
-for some reason then the file Config.eg can be edited manually and installed
-as Net::Config (Net/Comfig.pm)
+Normally when perl Makefile.PL is run it will run Configure which will
+ask some questions about your system. The results of these questions
+will be stored in in a file called libnet.cfg which will be installed
+alongside the other perl modules in this distribution. The Makefile.PL
+will run Configure in an interactive mode unless these exists a file
+called libnet.cfg in the build directory.
+
+If you are on a system which cannot run this script you can create an
+empty file to make Makefile.PL skip running Configure. If you want to
+keep your existing settings and not run interactivly the simple run
+
+  Configure -d
+
+before running the Makefile.PL.
 
 DOCUMENTATION
 
@@ -84,7 +89,7 @@ SUPPORT
 
 Questions about how to use this library should be directed to the
 comp.lang.perl.modules USENET Newsgroup.  Bug reports and suggestions
-for improvements can be sendt to me at <gbarr@pobox.com>. 
+for improvements can be sent to me at <gbarr@pobox.com>. 
 
 Most of the modules in this library have an option to output a debug
 transcript to STDERR. When reporting bugs/problems please, if possible,
@@ -92,7 +97,7 @@ include a transcript of a run.
 
 COPYRIGHT
 
-  © 1996-98 Graham Barr. All rights reserved.
+  © 1996-2000 Graham Barr. All rights reserved.
 
 This library is free software; you can redistribute it and/or modify
 it under the same terms as Perl itself.
index 8202d48..a2f2d2e 100644 (file)
@@ -16,7 +16,7 @@ use IO::Socket;
 use Net::Cmd;
 use Net::Config;
 
-$VERSION = "2.15"; # $Id$
+$VERSION = "2.16"; # $Id: //depot/libnet/Net/SMTP.pm#16 $
 
 @ISA = qw(Net::Cmd IO::Socket::INET);
 
@@ -109,7 +109,7 @@ sub hello
    my $h = ${*$me}{'net_smtp_esmtp'} = {};
    my $ln;
    foreach $ln (@msg) {
-     $h->{$1} = $2
+     $h->{uc $1} = $2
        if $ln =~ /(\S+)\b[ \t]*([^\n]*)/;
     }
   }
@@ -308,7 +308,11 @@ sub recipient
  return $skip_bad ? @ok : 1;
 }
 
-sub to { shift->recipient(@_) }
+BEGIN {
+  *to  = \&recipient;
+  *cc  = \&recipient;
+  *bcc = \&recipient;
+}
 
 sub data
 {
@@ -384,7 +388,7 @@ Net::SMTP - Simple Mail Transfer Protocol Client
 =head1 SYNOPSIS
 
     use Net::SMTP;
-    
+
     # Constructors
     $smtp = Net::SMTP->new('mailhost');
     $smtp = Net::SMTP->new('mailhost', Timeout => 60);
@@ -406,9 +410,9 @@ The Net::SMTP class is a subclass of Net::Cmd and IO::Socket::INET.
 This example prints the mail domain name of the SMTP server known as mailhost:
 
     #!/usr/local/bin/perl -w
-    
+
     use Net::SMTP;
-    
+
     $smtp = Net::SMTP->new('mailhost');
     print $smtp->domain,"\n";
     $smtp->quit;
@@ -417,20 +421,20 @@ This example sends a small message to the postmaster at the SMTP server
 known as mailhost:
 
     #!/usr/local/bin/perl -w
-    
+
     use Net::SMTP;
-    
+
     $smtp = Net::SMTP->new('mailhost');
-    
+
     $smtp->mail($ENV{USER});
     $smtp->to('postmaster');
-    
+
     $smtp->data();
     $smtp->datasend("To: postmaster\n");
     $smtp->datasend("\n");
     $smtp->datasend("A simple test message\n");
     $smtp->dataend();
-    
+
     $smtp->quit;
 
 =head1 CONSTRUCTOR
@@ -467,6 +471,8 @@ Example:
                            Debug   => 1,
                          );
 
+=back
+
 =head1 METHODS
 
 Unless otherwise stated all methods return either a I<true> or I<false>
@@ -544,9 +550,17 @@ If C<SkipBad> is true the C<recipient> will not return an error when a
 bad address is encountered and it will return an array of addresses
 that did succeed.
 
+  $smtp->recipient($recipient1,$recipient2);  # Good
+  $smtp->recipient($recipient1,$recipient2, { SkipBad => 1 });  # Good
+  $smtp->recipient("$recipient,$recipient2"); # BAD   
+
 =item to ( ADDRESS [, ADDRESS [...]] )
 
-A synonym for C<recipient>.
+=item cc ( ADDRESS [, ADDRESS [...]] )
+
+=item bcc ( ADDRESS [, ADDRESS [...]] )
+
+Synonyms for C<recipient>.
 
 =item data ( [ DATA ] )
 
@@ -593,4 +607,8 @@ Copyright (c) 1995-1997 Graham Barr. All rights reserved.
 This program is free software; you can redistribute it and/or modify
 it under the same terms as Perl itself.
 
+=for html <hr>
+
+I<$Id: //depot/libnet/Net/SMTP.pm#16 $>
+
 =cut
index 828babf..3fad07e 100644 (file)
@@ -17,7 +17,7 @@ use IO::Select;
 @ISA = qw(Exporter);
 @EXPORT_OK = qw(inet_time inet_daytime);
 
-$VERSION = "2.08";
+$VERSION = "2.09"; # $Id: //depot/libnet/Net/Time.pm#9 $
 
 $TIMEOUT = 120;
 
@@ -102,11 +102,11 @@ Net::Time - time and daytime network client interface
 =head1 SYNOPSIS
 
     use Net::Time qw(inet_time inet_daytime);
-    
+
     print inet_time();         # use default host from Net::Config
     print inet_time('localhost');
     print inet_time('localhost', 'tcp');
-    
+
     print inet_daytime();      # use default host from Net::Config
     print inet_daytime('localhost');
     print inet_daytime('localhost', 'tcp');
@@ -144,4 +144,8 @@ Copyright (c) 1995-1998 Graham Barr. All rights reserved.
 This program is free software; you can redistribute it and/or modify
 it under the same terms as Perl itself.
 
+=for html <hr>
+
+I<$Id: //depot/libnet/Net/Time.pm#9 $>
+
 =cut
diff --git a/lib/Net/demos/snpp b/lib/Net/demos/snpp
deleted file mode 100755 (executable)
index f046b58..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-#!/usr/local/bin/perl
-
-use blib;
-use Getopt::Long;
-use Net::SNPP;
-
-$opt_debug = undef;
-$opt_h = undef;
-$opt_p = undef;
-
-GetOptions(qw(debug h p));
-
-die "usage: $0 -h <host> -p <pagerid> <message>"
-       unless defined $opt_h && defined $opt_p && @ARGV;
-
-Net::SNPP->debug(1)
-       if $opt_debug;
-
-$snpp = Net::SNPP->new($opt_host);
-
-$snpp->pager_id($opt_p) || die $snpp->message;
-$snpp->content(join(" ",@ARGV)) || die $snpp->message;
-$snpp->send() || die $snpp->message;
-
-$snpp->quit;
-
-__END__
-
-or you could dp
-
-$snpp = Net::SNPP->new($opt_host);
-
-$snpp->send( Pager   => $opt_p,
-            Message => join(" ",@ARGV),
-            Alert   => 1,
-            Hold    => time + 3600
-          ) || die $snpp->message;
-
-$snpp->quit;
diff --git a/lib/Net/libnet.ppd b/lib/Net/libnet.ppd
deleted file mode 100644 (file)
index ed864bc..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-<SOFTPKG NAME="libnet" VERSION="1,06,0,0">
-       <TITLE>libnet</TITLE>
-       <ABSTRACT>Collection of Network protocol modules</ABSTRACT>
-       <AUTHOR>Graham Barr &lt;gbarr@pobox.com&gt;</AUTHOR>
-       <IMPLEMENTATION>
-               <DEPENDENCY NAME="IO-Socket" VERSION="1,05,0,0" />
-               <DEPENDENCY NAME="Socket" VERSION="1,3,0,0" />
-               <OS NAME="linux" />
-               <ARCHITECTURE NAME="i586-linux" />
-               <CODEBASE HREF="" />
-       </IMPLEMENTATION>
-</SOFTPKG>
index 1e5af56..d9dcfaa 100644 (file)
@@ -11,14 +11,11 @@ avaliable on the libnet web page at
 
     http://www.pobox.com/~gbarr/libnet/
 
-
-
 =head2 How to contribute to this document
 
 You may mail corrections, additions, and suggestions to me
 gbarr@pobox.com.
 
-
 =head1 Author and Copyright Information
 
 Copyright (c) 1997-1998 Graham Barr. All rights reserved.
@@ -35,8 +32,6 @@ in respect of this information or its use.
 
 =head1 Obtaining and installing libnet
 
-=over 4
-
 =head2 What is libnet ?
 
 libnet is a collection of perl5 modules which all related to network
@@ -71,18 +66,14 @@ The latest libnet release is always on CPAN, you will find it
 in 
 
  http://www.perl.com/CPAN/modules/by-module/Net/
+
 The latest release and information is also avaliable on the libnet web page
 at
 
  http://www.pobox.com/~gbarr/libnet/
 
-=back
-
 =head1 Using Net::FTP
 
-=over
-
 =head2 How do I download files from a FTP server ?
 
 An example taken from an article posted to comp.lang.perl.misc
@@ -222,7 +213,7 @@ some examples how you can implement these yourself.
 
 sub mput {
   my($ftp,$pattern) = @_;
-  foreach my $file (<$pattern>) {
+  foreach my $file (glob($pattern)) {
     $ftp->put($file) or warn $ftp->message;
   }
 }
@@ -235,12 +226,8 @@ sub mget {
 }
 
 
-=back
-
 =head1 Using Net::SMTP
 
-=over
-
 =head2 Why can't the part of an Email address after the @ be used as the hostname ?
 
 The part of an Email address which follows the @ is not necessarily a hostname,
@@ -264,12 +251,8 @@ will suceed with something like
 This command will only fail if you pass it an address in a domain the
 the server directly delivers for, and that address does not exist.
 
-=back
-
 =head1 Debugging scripts
 
-=over
-
 =head2 How can I debug my scripts that use Net::* modules ?
 
 Most of the libnet client classes allow options to be passed to the
@@ -280,9 +263,9 @@ are being sent to the remote server and what responces are being
 received back.
 
     #!/your/path/to/perl
-    
+
     use Net::FTP;
-    
+
     my $ftp = new Net::FTP($host, Debug => 1);
     $ftp->login('gbarr','password');
     $ftp->quit;
@@ -313,9 +296,12 @@ show data coming from the server or C<&gt&gt&gt&gt> to show data
 going to the server. The remainder of the line is the command
 being sent or responce being received.
 
-=back
-
 =head1 AUTHOR AND COPYRIGHT
 
 Copyright (c) 1997 Graham Barr.
 All rights reserved.
+
+=for html <hr>
+
+I<$Id: //depot/libnet/Net/libnetFAQ.pod#4 $>
+
index f91d76a..46304db 100644 (file)
@@ -11,7 +11,7 @@ unless(defined($NetConfig{ftp_testhost}) && $NetConfig{test_hosts}) {
 my $t = 1;
 print "1..7\n";
 
-$ftp = Net::FTP->new($NetConfig{ftp_testhost}, Debug => 0)
+$ftp = Net::FTP->new($NetConfig{ftp_testhost})
        or (print("not ok 1\n"), exit);
 
 printf "ok %d\n",$t++;
@@ -46,10 +46,10 @@ if ($data = $ftp->stor('libnet.tst')) {
   
 }
 else {
-  print STDERR $ftp->message,"\n";
-  printf "not ok %d\n",$t++;
-  printf "not ok %d\n",$t++;
-  printf "not ok %d\n",$t++;
+  print "# ",$ftp->message,"\n";
+  printf "ok %d\n",$t++;
+  printf "ok %d\n",$t++;
+  printf "ok %d\n",$t++;
 }
 
 $ftp->quit  or do {
diff --git a/lib/Unicode/Collate.pm b/lib/Unicode/Collate.pm
new file mode 100644 (file)
index 0000000..91a9574
--- /dev/null
@@ -0,0 +1,646 @@
+package Unicode::Collate;
+
+use 5.006;
+use strict;
+use warnings;
+use Carp;
+use Lingua::KO::Hangul::Util;
+require Exporter;
+
+our $VERSION = '0.07';
+our $PACKAGE = __PACKAGE__;
+
+our @ISA = qw(Exporter);
+
+our %EXPORT_TAGS = ();
+our @EXPORT_OK = ();
+our @EXPORT = ();
+
+(our $Path = $INC{'Unicode/Collate.pm'}) =~ s/\.pm$//;
+our $KeyFile = "allkeys.txt";
+
+our %Combin; # 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
+
+##
+## constructor
+##
+sub new
+{
+  my $class = shift;
+  my $self = bless { @_ }, $class;
+
+  # alternate
+  $self->{alternate} = 
+     ! exists  $self->{alternate} ? 'shifted' :
+     ! defined $self->{alternate} ? '' : $self->{alternate};
+
+  # collation level
+  $self->{level} ||= $self->{alternate} =~ /shift/ ? 4 : 3;
+
+  # normalization form
+  $self->{normalization} = 'D' if ! exists $self->{normalization};
+
+  eval "use Unicode::Normalize;" if defined $self->{normalization};
+
+  $self->{normalize} = 
+    ! defined $self->{normalization}        ? undef :
+    $self->{normalization} =~ /^(?:NF)?C$/  ? \&NFC :
+    $self->{normalization} =~ /^(?:NF)?D$/  ? \&NFD :
+    $self->{normalization} =~ /^(?:NF)?KC$/ ? \&NFKC :
+    $self->{normalization} =~ /^(?:NF)?KD$/ ? \&NFKD :
+    croak "$PACKAGE unknown normalization form name: $self->{normalization}";
+
+  *Combin = \%Unicode::Normalize::Combin if $self->{normalize} && ! %Combin;
+
+  # backwards
+  $self->{backwards} ||= [];
+  $self->{backwards} = [ $self->{backwards} ] if ! ref $self->{backwards};
+
+  # rearrange
+  $self->{rearrange} ||= []; # maybe not U+0000 (an ASCII)
+  $self->{rearrange} = [ $self->{rearrange} ] if ! ref $self->{rearrange};
+
+  # open the table file
+  my $file = defined $self->{table} ? $self->{table} : $KeyFile;
+  open my $fk, "<$Path/$file" or croak "File does not exist at $Path/$file";
+
+  while(<$fk>){
+    next if /^\s*#/;
+    if(/^\s*\@/){
+       if(/^\@version\s*(\S*)/){
+         $self->{version} ||= $1;
+       }
+       elsif(/^\@alternate\s+(.*)/){
+         $self->{alternate} ||= $1;
+       }
+       elsif(/^\@backwards\s+(.*)/){
+         push @{ $self->{backwards} }, $1;
+       }
+       elsif(/^\@rearrange\s+(.*)/){
+         push @{ $self->{rearrange} }, _getHexArray($1);
+       }
+       next;
+    }
+    $self->parseEntry($_);
+  }
+  close $fk;
+  if($self->{entry}){
+    $self->parseEntry($_) foreach split /\n/, $self->{entry};
+  }
+
+  # keys of $self->{rearrangeHash} are $self->{rearrange}.
+  $self->{rearrangeHash} = {};
+  @{ $self->{rearrangeHash} }{ @{ $self->{rearrange} } } = ();
+
+  return $self;
+}
+
+##
+## get $line, parse it, and write an entry in $self
+##
+sub parseEntry
+{
+  my $self = shift;
+  my $line = shift;
+  my($name, $ele, @key);
+
+  return if $line !~ /^\s*[0-9A-Fa-f]/;
+
+  # get name
+  $name = $1 if $line =~ s/#\s*(.*)//;
+  return if defined $self->{undefName} && $name =~ /$self->{undefName}/;
+
+  # get element
+  my($e, $k) = split /;/, $line;
+  my @e = _getHexArray($e);
+  $ele = pack('U*', @e);
+  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->{ignored}{$ele} = 1;
+     $self->{entries}{$ele} = 1; # true
+  }
+  else
+  {
+    foreach my $arr ($k =~ /\[(\S+)\]/g) {
+      my $var = $arr =~ /\*/;
+      push @key, $self->getCE( $var, _getHexArray($arr) );
+    }
+    $self->{entries}{$ele} = \@key;
+  }
+  $self->{maxlength}{ord $ele} = scalar @e if @e > 1;
+}
+
+
+##
+## list to collation element
+##
+sub getCE
+{
+  my $self = shift;
+  my $var  = shift;
+  my @c    = @_;
+
+  $self->{alternate} eq 'blanked' ?
+     $var ? [0,0,0] : [ @c[0..2] ] :
+  $self->{alternate} eq 'non-ignorable' ? [ @c[0..2] ] :
+  $self->{alternate} eq 'shifted' ?
+    $var ? [0,0,0,$c[0] ] : [ @c[0..2], $c[0]+$c[1]+$c[2] ? 0xFFFF : 0 ] :
+  $self->{alternate} eq 'shift-trimmed' ?
+    $var ? [0,0,0,$c[0] ] : [ @c[0..2], 0 ] :
+   \@c;
+}
+
+##
+## to debug
+##
+sub viewSortKey
+{
+  my $self = shift;
+  my $key  = $self->getSortKey(@_);
+  my $view = join " ", map sprintf("%04X", $_), unpack 'n*', $key;
+  $view =~ s/ ?0000 ?/|/g;
+  "[$view]";
+}
+
+##
+## sort key
+##
+sub getSortKey
+{
+  my $self = shift;
+  my $code = $self->{preprocess};
+  my $norm = $self->{normalize};
+  my $ent  = $self->{entries};
+  my $ign  = $self->{ignored};
+  my $max  = $self->{maxlength};
+  my $lev  = $self->{level};
+  my $cjk  = $self->{overrideCJK};
+  my $hang = $self->{overrideHangul};
+  my $rear = $self->{rearrangeHash};
+
+  my $str = ref $code ? &$code(shift) : shift;
+  $str = &$norm($str) if ref $norm;
+
+  my(@src, @buf);
+  @src = unpack('U*', $str);
+
+  # rearrangement
+  for(my $i = 0; $i < @src; $i++)
+  {
+     ($src[$i], $src[$i+1]) = ($src[$i+1], $src[$i])
+        if $rear->{ $src[$i] };
+     $i++;
+  }
+
+  for(my $i = 0; $i < @src; $i++)
+  {
+    my $ch;
+    my $u  = $src[$i];
+
+  # non-characters
+    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};
+      }
+    }
+    else {  $ch = pack('U', $u) }
+
+    if(%Combin && defined $ch) # with Combining Char
+    {
+      for(my $j = $i+1; $j < @src && $Combin{ $src[$j] }; $j++)
+      {
+        my $comb = pack 'U', $src[$j];
+        next if ! $ent->{ $ch.$comb };
+        $ch .= $comb;
+        splice(@src, $j, 1);
+        last;
+      }
+    }
+
+    next if !defined $ch || $ign->{$ch};   # ignored
+
+    push @buf,
+      $ent->{$ch}
+        ? @{ $ent->{$ch} }
+        : _isHangul($u)
+          ? $hang
+            ? &$hang($u)
+            : map(@{ $ent->{pack('U', $_)} }, decomposeHangul($u))
+          : _isCJK($u)
+            ? $cjk ? &$cjk($u) : map($self->getCE(0,@$_), _CJK($u))
+            : map($self->getCE(0,@$_), _derivCE($u));
+  }
+
+  # make sort key
+  my @ret = ([],[],[],[]);
+  foreach my $v (0..$lev-1){
+    foreach my $b (@buf){
+      push @{ $ret[$v] }, $b->[$v] if $b->[$v];
+    }
+  }
+  foreach (@{ $self->{backwards} }){
+    my $v = $_ - 1;
+    @{ $ret[$v] } = reverse @{ $ret[$v] };
+  }
+
+  # modification of tertiary weights
+  if($self->{upper_before_lower}){
+    foreach (@{ $ret[2] }){
+      if   (0x8 <= $_ && $_ <= 0xC){ $_ -= 6 } # lower
+      elsif(0x2 <= $_ && $_ <= 0x6){ $_ += 6 } # upper
+      elsif($_ == 0x1C)            { $_ += 1 } # square upper
+      elsif($_ == 0x1D)            { $_ -= 1 } # square lower
+    }
+  }
+  if($self->{katakana_before_hiragana}){
+    foreach (@{ $ret[2] }){
+      if   (0x0F <= $_ && $_ <= 0x13){ $_ -= 2 } # katakana
+      elsif(0x0D <= $_ && $_ <= 0x0E){ $_ += 5 } # hiragana
+    }
+  }
+  join "\0\0", map pack('n*', @$_), @ret;
+}
+
+
+##
+## cmp
+##
+sub cmp
+{
+  my $obj = shift;
+  my $a   = shift;
+  my $b   = shift;
+  $obj->getSortKey($a) cmp $obj->getSortKey($b);
+}
+
+##
+## sort
+##
+sub sort
+{
+  my $obj = shift;
+
+  map { $_->[1] }
+  sort{ $a->[0] cmp $b->[0] }
+  map [ $obj->getSortKey($_), $_ ], @_;
+}
+
+##
+## Derived CE
+##
+sub _derivCE
+{
+  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];
+}
+
+##
+## "hhhh hhhh hhhh" to (dddd, dddd, dddd)
+##
+sub _getHexArray
+{
+  my $str = shift;
+  map hex(), $str =~ /([0-9a-fA-F]+)/g;
+}
+
+##
+##  CJK Unified Ideographs
+##
+sub _isCJK
+{
+  my $u = shift;
+  return 0x3400 <= $u && $u <= 0x4DB5  
+      || 0x4E00 <= $u && $u <= 0x9FA5  
+#      || 0x20000 <= $u && $u <= 0x2A6D6;
+}
+
+##
+##  CJK Unified Ideographs
+##
+sub _CJK
+{
+  my $u = shift;
+  $u > 0xFFFF ? _derivCE($u) : [$u,0x20,0x02,$u];
+}
+
+##
+## Hangul Syllables
+##
+sub _isHangul
+{
+  my $code = shift;
+  return 0xAC00 <= $code && $code <= 0xD7A3;
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Unicode::Collate - use UCA (Unicode Collation Algorithm)
+
+=head1 SYNOPSIS
+
+  use Unicode::Collate;
+
+  #construct
+  $UCA = Unicode::Collate->new(%tailoring);
+
+  #sort
+  @sorted = $UCA->sort(@not_sorted);
+
+  #compare
+  $result = $UCA->cmp($a, $b); # returns 1, 0, or -1. 
+
+=head1 DESCRIPTION
+
+=head2 Constructor and Tailoring
+
+   $UCA = Unicode::Collate->new(
+      alternate => $alternate,
+      backwards => $levelNumber, # or \@levelNumbers
+      entry => $element,
+      normalization  => $normalization_form,
+      ignoreName => qr/$ignoreName/,
+      ignoreChar => qr/$ignoreChar/,
+      katakana_before_hiragana => $bool,
+      level => $collationLevel,
+      overrideCJK => \&overrideCJK,
+      overrideHangul => \&overrideHangul,
+      preprocess => \&preprocess,
+      rearrange => \@charList,
+      table => $filename,
+      undefName => qr/$undefName/,
+      undefChar => qr/$undefChar/,
+      upper_before_lower => $bool,
+   );
+   # if %tailoring is false (empty),
+   # $UCA should do the default collation.
+
+=over 4
+
+=item alternate
+
+-- see 3.2.2 Alternate Weighting, UTR #10.
+
+   alternate => 'shifted', 'blanked', 'non-ignorable', or 'shift-trimmed'.
+
+By default (if specification is omitted), 'shifted' is adopted.
+
+=item backwards
+
+-- see 3.1.2 French Accents, UTR #10.
+
+     backwards => $levelNumber or \@levelNumbers
+
+Weights in reverse order; ex. level 2 (diacritic ordering) in French.
+If omitted, forwards at all the levels.
+
+=item entry
+
+-- see 3.1 Linguistic Features; 3.2.1 File Format, UTR #10.
+
+Overrides a default order or adds a new element
+
+  entry => <<'ENTRIES', # use the UCA file format
+00E6 ; [.0861.0020.0002.00E6] [.08B1.0020.0002.00E6] # ligature <ae> as <a e>
+0063 0068 ; [.0893.0020.0002.0063]      # "ch" in traditional Spanish
+0043 0068 ; [.0893.0020.0008.0043]      # "Ch" in traditional Spanish
+ENTRIES
+
+=item ignoreName
+
+=item ignoreChar
+
+-- see Completely Ignorable, 3.2.2 Alternate Weighting, UTR #10.
+
+Ignores the entry in the table.
+If an ignored collation element appears in the string to be collated,
+it is ignored as if the element had been deleted from there.
+
+E.g. when 'a' and 'e' are ignored,
+'element' is equal to 'lament' (or 'lmnt').
+
+=item level
+
+-- see 4.3 Form a sort key for each string, UTR #10.
+
+Set the maximum level.
+Any higher levels than the specified one are ignored.
+
+  Level 1: alphabetic ordering
+  Level 2: diacritic ordering
+  Level 3: case ordering
+  Level 4: tie-breaking (e.g. in the case when alternate is 'shifted')
+
+  ex.level => 2,
+
+=item normalization
+
+-- see 4.1 Normalize each input string, UTR #10.
+
+If specified, strings are normalized before preparation sort keys
+(the normalization is executed after preprocess).
+
+As a form name, one of the following names must be used.
+
+  'C'  or 'NFC'  for Normalization Form C
+  'D'  or 'NFD'  for Normalization Form D
+  'KC' or 'NFKC' for Normalization Form KC
+  'KD' or 'NFKD' for Normalization Form KD
+
+If omitted, the string is put into Normalization Form D.
+
+If undefined explicitly (as C<normalization =E<gt> undef>),
+any normalization is not carried out (this may make tailoring easier
+if any normalization is not desired).
+
+see B<CAVEAT>.
+
+=item overrideCJK
+
+=item overrideHangul
+
+-- see 7.1 Derived Collation Elements, UTR #10.
+
+By default, mapping of CJK Unified Ideographs
+uses the Unicode codepoint order
+and Hangul Syllables are decomposed into Hangul Jamo.
+
+The mapping of CJK Unified Ideographs
+or Hangul Syllables may be overrided.
+
+ex. CJK Unified Ideographs in the JIS codepoint order.
+
+  overrideCJK => sub {
+    my $u = shift;               # get unicode codepoint
+    my $b = pack('n', $u);       # to UTF-16BE
+    my $s = your_unicode_to_sjis_converter($b); # convert
+    my $n = unpack('n', $s);     # convert sjis to short
+    [ $n, 1, 1 ];                # return collation element
+  },
+
+If you want to override the mapping of Hangul Syllables,
+the Normalization Forms D and KD are not appropriate
+(they will be decomposed before overriding).
+
+=item preprocess
+
+-- see 5.1 Preprocessing, UTR #10.
+
+If specified, the coderef is used to preprocess
+before the formation of sort keys.
+
+ex. dropping English articles, such as "a" or "the". 
+Then, "the pen" is before "a pencil".
+
+     preprocess => sub {
+           my $str = shift;
+           $str =~ s/\b(?:an?|the)\s+//g;
+           $str;
+        },
+
+=item rearrange
+
+-- see 3.1.3 Rearrangement, UTR #10.
+
+Characters that are not coded in logical order and to be rearranged.
+By default, 
+
+    rearrange => [ 0x0E40..0x0E44, 0x0EC0..0x0EC4 ],
+
+=item table
+
+-- see 3.2 Default Unicode Collation Element Table, UTR #10.
+
+You can use another element table if desired.
+The table file must be in your C<lib/Unicode/Collate> directory.
+
+By default, the file C<lib/Unicode/Collate/allkeys.txt> is used.
+
+=item undefName
+
+=item undefChar
+
+-- see 6.3.4 Reducing the Repertoire, UTR #10.
+
+Undefines the collation element as if it were unassigned in the table.
+This reduces the size of the table.
+If an unassigned character appears in the string to be collated,
+the sort key is made from its codepoint
+as a single-character collation element,
+as it is greater than any other assigned collation elements
+(in the codepoint order among the unassigned characters).
+But, it'd be better to ignore characters
+unfamiliar to you and maybe never used.
+
+=item katakana_before_hiragana
+
+=item upper_before_lower
+
+-- see 6.6 Case Comparisons; 7.3.1 Tertiary Weight Table, UTR #10.
+
+By default, lowercase is before uppercase
+and hiragana is before katakana.
+
+If the parameter is true, this is reversed.
+
+=back
+
+=head2 Other methods
+
+=over 4
+
+=item C<@sorted = $UCA-E<gt>sort(@not_sorted)>
+
+Sorts a list of strings.
+
+=item C<$result = $UCA-E<gt>cmp($a, $b)>
+
+Returns 1 (when C<$a> is greater than C<$b>)
+or 0 (when C<$a> is equal to C<$b>)
+or -1 (when C<$a> is lesser than C<$b>).
+
+=item C<$sortKey = $UCA-E<gt>getSortKey($string)>
+
+-- see 4.3 Form a sort key for each string, UTR #10.
+
+Returns a sort key.
+
+You compare the sort keys using a binary comparison
+and get the result of the comparison of the strings using UCA.
+
+   $UCA->getSortKey($a) cmp $UCA->getSortKey($b)
+
+      is equivalent to
+
+   $UCA->cmp($a, $b)
+
+=back
+
+=head2 EXPORT
+
+None by default.
+
+=head2 CAVEAT
+
+Use of the C<normalization> parameter requires
+the B<Unicode::Normalize> module.
+
+If you need not it (e.g. in the case when you need not
+handle any combining characters),
+assign C<normalization =E<gt> undef> explicitly.
+
+=head1 AUTHOR
+
+SADAHIRO Tomoyuki, E<lt>SADAHIRO@cpan.orgE<gt>
+
+  http://homepage1.nifty.com/nomenclator/perl/
+
+  Copyright(C) 2001, SADAHIRO Tomoyuki. Japan. All rights reserved.
+
+  This program is free software; you can redistribute it and/or 
+  modify it under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+=over 4
+
+=item L<Lingua::KO::Hangul::Util>
+
+utility functions for Hangul Syllables
+
+=item L<Unicode::Normalize>
+
+normalized forms of Unicode text
+
+=item Unicode Collation Algorithm - Unicode TR #10
+
+http://www.unicode.org/unicode/reports/tr10/
+
+=back
+
+=cut
diff --git a/lib/Unicode/Collate/Changes b/lib/Unicode/Collate/Changes
new file mode 100644 (file)
index 0000000..57e56b2
--- /dev/null
@@ -0,0 +1,26 @@
+Revision history for Perl extension Unicode::Collate.
+
+0.07  Thu Aug 16 23:42:02 2001
+    - rename the module name to Unicode::Collate.
+
+0.06  Thu Aug 16 23:18:36 2001
+    - add description of the getSortKey method.
+
+0.05  Mon Aug 13 22:23:11 2001
+    - bug fix: on the things of 4.2.1, UTR #10
+    - getSortKey returns a string, but not an arrayref.
+
+0.04  Mon Aug 13 22:23:11 2001
+    - some bugs are fixed.
+    - some tailoring parameters are added.
+
+0.03  Mon Aug 06 06:26:35 2001
+    - modify README
+
+0.02  Sun Aug 05 20:20:01 2001
+    - some fix
+
+0.01  Sun Jul 29 16:16:15 2001
+    - original version; created by h2xs 1.21
+      with options -A -X -n Sort::UCA
+
diff --git a/lib/Unicode/Collate/README b/lib/Unicode/Collate/README
new file mode 100644 (file)
index 0000000..bf0efff
--- /dev/null
@@ -0,0 +1,60 @@
+Unicode/Collate version 0.07
+===============================
+
+use UCA (Unicode Collation Algorithm)
+
+  See UCA - Unicode TR #10.
+  http://www.unicode.org/unicode/reports/tr10/
+
+  Fetch the following file before use and put it into the Unicode/Collate dir.
+  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".
+
+SYNOPSIS
+
+  use Unicode::Collate;
+
+  #construct
+  $UCA = Unicode::Collate->new(%tailoring);
+
+  #sort
+  @sorted = $UCA->sort(@not_sorted);
+
+  #compare
+  $result = $UCA->cmp($a, $b); # returns 1, 0, or -1.
+
+INSTALLATION
+
+Perl 5.006 or later
+
+To install this module type the following:
+
+   perl Makefile.PL
+   make
+   make test
+   make install
+
+DEPENDENCIES
+
+This module requires these other modules and libraries:
+
+Carp
+Exporter
+Lingua::KO::Hangul::Util
+
+It's better if Unicode::Normalize has been installed
+although Unicode::Collate can be used without Unicode::Normalize.
+
+COPYRIGHT AND LICENCE
+
+SADAHIRO Tomoyuki <bqw10602@nifty.com>
+
+  http://homepage1.nifty.com/nomenclator/perl/
+
+  Copyright(C) 2001, SADAHIRO Tomoyuki. Japan. All rights reserved.
+
+  This program is free software; you can redistribute it and/or 
+  modify it under the same terms as Perl itself.
+
diff --git a/lib/Unicode/Collate/keys.txt b/lib/Unicode/Collate/keys.txt
new file mode 100644 (file)
index 0000000..22ce673
--- /dev/null
@@ -0,0 +1,1930 @@
+#### This file is generated from allkeys-3.0.1d9.txt (unicode.org)
+#### by deleting mamy many elements.
+####
+#### Remaining elements include LATIN, HANGUL, HIRAGANA, KATAKANA,
+#### BOPOMOFO, CJK UNIFIED IDEOGRAPHS.
+####
+#### To fetch the original file, access to:
+#### http://www.unicode.org/unicode/reports/tr10/allkeys.txt
+####
+# 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
diff --git a/lib/Unicode/Collate/t/test.t b/lib/Unicode/Collate/t/test.t
new file mode 100644 (file)
index 0000000..be4cc4a
--- /dev/null
@@ -0,0 +1,115 @@
+# Before `make install' is performed this script should be runnable with
+# `make test'. After `make install' it should work as `perl test.pl'
+
+#########################
+
+use Test;
+BEGIN { plan tests => 20 };
+use Unicode::Collate;
+ok(1); # If we made it this far, we're ok.
+
+#########################
+
+my $UCA = Unicode::Collate->new(
+  table => 'keys.txt',
+  normalization => undef,
+);
+
+ok(ref $UCA, "Unicode::Collate");
+
+ok(
+  join(':', $UCA->sort( 
+    qw/ lib strict Carp ExtUtils CGI Time warnings Math overload Pod CPAN /
+  ) ),
+  join(':',
+    qw/ Carp CGI CPAN ExtUtils lib Math overload Pod strict Time warnings /
+  ),
+);
+
+my $A_acute = pack('U', 0x00C1);
+my $acute   = pack('U', 0x0301);
+
+ok($UCA->cmp("A$acute", $A_acute), -1);
+
+ok($UCA->cmp("", ""), 0);
+ok($UCA->cmp("", "perl"), -1);
+
+eval "use Unicode::Normalize";
+
+if(!$@){
+  my $NFD = Unicode::Collate->new(
+    table => 'keys.txt',
+  );
+  ok($NFD->cmp("A$acute", $A_acute), 0);
+}
+else{
+  ok(1,1);
+}
+
+my $tr = Unicode::Collate->new(
+  table => 'keys.txt',
+  normalization => undef,
+  ignoreName => qr/^(?:HANGUL|HIRAGANA|KATAKANA|BOPOMOFO)$/,
+  entry => <<'ENTRIES',
+0063 0068 ; [.0893.0020.0002.0063]  # "ch" in traditional Spanish
+0043 0068 ; [.0893.0020.0008.0043]  # "Ch" in traditional Spanish
+ENTRIES
+);
+
+ok(
+  join(':', $tr->sort( 
+    qw/ acha aca ada acia acka /
+  ) ),
+  join(':',
+    qw/ aca acia acka acha ada /
+  ),
+);
+
+ok(
+  join(':', $UCA->sort( 
+    qw/ acha aca ada acia acka /
+  ) ),
+  join(':',
+    qw/ aca acha acia acka ada /
+  ),
+);
+
+my $old_level = $UCA->{level};
+my $hiragana = "\x{3042}\x{3044}";
+my $katakana = "\x{30A2}\x{30A4}";
+
+$UCA->{level} = 2;
+
+ok( $UCA->cmp("ABC","abc"), 0);
+ok( $UCA->cmp($hiragana, $katakana), 0);
+
+$UCA->{level} = $old_level;
+
+$UCA->{katakana_before_hiragana} = 1;
+
+ok( $UCA->cmp("abc", "ABC"), -1);
+ok( $UCA->cmp($hiragana, $katakana), 1);
+
+$UCA->{upper_before_lower} = 1;
+
+ok( $UCA->cmp("abc", "ABC"), 1);
+ok( $UCA->cmp($hiragana, $katakana), 1);
+
+$UCA->{katakana_before_hiragana} = 0;
+
+ok( $UCA->cmp("abc", "ABC"), 1);
+ok( $UCA->cmp($hiragana, $katakana), -1);
+
+$UCA->{upper_before_lower} = 0;
+
+ok( $UCA->cmp("abc", "ABC"), -1);
+ok( $UCA->cmp($hiragana, $katakana), -1);
+
+my $ign = Unicode::Collate->new(
+  table => 'keys.txt',
+  normalization => undef,
+  ignoreChar => qr/^[ae]$/,
+);
+
+ok( $ign->cmp("element","lament"), 0);
+
diff --git a/lib/Unicode/Normalize.pm b/lib/Unicode/Normalize.pm
new file mode 100644 (file)
index 0000000..79939b1
--- /dev/null
@@ -0,0 +1,314 @@
+package Unicode::Normalize;
+
+use 5.006;
+use strict;
+use warnings;
+use Carp;
+use Lingua::KO::Hangul::Util;
+
+our $VERSION = '0.04';
+our $PACKAGE = __PACKAGE__;
+
+require Exporter;
+our @ISA = qw(Exporter);
+our @EXPORT = qw( NFC NFD NFKC NFKD );
+our @EXPORT_OK = qw( normalize );
+our %EXPORT_TAGS = ( all => [ @EXPORT, @EXPORT_OK ] );
+
+our $Combin = do "unicore/CombiningClass.pl"
+           || do "unicode/CombiningClass.pl"
+           || croak "$PACKAGE: CombiningClass.pl not found";
+
+our $Decomp = do "unicore/Decomposition.pl"
+           || do "unicode/Decomposition.pl"
+           || croak "$PACKAGE: Decomposition.pl not found";
+
+our %Combin; # $codepoint => $number      : combination class
+our %Canon;  # $codepoint => \@codepoints : canonical decomp.
+our %Compat; # $codepoint => \@codepoints : compat. decomp.
+our %Compos; # $string    => $codepoint   : composite
+our %Exclus; # $codepoint => 1            : composition exclusions
+
+{
+  my($f, $fh);
+  foreach my $d (@INC) {
+    use File::Spec;
+    $f = File::Spec->catfile($d, "unicore", "CompExcl.txt");
+    last if open($fh, $f);
+    $f = File::Spec->catfile($d, "unicode", "CompExcl.txt");
+    last if open($fh, $f);
+    $f = undef;
+  }
+  croak "$PACKAGE: CompExcl.txt not found in @INC" unless defined $f;
+  while(<$fh>){
+    next if /^#/ or /^$/;
+    s/#.*//;
+    $Exclus{ hex($1) } =1 if /([0-9A-Fa-f]+)/;
+  }
+  close $fh;
+}
+
+while($Combin =~ /(.+)/g)
+{
+  my @tab = split /\t/, $1;
+  my $ini = hex $tab[0];
+  if($tab[1] eq '')
+  {
+    $Combin{ $ini } = $tab[2];
+  }
+  else
+  {
+    $Combin{ $_ } = $tab[2] foreach $ini .. hex($tab[1]);
+  }
+}
+
+while($Decomp =~ /(.+)/g)
+{
+  my @tab = split /\t/, $1;
+  my $compat = $tab[2] =~ s/<[^>]+>//;
+  my $dec = [ _getHexArray($tab[2]) ]; # decomposition
+  my $com = pack('U*', @$dec); # composable sequence
+  my $ini = hex($tab[0]);
+  if($tab[1] eq '')
+  {
+    $Compat{ $ini } = $dec;
+    if(! $compat){
+      $Canon{  $ini } = $dec;
+      $Compos{ $com } = $ini;
+    }
+  }
+  else
+  {
+    foreach my $u ($ini .. hex($tab[1])){
+      $Compat{ $u } = $dec;
+      if(! $compat){
+        $Canon{  $u }   = $dec;
+        $Compos{ $com } = $ini;
+      }
+    }
+  }
+}
+
+foreach my $key (keys %Canon)  # exhaustive decomposition
+{
+   $Canon{$key}  = [ getCanonList($key) ];
+}
+
+foreach my $key (keys %Compat) # exhaustive decomposition
+{
+   $Compat{$key} = [ getCompatList($key) ];
+}
+
+sub getCanonList
+{
+  my @src = @_;
+  my @dec = map $Canon{$_} ? @{ $Canon{$_} } : $_, @src;
+  join(" ",@src) eq join(" ",@dec) ? @dec : getCanonList(@dec);
+  # condition @src == @dec is not ok.
+}
+
+sub getCompatList
+{
+  my @src = @_;
+  my @dec = map $Compat{$_} ? @{ $Compat{$_} } : $_, @src;
+  join(" ",@src) eq join(" ",@dec) ? @dec : getCompatList(@dec);
+  # condition @src == @dec is not ok.
+}
+
+sub NFD($){ _decompose(shift, 0) }
+
+sub NFKD($){ _decompose(shift, 1) }
+
+sub NFC($){ _compose(NFD(shift)) }
+
+sub NFKC($){ _compose(NFKD(shift)) }
+
+sub normalize($$)
+{
+  my($form,$str) = @_;
+  $form eq 'D'  || $form eq 'NFD'  ? NFD($str) :
+  $form eq 'C'  || $form eq 'NFC'  ? NFC($str) :
+  $form eq 'KD' || $form eq 'NFKD' ? NFKD($str) :
+  $form eq 'KC' || $form eq 'NFKC' ? NFKC($str) :
+    croak $PACKAGE."::normalize: invalid form name: $form";
+}
+
+
+##
+## string _decompose(string, compat?)
+##
+sub _decompose
+{
+  my $str  = $_[0];
+  my $hash = $_[1] ? \%Compat : \%Canon;
+  my @ret;
+  my $retstr="";
+  foreach my $u (unpack 'U*', $str){
+    push @ret,
+      $hash->{ $u }  ? @{ $hash->{ $u } } :
+      _isHangul($u) ? decomposeHangul($u) : $u;
+  }
+  for(my $i=0; $i<@ret;){
+    $retstr .= pack('U', $ret[$i++]), next
+       unless $Combin{ $ret[$i] } && $i+1 < @ret && $Combin{ $ret[$i+1] };
+    my @tmp;
+    push(@tmp, $ret[$i++]) while $i < @ret && $Combin{ $ret[$i] };
+    $retstr .= pack 'U*', @tmp[
+      sort {
+        $Combin{ $tmp[$a] } <=> $Combin{ $tmp[$b] } || $a <=> $b
+      } 0 .. @tmp - 1,
+    ];
+  }
+  $retstr;
+}
+
+##
+## string _compose(string)
+##
+## S : starter; NS : not starter;
+##
+## composable sequence begins at S.
+## S + S or (S + S) + S may be composed.
+## NS + NS must not be composed.
+##
+sub _compose
+{
+  my @src = unpack('U*', composeHangul shift); # get codepoints
+  for(my $s = 0; $s+1 < @src; $s++){
+    next unless defined $src[$s] && ! $Combin{ $src[$s] }; # S only
+    my($c, $blocked);
+    for(my $j = $s+1; $j < @src && !$blocked; $j++){
+      $blocked = 1 if ! $Combin{ $src[$j] };
+
+      next if $j != $s + 1 && defined $src[$j-1]
+        && $Combin{ $src[$j-1] } && $Combin{ $src[$j] } 
+        && $Combin{ $src[$j-1] } == $Combin{ $src[$j] };
+
+      if(  # $c != 0, maybe.
+        $c = $Compos{pack('U*', @src[$s,$j])} and ! $Exclus{$c}
+      )
+      {
+        $src[$s] = $c; $src[$j] = undef; $blocked = 0;
+      }
+    }
+  }
+  pack 'U*', grep defined(), @src;
+}
+
+##
+## "hhhh hhhh hhhh" to (dddd, dddd, dddd)
+##
+sub _getHexArray
+{
+  my $str = shift;
+  map hex(), $str =~ /([0-9A-Fa-f]+)/g;
+}
+
+##
+## Hangul Syllables
+##
+sub _isHangul
+{
+  my $code = shift;
+  return 0xAC00 <= $code && $code <= 0xD7A3;
+}
+
+##
+## for Debug
+##
+sub _getCombin { wantarray ? %Combin : \%Combin }
+sub _getCanon  { wantarray ? %Canon  : \%Canon  }
+sub _getCompat { wantarray ? %Compat : \%Compat }
+sub _getCompos { wantarray ? %Compos : \%Compos }
+sub _getExclus { wantarray ? %Exclus : \%Exclus }
+1;
+__END__
+
+=head1 NAME
+
+Unicode::Normalize - normalized forms of Unicode text
+
+=head1 SYNOPSIS
+
+  use Unicode::Normalize;
+
+  $string_NFD  = NFD($raw_string);  # Normalization Form D
+  $string_NFC  = NFC($raw_string);  # Normalization Form C
+  $string_NFKD = NFKD($raw_string); # Normalization Form KD
+  $string_NFKC = NFKC($raw_string); # Normalization Form KC
+
+   or
+
+  use Unicode::Normalize 'normalize';
+
+  $string_NFD  = normalize('D',  $raw_string);  # Normalization Form D
+  $string_NFC  = normalize('C',  $raw_string);  # Normalization Form C
+  $string_NFKD = normalize('KD', $raw_string);  # Normalization Form KD
+  $string_NFKC = normalize('KC', $raw_string);  # Normalization Form KC
+
+=head1 DESCRIPTION
+
+=over 4
+
+=item C<$string_NFD = NFD($raw_string)>
+
+returns the Normalization Form D (formed by canonical decomposition).
+
+
+=item C<$string_NFC = NFC($raw_string)>
+
+returns the Normalization Form C (formed by canonical decomposition
+followed by canonical composition).
+
+=item C<$string_NFKD = NFKD($raw_string)>
+
+returns the Normalization Form KD (formed by compatibility decomposition).
+
+=item C<$string_NFKC = NFKC($raw_string)>
+
+returns the Normalization Form KC (formed by compatibility decomposition
+followed by B<canonical> composition).
+
+=item C<$normalized_string = normalize($form_name, $raw_string)>
+
+As C<$form_name>, one of the following names must be given.
+
+  'C'  or 'NFC'  for Normalization Form C
+  'D'  or 'NFD'  for Normalization Form D
+  'KC' or 'NFKC' for Normalization Form KC
+  'KD' or 'NFKD' for Normalization Form KD
+
+=back
+
+=head2 EXPORT
+
+C<NFC>, C<NFD>, C<NFKC>, C<NFKD>: by default.
+
+C<normalize>: on request.
+
+=head1 AUTHOR
+
+SADAHIRO Tomoyuki, E<lt>SADAHIRO@cpan.orgE<gt>
+
+  http://homepage1.nifty.com/nomenclator/perl/
+
+  Copyright(C) 2001, SADAHIRO Tomoyuki. Japan. All rights reserved.
+
+  This program is free software; you can redistribute it and/or 
+  modify it under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+=over 4
+
+=item L<Lingua::KO::Hangul::Util>
+
+utility functions for Hangul Syllables
+
+=item http://www.unicode.org/unicode/reports/tr15/
+
+Unicode Normalization Forms - UAX #15
+
+=back
+
+=cut
diff --git a/lib/Unicode/Normalize/Changes b/lib/Unicode/Normalize/Changes
new file mode 100644 (file)
index 0000000..910016c
--- /dev/null
@@ -0,0 +1,16 @@
+Revision history for Perl extension Unicode::Normalize.
+
+0.04  Wed Aug 15 19:02:41 2001
+       - fix: NFD("") and NFKD("") must return "", not but undef.
+
+0.03  Fri Aug 10 22:44:18 2001
+       - rename the module name to Unicode::Normalize.
+       - normalize takes two arguments.
+
+0.02  Thu Aug  9 22:56:36 2001
+       - add function normalize
+
+0.01  Mon Aug  6 21:45:11 2001
+       - original version; created by h2xs 1.21 with options
+               -A -X -n Text::Unicode::Normalize
+
diff --git a/lib/Unicode/Normalize/README b/lib/Unicode/Normalize/README
new file mode 100644 (file)
index 0000000..e1f9e96
--- /dev/null
@@ -0,0 +1,57 @@
+Unicode/Normalize version 0.04
+===================================
+
+Unicode::Normalize - normalized forms of Unicode text
+
+SYNOPSIS
+
+  use Unicode::Normalize;
+
+  $string_NFD  = NFD($string);  # Normalization Form D
+  $string_NFC  = NFC($string);  # Normalization Form C
+  $string_NFKD = NFKD($string); # Normalization Form KD
+  $string_NFKC = NFKC($string); # Normalization Form KC
+
+   or
+
+  use Unicode::Normalize 'normalize';
+
+  $string_NFD  = normalize('D',  $string);  # Normalization Form D
+  $string_NFC  = normalize('C',  $string);  # Normalization Form C
+  $string_NFKD = normalize('KD', $string);  # Normalization Form KD
+  $string_NFKC = normalize('KC', $string);  # Normalization Form KC
+
+INSTALLATION
+
+To install this module type the following:
+
+   perl Makefile.PL
+   make
+   make test
+   make install
+
+DEPENDENCIES
+
+This module requires these other modules and libraries:
+
+Carp
+Exporter
+File::Spec
+Lingua::KO::Hangul::Util
+$unidir/CombiningClass.pl
+$unidir/Decomposition.pl
+$unidir/CompExcl.txt
+
+# $unidir is $LIB/unicore or $LIB/unicode
+
+COPYRIGHT AND LICENCE
+
+SADAHIRO Tomoyuki, E<lt>SADAHIRO@cpan.orgE<gt>
+
+  http://homepage1.nifty.com/nomenclator/perl/
+
+  Copyright(C) 2001, SADAHIRO Tomoyuki. Japan. All rights reserved.
+
+  This program is free software; you can redistribute it and/or 
+  modify it under the same terms as Perl itself.
+
diff --git a/lib/Unicode/Normalize/t/norm.t b/lib/Unicode/Normalize/t/norm.t
new file mode 100644 (file)
index 0000000..88e4e7d
--- /dev/null
@@ -0,0 +1,42 @@
+# Before `make install' is performed this script should be runnable with
+# `make test'. After `make install' it should work as `perl test.pl'
+
+#########################
+
+use Test;
+use strict;
+use warnings;
+BEGIN { plan tests => 15 };
+use Unicode::Normalize qw(normalize);
+ok(1); # If we made it this far, we're ok.
+
+#########################
+
+ok(normalize('C', ""), "");
+ok(normalize('D', ""), "");
+
+sub hexNFC {
+  join " ", map sprintf("%04X", $_),
+  unpack 'U*', normalize 'C', pack 'U*', map hex(), split ' ', shift;
+}
+sub hexNFD {
+  join " ", map sprintf("%04X", $_),
+  unpack 'U*', normalize 'D', pack 'U*', map hex(), split ' ', shift;
+}
+
+ok(hexNFC("0061 0315 0300 05AE 05C4 0062"), "00E0 05AE 05C4 0315 0062");
+ok(hexNFC("00E0 05AE 05C4 0315 0062"),      "00E0 05AE 05C4 0315 0062");
+ok(hexNFC("0061 05AE 0300 05C4 0315 0062"), "00E0 05AE 05C4 0315 0062");
+
+ok(hexNFD("0061 0315 0300 05AE 05C4 0062"), "0061 05AE 0300 05C4 0315 0062");
+ok(hexNFD("00E0 05AE 05C4 0315 0062"),      "0061 05AE 0300 05C4 0315 0062");
+ok(hexNFD("0061 05AE 0300 05C4 0315 0062"), "0061 05AE 0300 05C4 0315 0062");
+
+ok(hexNFC("0061 05C4 0315 0300 05AE 0062"), "0061 05AE 05C4 0300 0315 0062");
+ok(hexNFC("0061 05AE 05C4 0300 0315 0062"), "0061 05AE 05C4 0300 0315 0062");
+ok(hexNFD("0061 05C4 0315 0300 05AE 0062"), "0061 05AE 05C4 0300 0315 0062");
+ok(hexNFD("0061 05AE 05C4 0300 0315 0062"), "0061 05AE 05C4 0300 0315 0062");
+
+ok(hexNFC("0000 0041 0000 0000"), "0000 0041 0000 0000");
+ok(hexNFD("0000 0041 0000 0000"), "0000 0041 0000 0000");
+
diff --git a/lib/Unicode/Normalize/t/test.t b/lib/Unicode/Normalize/t/test.t
new file mode 100644 (file)
index 0000000..499f3ae
--- /dev/null
@@ -0,0 +1,42 @@
+# Before `make install' is performed this script should be runnable with
+# `make test'. After `make install' it should work as `perl test.pl'
+
+#########################
+
+use Test;
+use strict;
+use warnings;
+BEGIN { plan tests => 15 };
+use Unicode::Normalize;
+ok(1); # If we made it this far, we're ok.
+
+#########################
+
+ok(NFC(""), "");
+ok(NFD(""), "");
+
+sub hexNFC {
+  join " ", map sprintf("%04X", $_),
+  unpack 'U*', NFC pack 'U*', map hex(), split ' ', shift;
+}
+sub hexNFD {
+  join " ", map sprintf("%04X", $_),
+  unpack 'U*', NFD pack 'U*', map hex(), split ' ', shift;
+}
+
+ok(hexNFC("0061 0315 0300 05AE 05C4 0062"), "00E0 05AE 05C4 0315 0062");
+ok(hexNFC("00E0 05AE 05C4 0315 0062"),      "00E0 05AE 05C4 0315 0062");
+ok(hexNFC("0061 05AE 0300 05C4 0315 0062"), "00E0 05AE 05C4 0315 0062");
+
+ok(hexNFD("0061 0315 0300 05AE 05C4 0062"), "0061 05AE 0300 05C4 0315 0062");
+ok(hexNFD("00E0 05AE 05C4 0315 0062"),      "0061 05AE 0300 05C4 0315 0062");
+ok(hexNFD("0061 05AE 0300 05C4 0315 0062"), "0061 05AE 0300 05C4 0315 0062");
+
+ok(hexNFC("0061 05C4 0315 0300 05AE 0062"), "0061 05AE 05C4 0300 0315 0062");
+ok(hexNFC("0061 05AE 05C4 0300 0315 0062"), "0061 05AE 05C4 0300 0315 0062");
+ok(hexNFD("0061 05C4 0315 0300 05AE 0062"), "0061 05AE 05C4 0300 0315 0062");
+ok(hexNFD("0061 05AE 05C4 0300 0315 0062"), "0061 05AE 05C4 0300 0315 0062");
+
+ok(hexNFC("0000 0041 0000 0000"), "0000 0041 0000 0000");
+ok(hexNFD("0000 0041 0000 0000"), "0000 0041 0000 0000");
+
diff --git a/mg.c b/mg.c
index ea9650c..07869e0 100644 (file)
--- a/mg.c
+++ b/mg.c
@@ -392,7 +392,7 @@ Perl_magic_regdatum_get(pTHX_ SV *sv, MAGIC *mg)
                else                    /* @- */
                    i = s;
                
-               if (i > 0 && DO_UTF8(PL_reg_sv)) {
+               if (i > 0 && PL_reg_sv_utf8) {
                    char *b = rx->subbeg;
                    if (b)
                        i = Perl_utf8_length(aTHX_ (U8*)b, (U8*)(b+i));
@@ -433,7 +433,7 @@ Perl_magic_len(pTHX_ SV *sv, MAGIC *mg)
            {
                i = t1 - s1;
              getlen:
-               if (i > 0 && DO_UTF8(PL_reg_sv)) {
+               if (i > 0 && PL_reg_sv_utf8) {
                    char *s    = rx->subbeg + s1;
                    char *send = rx->subbeg + t1;
 
@@ -666,7 +666,7 @@ Perl_magic_get(pTHX_ SV *sv, MAGIC *mg)
                        PL_tainted = FALSE;
                    }
                    sv_setpvn(sv, s, i);
-                   if (PL_reg_sv && DO_UTF8(PL_reg_sv) && is_utf8_string((U8*)s, i))
+                   if (PL_reg_sv_utf8 && is_utf8_string((U8*)s, i))
                        SvUTF8_on(sv);
                    else
                        SvUTF8_off(sv);
index ee09fbe..9995b2b 100644 (file)
@@ -70,14 +70,13 @@ main(int argc, char **argv, char **env)
        perl_construct(my_perl);
        PL_perl_destruct_level = 0;
     }
-
+    PL_exit_flags |= PERL_EXIT_DESTRUCT_END;
     exitstatus = perl_parse(my_perl, xs_init, argc, argv, (char **)NULL);
     if (!exitstatus) {
-       exitstatus = perl_run(my_perl);
-       perl_destruct(my_perl);
-       exitstatus = STATUS_NATIVE_EXPORT;
+        perl_run(my_perl);
+        exitstatus = perl_destruct(my_perl);
     } else {
-      perl_destruct(my_perl);
+        perl_destruct(my_perl);
     }
 
     perl_free(my_perl);
index f12e9ba..d15fdbd 100644 (file)
--- a/numeric.c
+++ b/numeric.c
@@ -573,24 +573,21 @@ S_mulexp10(NV value, I32 exponent)
        exponent = -exponent;
     }
 
-    /* Avoid %SYSTEM-F-FLTOVF_F sans VAXC$ESTABLISH.
-     * In VAX VMS we by default use the D_FLOAT double format,
+    /* On OpenVMS VAX we by default use the D_FLOAT double format,
      * and that format does not have *easy* capabilities [1] for
-     * overflowing doubles 'silently' as IEEE fp does.  Therefore we
-     * need to detect early whether we would overflow (this is
-     * the behaviour of the native string-to-float conversion routines,
-     * and therefore the behaviour of native applications, too.)
+     * overflowing doubles 'silently' as IEEE fp does.  We also need 
+     * to support G_FLOAT on both VAX and Alpha, and though the exponent 
+     * range is much larger than D_FLOAT it still doesn't do silent 
+     * overflow.  Therefore we need to detect early whether we would 
+     * overflow (this is the behaviour of the native string-to-float 
+     * conversion routines, and therefore of native applications, too).
      *
-     * [1] VAXC$EXTABLISH is the capability but it is basically a signal
-     * handler setup routine, and one cannot return from a fp exception
-     * handler and except much anything useful. */
-#if defined(VMS) && !defined(__IEEE_FP)
-#  if defined(__DECC_VER) && __DECC_VER <= 50390006
-    /* __F_FLT_MAX_10_EXP - 5 == 33 */
+     * [1] Trying to establish a condition handler to trap floating point
+     *     exceptions is not a good idea. */
+#if defined(VMS) && !defined(__IEEE_FP) && defined(NV_MAX_10_EXP)
     if (!negative &&
-          (log10(value) + exponent) >= (__F_FLT_MAX_10_EXP - 5))
+        (log10(value) + exponent) >= (NV_MAX_10_EXP))
         return NV_MAX;
-#  endif
 #endif
 
     /* In UNICOS and in certain Cray models (such as T90) there is no
diff --git a/op.h b/op.h
index e92b1d8..dbfaced 100644 (file)
--- a/op.h
+++ b/op.h
@@ -464,7 +464,21 @@ struct loop {
 typedef struct {
   struct tm* tmbuff;
 } REBUF;
-#define localtime(a)       localtime_r(a,PL_reentrant_buffer->tmbuff)
-#define gmtime(a)          gmtime_r(a,PL_reentrant_buffer->tmbuff)
+
+#define localtime(a)       (localtime_r((a),PL_reentrant_buffer->tmbuff) ? PL_reentrant_buffer->tmbuff : NULL)
+#define gmtime(a)          (gmtime_r((a),PL_reentrant_buffer->tmbuff) ?  PL_reentrant_buffer->tmbuff : NULL)
+
+#if defined(__hpux) && defined(__ux_version) && __ux_version <= 1020
+
+/* HP-UX 10.20 returns 0 on success, what it returns on failure is hidden
+   in the fog somewhere, possibly -1 which means the following should do 
+   the right thing - 20010816 sky */
+
+#undef localtime
+#undef gmtime
+#define localtime(a)       ((localtime_r((a),PL_reentrant_buffer->tmbuff) == 0) ? PL_reentrant_buffer->tmbuff : NULL)
+#define gmtime(a)          ((gmtime_r((a),PL_reentrant_buffer->tmbuff) == 0) ? PL_reentrant_buffer->tmbuff : NULL)
+#endif /* HP-UX 10.20 */
+
 #endif
 
index 10d59eb..0cfb2c9 100644 (file)
@@ -70,7 +70,7 @@
 #if !defined(PERL_PATCHLEVEL_H_IMPLICIT) && !defined(LOCAL_PATCH_COUNT)
 static char    *local_patches[] = {
         NULL
-       ,"DEVEL11682"
+       ,"DEVEL11709"
        ,NULL
 };
 
diff --git a/perl.c b/perl.c
index 8379cf2..4bda944 100644 (file)
--- a/perl.c
+++ b/perl.c
@@ -301,7 +301,7 @@ Shuts down a Perl interpreter.  See L<perlembed>.
 =cut
 */
 
-void
+int
 perl_destruct(pTHXx)
 {
     int destruct_level;  /* 0=none, 1=full, 2=full with checks */
@@ -397,7 +397,8 @@ perl_destruct(pTHXx)
     }
 #endif
 
-    {
+
+    if(PL_exit_flags & PERL_EXIT_DESTRUCT_END) {
         dJMPENV;
         int x = 0;
 
@@ -456,7 +457,7 @@ perl_destruct(pTHXx)
        DEBUG_P(debprofdump());
 
        /* The exit() function will do everything that needs doing. */
-       return;
+        return STATUS_NATIVE_EXPORT;;
     }
 
     /* jettison our possibly duplicated environment */
@@ -854,6 +855,7 @@ perl_destruct(pTHXx)
        Safefree(PL_mess_sv);
        PL_mess_sv = Nullsv;
     }
+    return STATUS_NATIVE_EXPORT;
 }
 
 /*
@@ -1041,7 +1043,7 @@ S_parse_body(pTHX_ char **env, XSINIT_t xsinit)
     AV* comppadlist;
     register SV *sv;
     register char *s;
-    char *popts, *cddir = Nullch;
+    char *cddir = Nullch;
 
     sv_setpvn(PL_linestr,"",0);
     sv = newSVpvn("",0);               /* first used for -I flags */
@@ -1271,14 +1273,15 @@ print \"  \\@INC:\\n    @INC\\n\";");
 #ifndef SECURE_INTERNAL_GETENV
         !PL_tainting &&
 #endif
-       (popts = PerlEnv_getenv("PERL5OPT")))
+       (s = PerlEnv_getenv("PERL5OPT")))
     {
-       s = savepv(popts);
+       char *popt = s;
        while (isSPACE(*s))
            s++;
        if (*s == '-' && *(s+1) == 'T')
            PL_tainting = TRUE;
        else {
+           char *popt_copy = Nullch;
            while (s && *s) {
                char *d;
                while (isSPACE(*s))
@@ -1295,6 +1298,11 @@ print \"  \\@INC:\\n    @INC\\n\";");
                    Perl_croak(aTHX_ "Illegal switch in PERL5OPT: -%c", *s);
                while (++s && *s) {
                    if (isSPACE(*s)) {
+                       if (!popt_copy) {
+                           popt_copy = SvPVX(sv_2mortal(newSVpv(popt,0)));
+                           s = popt_copy + (s - popt);
+                           d = popt_copy + (d - popt);
+                       }
                        *s++ = '\0';
                        break;
                    }
@@ -1507,6 +1515,9 @@ perl_run(pTHXx)
            LEAVE;
        FREETMPS;
        PL_curstash = PL_defstash;
+       if (!(PL_exit_flags & PERL_EXIT_DESTRUCT_END) && 
+           PL_endav && !PL_minus_c)
+           call_list(oldscope, PL_endav);
 #ifdef MYMALLOC
        if (PerlEnv_getenv("PERL_DEBUG_MSTATS"))
            dump_mstats("after execution:  ");
diff --git a/perl.h b/perl.h
index f4629f8..a85cbf6 100644 (file)
--- a/perl.h
+++ b/perl.h
@@ -439,14 +439,14 @@ register struct op *Perl_op asm(stringify(OP_IN_REGISTER));
 #endif
 
 /* Use the reentrant APIs like localtime_r and getpwent_r */
-#if defined(USE_THREADS) && defined(USE_ITHREADS) && !defined(USE_REENTRANT_API)
+#if defined(USE_ITHREADS) && !defined(USE_REENTRANT_API)
 #   define USE_REENTRANT_API
 #endif
 
-/* Tru64/Digital UNIX/DEC OSF/1 and Win32 have naturally
- * threadsafe libraries, no need to use any _r variants. */
+/* Win32 has naturally threadsafe libraries,
+ * no need to use any _r variants. */
 #ifdef USE_REENTRANT_API
-#   if (defined(__osf__) && defined(__alpha)) || defined(WIN32)
+#   ifdef WIN32
 #       undef USE_REEENTRANT_API
 #   endif
 #endif
@@ -2070,6 +2070,7 @@ typedef pthread_key_t     perl_key;
 
 /* flags in PL_exit_flags for nature of exit() */
 #define PERL_EXIT_EXPECTED     0x01
+#define PERL_EXIT_DESTRUCT_END  0x02  /* Run END in perl_destruct */
 
 #ifndef MEMBER_TO_FPTR
 #  define MEMBER_TO_FPTR(name)         name
index 6a5a6c7..8c9bb5c 100644 (file)
--- a/perlapi.h
+++ b/perlapi.h
@@ -772,6 +772,8 @@ START_EXTERN_C
 #define PL_reg_starttry                (*Perl_Treg_starttry_ptr(aTHXo))
 #undef  PL_reg_sv
 #define PL_reg_sv              (*Perl_Treg_sv_ptr(aTHXo))
+#undef  PL_reg_sv_utf8
+#define PL_reg_sv_utf8         (*Perl_Treg_sv_utf8_ptr(aTHXo))
 #undef  PL_reg_whilem_seen
 #define PL_reg_whilem_seen     (*Perl_Treg_whilem_seen_ptr(aTHXo))
 #undef  PL_regbol
index 9f9d0ef..46dd82b 100644 (file)
@@ -1566,7 +1566,7 @@ Found in file perl.c
 
 Shuts down a Perl interpreter.  See L<perlembed>.
 
-       void    perl_destruct(PerlInterpreter* interp)
+       int     perl_destruct(PerlInterpreter* interp)
 
 =for hackers
 Found in file perl.c
index f429be7..9609cdc 100644 (file)
@@ -49,7 +49,8 @@ need not normally be used.
 However, as a compatibility measure, this pragma must be explicitly
 used to enable recognition of UTF-8 in the Perl scripts themselves on
 ASCII based machines or recognize UTF-EBCDIC on EBCDIC based machines.
-B<This should be the only place where an explicit C<use utf8> is needed>.
+B<NOTE: this should be the only place where an explicit C<use utf8> is
+needed>.
 
 =back
 
@@ -88,10 +89,9 @@ force byte semantics in a particular lexical scope.  See L<bytes>.
 
 The C<utf8> pragma is primarily a compatibility device that enables
 recognition of UTF-(8|EBCDIC) in literals encountered by the parser.
-It may also be used for enabling some of the more experimental Unicode
-support features.  Note that this pragma is only required until a
-future version of Perl in which character semantics will become the
-default.  This pragma may then become a no-op.  See L<utf8>.
+Note that this pragma is only required until a future version of Perl
+in which character semantics will become the default.  This pragma may
+then become a no-op.  See L<utf8>.
 
 Unless mentioned otherwise, Perl operators will use character semantics
 when they are dealing with Unicode data, and byte semantics otherwise.
@@ -102,6 +102,11 @@ literal UTF-8 string constant in the program), character semantics
 apply; otherwise, byte semantics are in effect.  To force byte semantics
 on Unicode data, the C<bytes> pragma should be used.
 
+Notice that if you have a string with byte semantics and you then
+add character data into it, the bytes will be upgraded I<as if they
+were ISO 8859-1 (Latin-1)> (or if in EBCDIC, after a translation
+to ISO 8859-1).
+
 Under character semantics, many operations that formerly operated on
 bytes change to operating on characters.  For ASCII data this makes no
 difference, because UTF-8 stores ASCII in single bytes, but for any
diff --git a/pp.c b/pp.c
index ee9d47e..e470d1c 100644 (file)
--- a/pp.c
+++ b/pp.c
@@ -2933,6 +2933,8 @@ PP(pp_sprintf)
     dSP; dMARK; dORIGMARK; dTARGET;
     do_sprintf(TARG, SP-MARK, MARK+1);
     TAINT_IF(SvTAINTED(TARG));
+    if (DO_UTF8(*(MARK+1)))
+       SvUTF8_on(TARG);
     SP = ORIGMARK;
     PUSHTARG;
     RETURN;
@@ -4053,6 +4055,8 @@ PP(pp_split)
     TAINT_IF((pm->op_pmflags & PMf_LOCALE) &&
             (pm->op_pmflags & (PMf_WHITE | PMf_SKIPWHITE)));
 
+    PL_reg_sv_utf8 = do_utf8;
+
     if (pm->op_pmreplroot) {
 #ifdef USE_ITHREADS
        ary = GvAVn((GV*)PL_curpad[(PADOFFSET)pm->op_pmreplroot]);
index db4c3fb..d219776 100644 (file)
--- a/pp_hot.c
+++ b/pp_hot.c
@@ -1222,7 +1222,7 @@ PP(pp_match)
        TARG = DEFSV;
        EXTEND(SP,1);
     }
-    PL_reg_sv = TARG;
+
     PUTBACK;                           /* EVAL blocks need stack_sp. */
     s = SvPV(TARG, len);
     strend = s + len;
@@ -1232,6 +1232,8 @@ PP(pp_match)
                 (PL_tainted && (pm->op_pmflags & PMf_RETAINT)));
     TAINT_NOT;
 
+    PL_reg_sv_utf8 = DO_UTF8(TARG);
+
     if (pm->op_pmdynflags & PMdf_USED) {
       failure:
        if (gimme == G_ARRAY)
@@ -1336,6 +1338,22 @@ play_it_again:
            }
        }
        if (global) {
+           if (pm->op_pmflags & PMf_CONTINUE) {
+               MAGIC* mg = 0;
+               if (SvTYPE(TARG) >= SVt_PVMG && SvMAGIC(TARG))
+                   mg = mg_find(TARG, PERL_MAGIC_regex_global);
+               if (!mg) {
+                   sv_magic(TARG, (SV*)0, PERL_MAGIC_regex_global, Nullch, 0);
+                   mg = mg_find(TARG, PERL_MAGIC_regex_global);
+               }
+               if (rx->startp[0] != -1) {
+                   mg->mg_len = rx->endp[0];
+                   if (rx->startp[0] == rx->endp[0])
+                       mg->mg_flags |= MGf_MINMATCH;
+                   else
+                       mg->mg_flags &= ~MGf_MINMATCH;
+               }
+           }
            had_zerolen = (rx->startp[0] != -1
                           && rx->startp[0] == rx->endp[0]);
            PUTBACK;                    /* EVAL blocks may use stack */
@@ -1382,7 +1400,7 @@ yup:                                      /* Confirmed by INTUIT */
     if (global) {
        rx->subbeg = truebase;
        rx->startp[0] = s - truebase;
-       if (DO_UTF8(PL_reg_sv)) {
+       if (PL_reg_sv_utf8) {
            char *t = (char*)utf8_hop((U8*)s, rx->minlen);
            rx->endp[0] = t - truebase;
        }
@@ -1882,7 +1900,6 @@ PP(pp_subst)
     STRLEN len;
     int force_on_match = 0;
     I32 oldsave = PL_savestack_ix;
-    bool do_utf8;
     STRLEN slen;
 
     /* known replacement string? */
@@ -1893,8 +1910,7 @@ PP(pp_subst)
        TARG = DEFSV;
        EXTEND(SP,1);
     }
-    PL_reg_sv = TARG;
-    do_utf8 = DO_UTF8(PL_reg_sv);
+
     if (SvFAKE(TARG) && SvREADONLY(TARG))
        sv_force_normal(TARG);
     if (SvREADONLY(TARG)
@@ -1912,12 +1928,14 @@ PP(pp_subst)
        rxtainted |= 2;
     TAINT_NOT;
 
+    PL_reg_sv_utf8 = DO_UTF8(TARG);
+
   force_it:
     if (!pm || !s)
        DIE(aTHX_ "panic: pp_subst");
 
     strend = s + len;
-    slen = do_utf8 ? utf8_length((U8*)s, (U8*)strend) : len;
+    slen = PL_reg_sv_utf8 ? utf8_length((U8*)s, (U8*)strend) : len;
     maxiters = 2 * slen + 10;  /* We can match twice at each
                                   position, once with zero-length,
                                   second time with non-zero. */
diff --git a/proto.h b/proto.h
index 06ce95a..698b184 100644 (file)
--- a/proto.h
+++ b/proto.h
@@ -13,7 +13,7 @@ PERL_CALLCONV PerlInterpreter*        perl_alloc_using(struct IPerlMem* m, struct IPerl
 #endif
 PERL_CALLCONV PerlInterpreter* perl_alloc(void);
 PERL_CALLCONV void     perl_construct(PerlInterpreter* interp);
-PERL_CALLCONV void     perl_destruct(PerlInterpreter* interp);
+PERL_CALLCONV int      perl_destruct(PerlInterpreter* interp);
 PERL_CALLCONV void     perl_free(PerlInterpreter* interp);
 PERL_CALLCONV int      perl_run(PerlInterpreter* interp);
 PERL_CALLCONV int      perl_parse(PerlInterpreter* interp, XSINIT_t xsinit, int argc, char** argv, char** env);
index 18aa057..9877658 100644 (file)
--- a/regcomp.c
+++ b/regcomp.c
@@ -4735,6 +4735,7 @@ Perl_save_re_context(pTHX)
     SAVEVPTR(PL_reg_re);               /* from regexec.c */
     SAVEPPTR(PL_reg_ganch);            /* from regexec.c */
     SAVESPTR(PL_reg_sv);               /* from regexec.c */
+    SAVEI32(PL_reg_sv_utf8);           /* from regexec.c */
     SAVEVPTR(PL_reg_magic);            /* from regexec.c */
     SAVEI32(PL_reg_oldpos);                    /* from regexec.c */
     SAVEVPTR(PL_reg_oldcurpm);         /* from regexec.c */
index e95bd16..4a19958 100644 (file)
--- a/regexec.c
+++ b/regexec.c
  */
 
 #define CHR_SVLEN(sv) (UTF ? sv_len_utf8(sv) : SvCUR(sv))
-#define CHR_DIST(a,b) (DO_UTF8(PL_reg_sv) ? utf8_distance(a,b) : a - b)
+#define CHR_DIST(a,b) (PL_reg_sv_utf8 ? utf8_distance(a,b) : a - b)
 
 #define reghop_c(pos,off) ((char*)reghop((U8*)pos, off))
 #define reghopmaybe_c(pos,off) ((char*)reghopmaybe((U8*)pos, off))
-#define HOP(pos,off) (DO_UTF8(PL_reg_sv) ? reghop((U8*)pos, off) : (U8*)(pos + off))
-#define HOPMAYBE(pos,off) (DO_UTF8(PL_reg_sv) ? reghopmaybe((U8*)pos, off) : (U8*)(pos + off))
+#define HOP(pos,off) (PL_reg_sv_utf8 ? reghop((U8*)pos, off) : (U8*)(pos + off))
+#define HOPMAYBE(pos,off) (PL_reg_sv_utf8 ? reghopmaybe((U8*)pos, off) : (U8*)(pos + off))
 #define HOPc(pos,off) ((char*)HOP(pos,off))
 #define HOPMAYBEc(pos,off) ((char*)HOPMAYBE(pos,off))
 
 #define HOPBACK(pos, off) (            \
-    (UTF && DO_UTF8(PL_reg_sv))                \
+    (UTF && PL_reg_sv_utf8)            \
        ? reghopmaybe((U8*)pos, -off)   \
     : (pos - off >= PL_bostr)          \
        ? (U8*)(pos - off)              \
 
 #define reghop3_c(pos,off,lim) ((char*)reghop3((U8*)pos, off, (U8*)lim))
 #define reghopmaybe3_c(pos,off,lim) ((char*)reghopmaybe3((U8*)pos, off, (U8*)lim))
-#define HOP3(pos,off,lim) (DO_UTF8(PL_reg_sv) ? reghop3((U8*)pos, off, (U8*)lim) : (U8*)(pos + off))
-#define HOPMAYBE3(pos,off,lim) (DO_UTF8(PL_reg_sv) ? reghopmaybe3((U8*)pos, off, (U8*)lim) : (U8*)(pos + off))
+#define HOP3(pos,off,lim) (PL_reg_sv_utf8 ? reghop3((U8*)pos, off, (U8*)lim) : (U8*)(pos + off))
+#define HOPMAYBE3(pos,off,lim) (PL_reg_sv_utf8 ? reghopmaybe3((U8*)pos, off, (U8*)lim) : (U8*)(pos + off))
 #define HOP3c(pos,off,lim) ((char*)HOP3(pos,off,lim))
 #define HOPMAYBE3c(pos,off,lim) ((char*)HOPMAYBE3(pos,off,lim))
 
@@ -878,7 +878,7 @@ S_find_byclass(pTHX_ regexp * prog, regnode *c, char *s, char *strend, char *sta
        unsigned int c2;
        char *e;
        register I32 tmp = 1;   /* Scratch variable? */
-       register bool do_utf8 = DO_UTF8(PL_reg_sv);
+       register bool do_utf8 = PL_reg_sv_utf8;
 
        /* We know what class it must start with. */
        switch (OP(c)) {
@@ -2009,7 +2009,7 @@ S_regmatch(pTHX_ regnode *prog)
 #if 0
     I32 firstcp = PL_savestack_ix;
 #endif
-    register bool do_utf8 = DO_UTF8(PL_reg_sv);
+    register bool do_utf8 = PL_reg_sv_utf8;
 
 #ifdef DEBUGGING
     PL_regindent++;
@@ -3033,12 +3033,15 @@ S_regmatch(pTHX_ regnode *prog)
                minmod = 0;
                if (ln && regrepeat_hard(scan, ln, &l) < ln)
                    sayNO;
-               if (ln && l == 0 && n >= ln
-                   /* In fact, this is tricky.  If paren, then the
-                      fact that we did/didnot match may influence
-                      future execution. */
-                   && !(paren && ln == 0))
-                   ln = n;
+               /* if we matched something zero-length we don't need to
+                  backtrack - capturing parens are already defined, so
+                  the caveat in the maximal case doesn't apply
+
+                  XXXX if ln == 0, we can redo this check first time
+                  through the following loop
+               */
+               if (ln && l == 0)
+                   n = ln;     /* don't backtrack */
                locinput = PL_reginput;
                if (PL_regkind[(U8)OP(next)] == EXACT) {
                    c1 = (U8)*STRING(next);
@@ -3060,7 +3063,7 @@ S_regmatch(pTHX_ regnode *prog)
                        UCHARAT(PL_reginput) == c2)
                    {
                        if (paren) {
-                           if (n) {
+                           if (ln) {
                                PL_regstartp[paren] =
                                    HOPc(PL_reginput, -l) - PL_bostr;
                                PL_regendp[paren] = PL_reginput - PL_bostr;
@@ -3084,12 +3087,13 @@ S_regmatch(pTHX_ regnode *prog)
            }
            else {
                n = regrepeat_hard(scan, n, &l);
-               if (n != 0 && l == 0
-                   /* In fact, this is tricky.  If paren, then the
-                      fact that we did/didnot match may influence
-                      future execution. */
-                   && !(paren && ln == 0))
-                   ln = n;
+               /* if we matched something zero-length we don't need to
+                  backtrack, unless the minimum count is zero and we
+                  are capturing the result - in that case the capture
+                  being defined or not may affect later execution
+               */
+               if (n != 0 && l == 0 && !(paren && ln == 0))
+                   ln = n;     /* don't backtrack */
                locinput = PL_reginput;
                DEBUG_r(
                    PerlIO_printf(Perl_debug_log,
@@ -3586,7 +3590,7 @@ S_regrepeat(pTHX_ regnode *p, I32 max)
     register I32 c;
     register char *loceol = PL_regeol;
     register I32 hardcount = 0;
-    register bool do_utf8 = DO_UTF8(PL_reg_sv);
+    register bool do_utf8 = PL_reg_sv_utf8;
 
     scan = PL_reginput;
     if (max != REG_INFTY && max < loceol - scan)
@@ -3825,7 +3829,7 @@ S_regrepeat_hard(pTHX_ regnode *p, I32 max, I32 *lp)
        return 0;
 
     start = PL_reginput;
-    if (DO_UTF8(PL_reg_sv)) {
+    if (PL_reg_sv_utf8) {
        while (PL_reginput < loceol && (scan = PL_reginput, res = regmatch(p))) {
            if (!count++) {
                l = 0;
index 4359694..3427469 100644 (file)
 #define PERL_IN_SHAREDSV_C
 #include "perl.h"
 
-PerlInterpreter* sharedsv_space;
-
 #ifdef USE_ITHREADS
 
+PerlInterpreter* sharedsv_space;
+perl_mutex sharedsv_space_mutex;
+
 /*
   Shared SV
 
@@ -45,6 +46,7 @@ void
 Perl_sharedsv_init(pTHX)
 {
     sharedsv_space = PERL_GET_CONTEXT;
+    MUTEX_INIT(&sharedsv_space_mutex);
 }
 
 /*
@@ -145,9 +147,9 @@ Increments the threadcount of a sharedsv.
 void
 Perl_sharedsv_thrcnt_inc(pTHX_ shared_sv* ssv)
 {
-  SHAREDSvLOCK(ssv);
+  SHAREDSvEDIT(ssv);
   SvREFCNT_inc(ssv->sv);
-  SHAREDSvUNLOCK(ssv);
+  SHAREDSvRELEASE(ssv);
 }
 
 /*
@@ -163,7 +165,6 @@ void
 Perl_sharedsv_thrcnt_dec(pTHX_ shared_sv* ssv)
 {
     SV* sv;
-    SHAREDSvLOCK(ssv);
     SHAREDSvEDIT(ssv);
     sv = SHAREDSvGET(ssv);
     if (SvREFCNT(sv) == 1) {
@@ -195,7 +196,6 @@ Perl_sharedsv_thrcnt_dec(pTHX_ shared_sv* ssv)
     }
     SvREFCNT_dec(sv);
     SHAREDSvRELEASE(ssv);
-    SHAREDSvUNLOCK(ssv);
 }
 
-#endif
+#endif /* USE_ITHREADS */
index 16bba11..1dec854 100644 (file)
@@ -10,6 +10,7 @@ typedef struct {
 } shared_sv;
 
 extern PerlInterpreter* sharedsv_space;
+extern perl_mutex  sharedsv_space_mutex;
 
 void Perl_sharedsv_unlock_scope(pTHX_ shared_sv* ssv);
 void Perl_sharedsv_unlock(pTHX_ shared_sv* ssv);
@@ -22,8 +23,14 @@ void Perl_sharedsv_thrcnt_dec(pTHX_ shared_sv* ssv);
 
 
 #define SHAREDSvGET(a)     (a->sv)
-#define SHAREDSvEDIT(a)    PERL_SET_CONTEXT(sharedsv_space)
-#define SHAREDSvRELEASE(a) PERL_SET_CONTEXT(my_perl)
+#define SHAREDSvEDIT(a)    { MUTEX_LOCK(&sharedsv_space_mutex);\
+SHAREDSvLOCK((a));\
+PERL_SET_CONTEXT(sharedsv_space);\
+}
+#define SHAREDSvRELEASE(a) { PERL_SET_CONTEXT((a)->owner);\
+SHAREDSvUNLOCK((a));\
+MUTEX_UNLOCK(&sharedsv_space_mutex);\
+}
 #define SHAREDSvLOCK(a)    Perl_sharedsv_lock(aTHX_ a)
 #define SHAREDSvUNLOCK(a)  Perl_sharedsv_unlock(aTHX_ a)
 
diff --git a/sv.c b/sv.c
index 3426596..e0a242e 100644 (file)
--- a/sv.c
+++ b/sv.c
@@ -9784,6 +9784,7 @@ perl_clone_using(PerlInterpreter *proto_perl, UV flags,
     PL_e_script                = sv_dup_inc(proto_perl->Ie_script, param);
     PL_perldb          = proto_perl->Iperldb;
     PL_perl_destruct_level = proto_perl->Iperl_destruct_level;
+    PL_exit_flags       = proto_perl->Iexit_flags;
 
     /* magical thingies */
     /* XXX time(&PL_basetime) when asked for? */
@@ -10258,6 +10259,7 @@ perl_clone_using(PerlInterpreter *proto_perl, UV flags,
     PL_reg_re          = (regexp*)NULL;
     PL_reg_ganch       = Nullch;
     PL_reg_sv          = Nullsv;
+    PL_reg_sv_utf8     = FALSE;
     PL_reg_magic       = (MAGIC*)NULL;
     PL_reg_oldpos      = 0;
     PL_reg_oldcurpm    = (PMOP*)NULL;
index 0b08f08..748855a 100755 (executable)
@@ -2,8 +2,7 @@
 
 # $RCSfile: index.t,v $$Revision: 4.1 $$Date: 92/08/07 18:27:59 $
 
-print "1..20\n";
-
+print "1..24\n";
 
 $foo = 'Now is the time for all good men to come to the aid of their country.';
 
@@ -40,3 +39,11 @@ print rindex("ababa","a",2) == 2 ? "ok 17\n" : "not ok 17\n";
 print rindex("ababa","a",3) == 2 ? "ok 18\n" : "not ok 18\n";
 print rindex("ababa","a",4) == 4 ? "ok 19\n" : "not ok 19\n";
 print rindex("ababa","a",5) == 4 ? "ok 20\n" : "not ok 20\n";
+
+$a = "foo \x{1234}bar";
+
+print index($a, "\x{1234}") == 4 ? "ok 21\n" : "not ok 21\n";
+print index($a, "bar",    ) == 5 ? "ok 22\n" : "not ok 22\n";
+
+print rindex($a, "\x{1234}") == 4 ? "ok 23\n" : "not ok 23\n";
+print rindex($a, "foo",    ) == 0 ? "ok 24\n" : "not ok 24\n";
index 3869030..3cfb667 100755 (executable)
@@ -724,5 +724,18 @@ sub DESTROY {
 EXPECT
 Bar=ARRAY(0x...)
 ########
+# 20010407.008 sprintf removes utf8-ness
+$a = sprintf "\x{1234}";
+printf "%x %d\n", unpack("U*", $a), length($a);
+$a = sprintf "%s", "\x{5678}";
+printf "%x %d\n", unpack("U*", $a), length($a);
+$a = sprintf "\x{1234}%s", "\x{5678}";
+printf "%x %x %d\n", unpack("U*", $a), length($a);
+EXPECT
+1234 1
+5678 1
+1234 5678 2
+########
+# keep this last - doesn't seem to work otherwise?
 eval "a.b.c.d.e.f;sub"
 EXPECT
index bed2f37..478e299 100755 (executable)
@@ -6,7 +6,7 @@
 
 $| = 1;
 
-print "1..683\n";
+print "1..686\n";
 
 BEGIN {
     chdir 't' if -d 't';
@@ -1979,3 +1979,30 @@ print "ok 682\n" if @a == 9 && "@a" eq "f o o \n $a $b b a r";
 @a = ("foo\n\x{100}bar" =~ /\C/gs);
 print "ok 683\n" if @a == 9 && "@a" eq "f o o \n $a $b b a r";
 
+{
+    # [ID 20010814.004] pos() doesn't work when using =~m// in list context
+    $_ = "ababacadaea";
+    $a = join ":", /b./gc;
+    $b = join ":", /a./gc;
+    $c = pos;
+    print "$a $b $c" eq 'ba:ba ad:ae 10' ? "ok 684\n" : "not ok 684\t# $a $b $c\n";
+}
+
+{
+    package ID_20010407_006;
+
+    sub x {
+       "a\x{1234}";
+    }
+
+    my $x = x;
+    my $y;
+
+    $x =~ /(..)/; $y = $1;
+    print "not " unless length($y) == 2 && $y eq $x;
+    print "ok 685\n" if length($y) == 2;
+
+    x  =~ /(..)/; $y = $1;
+    print "not " unless length($y) == 2 && $y eq $x;
+    print "ok 686\n";
+}
index cda8790..1e80f50 100644 (file)
@@ -792,3 +792,7 @@ tt+$        xxxtt   y       -       -
 ^(a(??{"(?!)"})|(a)(?{1}))b    ab      y       $2      a       # [ID 20010811.006]
 ab(?i)cd       AbCd    n       -       -       # [ID 20010809.023]
 ab(?i)cd       abCd    y       -       -
+(A|B)*(?(1)(CD)|(CD))  CD      y       $2-$3   -CD
+(A|B)*(?(1)(CD)|(CD))  ABCD    y       $2-$3   CD-
+(A|B)*?(?(1)(CD)|(CD)) CD      y       $2-$3   -CD     # [ID 20010803.016]
+(A|B)*?(?(1)(CD)|(CD)) ABCD    y       $2-$3   CD-
index 8e999fc..2dd74a6 100644 (file)
--- a/thrdvar.h
+++ b/thrdvar.h
@@ -256,4 +256,8 @@ PERLVAR(i,          struct thread_intern)
 
 PERLVAR(trailing_nul,  char)           /* For the sake of thrsv and oursv */
 PERLVAR(thr_done,      bool)           /* True when the thread has finished */
+
 #endif /* USE_THREADS */
+
+PERLVAR(Treg_sv_utf8,  bool)           /* was what we matched against utf8 */
+
index 548d130..97361b2 100644 (file)
--- a/vms/vms.c
+++ b/vms/vms.c
@@ -2061,7 +2061,32 @@ safe_popen(pTHX_ char *cmd, char *mode)
     vmspipedsc.dsc$a_pointer = tfilebuf;
     vmspipedsc.dsc$w_length  = strlen(tfilebuf);
 
-    if (!(setup_cmddsc(aTHX_ cmd,0) & 1)) { set_errno(EINVAL); return Nullfp; }
+    sts = setup_cmddsc(aTHX_ cmd,0);
+    if (!(sts & 1)) { 
+      switch (sts) {
+        case RMS$_FNF:  case RMS$_DNF:
+          set_errno(ENOENT); break;
+        case RMS$_DIR:
+          set_errno(ENOTDIR); break;
+        case RMS$_DEV:
+          set_errno(ENODEV); break;
+        case RMS$_PRV:
+          set_errno(EACCES); break;
+        case RMS$_SYN:
+          set_errno(EINVAL); break;
+        case CLI$_BUFOVF: case RMS$_RTB: case CLI$_TKNOVF: case CLI$_RSLOVF:
+          set_errno(E2BIG); break;
+        case LIB$_INVARG: case LIB$_INVSTRDES: case SS$_ACCVIO: /* shouldn't happen */
+          _ckvmssts(sts); /* fall through */
+        default:  /* SS$_DUPLNAM, SS$_CLI, resource exhaustion, etc. */
+          set_errno(EVMSERR); 
+      }
+      set_vaxc_errno(sts);
+      if (ckWARN(WARN_PIPE)) {
+        Perl_warner(aTHX_ WARN_PIPE,"Can't pipe \"%*s\": %s", strlen(cmd), cmd, Strerror(errno));
+      }
+      return Nullfp; 
+    }
     New(1301,info,1,Info);
         
     info->mode = *mode;
@@ -4552,6 +4577,7 @@ setup_argstr(pTHX_ SV *really, SV **mark, SV **sp)
 
 }  /* end of setup_argstr() */
 
+#define MAX_DCL_LINE_LENGTH   255
 
 static unsigned long int
 setup_cmddsc(pTHX_ char *cmd, int check_img)
@@ -4565,9 +4591,8 @@ setup_cmddsc(pTHX_ char *cmd, int check_img)
   register char *s, *rest, *cp, *wordbreak;
   register int isdcl;
 
-  if (strlen(cmd) >
-      (sizeof(vmsspec) > sizeof(resspec) ? sizeof(resspec) : sizeof(vmsspec)))
-    return LIB$_INVARG;
+  if (strlen(cmd) > MAX_DCL_LINE_LENGTH)
+    return CLI$_BUFOVF;                /* continuation lines currently unsupported */
   s = cmd;
   while (*s && isspace(*s)) s++;
 
@@ -4647,14 +4672,14 @@ setup_cmddsc(pTHX_ char *cmd, int check_img)
       if (cando_by_name(S_IXUSR,0,resspec)) {
         New(402,VMScmd.dsc$a_pointer,7 + s - resspec + (rest ? strlen(rest) : 0),char);
         if (!isdcl) {
-        strcpy(VMScmd.dsc$a_pointer,"$ MCR ");
+            strcpy(VMScmd.dsc$a_pointer,"$ MCR ");
         } else {
             strcpy(VMScmd.dsc$a_pointer,"@");
         }
         strcat(VMScmd.dsc$a_pointer,resspec);
         if (rest) strcat(VMScmd.dsc$a_pointer,rest);
         VMScmd.dsc$w_length = strlen(VMScmd.dsc$a_pointer);
-        return retsts;
+        return (VMScmd.dsc$w_length > MAX_DCL_LINE_LENGTH ? CLI$_BUFOVF : retsts);
       }
       else retsts = RMS$_PRV;
     }
@@ -4671,7 +4696,7 @@ setup_cmddsc(pTHX_ char *cmd, int check_img)
     else { _ckvmssts(retsts); }
   }
 
-  return (VMScmd.dsc$w_length > 255 ? CLI$_BUFOVF : retsts);
+  return (VMScmd.dsc$w_length > MAX_DCL_LINE_LENGTH ? CLI$_BUFOVF : retsts);
 
 }  /* end of setup_cmddsc() */
 
@@ -4731,7 +4756,7 @@ Perl_vms_do_exec(pTHX_ char *cmd)
         set_errno(EACCES); break;
       case RMS$_SYN:
         set_errno(EINVAL); break;
-      case CLI$_BUFOVF:
+      case CLI$_BUFOVF: case RMS$_RTB: case CLI$_TKNOVF: case CLI$_RSLOVF:
         set_errno(E2BIG); break;
       case LIB$_INVARG: case LIB$_INVSTRDES: case SS$_ACCVIO: /* shouldn't happen */
         _ckvmssts(retsts); /* fall through */
@@ -4775,8 +4800,13 @@ Perl_do_spawn(pTHX_ char *cmd)
     hadcmd = 0;
     sts = lib$spawn(0,0,0,0,0,0,&substs,0,0,0,0,0,0);
   }
-  else if ((sts = setup_cmddsc(aTHX_ cmd,0)) & 1) {
-    sts = lib$spawn(&VMScmd,0,0,0,0,0,&substs,0,0,0,0,0,0);
+  else {
+    sts = setup_cmddsc(aTHX_ cmd,0);
+    if (sts & 1) {
+        sts = lib$spawn(&VMScmd,0,0,0,0,0,&substs,0,0,0,0,0,0);
+    } else {
+        substs = sts; /* didn't spawn, use command setup failure for return */
+    }
   }
   
   if (!(sts & 1)) {
@@ -4791,7 +4821,7 @@ Perl_do_spawn(pTHX_ char *cmd)
         set_errno(EACCES); break;
       case RMS$_SYN:
         set_errno(EINVAL); break;
-      case CLI$_BUFOVF:
+      case CLI$_BUFOVF: case RMS$_RTB: case CLI$_TKNOVF: case CLI$_RSLOVF:
         set_errno(E2BIG); break;
       case LIB$_INVARG: case LIB$_INVSTRDES: case SS$_ACCVIO: /* shouldn't happen */
         _ckvmssts(sts); /* fall through */