This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
regen/mk_invlists.pl: Collapse unused boundary values
authorKarl Williamson <khw@cpan.org>
Sat, 21 Jul 2018 20:09:24 +0000 (14:09 -0600)
committerKarl Williamson <khw@cpan.org>
Sat, 21 Jul 2018 21:26:48 +0000 (15:26 -0600)
commit2027d3658f4b767823e788e70ad97e67d3aa4ff2
treecc77f3ac4b4807c55e5a9e7b08511755ac4d27af
parent1c7f0e60a2c7edac13fe96fa358750553f733f66
regen/mk_invlists.pl: Collapse unused boundary values

Each Unicode property that specifies a boundary conditions, like
Word_Break, partitions all the Unicode code points into equivalence
classes.  So, for example, combining marks are placed into the Extend
class, because they are usually used to extend the previous character
and don't stand on their own.  mk_invlists.pl creates a boolean table of
all pairwise combinations of these classes, so that it knows by simple
lookup if the first character is class X and the next character is class
Y, if a break is permitted between these.

However, in some cases the answer isn't as simple as this, and other
means such as the characters in the vicinity of X and Y must be used to
disambiguate.  In these cases the table value in the cell (X,Y) isn't a
boolean, but is some other number indicating some specially crafted code
section to execute to resolve the issue.

Over the years, Unicode has tended to subdivide partitions into smaller
ones, as they've refined their algorithms.  But with Unicode 11, they
used another method and actually removed partitions.  Rather, they
retain the partitions, but no code point actually takes on the value of
an obsolete partition.

In order to not have to change the algorithm unnecessarily between
Unicode releases (who knows, they might change their minds, and
unobsolete these next time), mk_invlists has just kept the tables
around, but those cells won't ever get accessed because no code point in
the current release evaluates to them.

But that makes the tables unnecessarily large.  We can achieve the same
thing by mapping each unused equivalence class to the same value, which
we call 'unused'.  The algorithms that refer to the obsolete partitions
go through the data assigning values to the cells, but now the cells
overlap, since all obsolete classes map to the same row or column.  Thus
the data is total garbage.  But that doesn't matter, since that row or
column is never read by the data in the Unicode release the table is
constructed for.

mk_invlists also can compile older Unicode releases, and this makes
those tables smaller than before, with all unused classes in a
given release collapsed into a single row and single column of (unused)
garbage.
charclass_invlists.h
regen/mk_invlists.pl
uni_keywords.h