summaryrefslogtreecommitdiff
path: root/lib/unicore/mktables
diff options
context:
space:
mode:
Diffstat (limited to 'lib/unicore/mktables')
-rw-r--r--lib/unicore/mktables43
1 files changed, 42 insertions, 1 deletions
diff --git a/lib/unicore/mktables b/lib/unicore/mktables
index 095d5674c0..64d87d5565 100644
--- a/lib/unicore/mktables
+++ b/lib/unicore/mktables
@@ -10371,6 +10371,11 @@ sub filter_arabic_shaping_line {
return;
}
+{ # Closure
+ my $lc; # Table for lowercase mapping
+ my $tc;
+ my $uc;
+
sub setup_special_casing {
# SpecialCasing.txt contains the non-simple case change mappings. The
# simple ones are in UnicodeData.txt, which should already have been read
@@ -10391,8 +10396,13 @@ sub setup_special_casing {
my $file= shift;
Carp::carp_extra_args(\@_) if main::DEBUG && @_;
+ $lc = property_ref('lc');
+ $tc = property_ref('tc');
+ $uc = property_ref('uc');
+
# For each of the case change mappings...
- foreach my $case ('lc', 'tc', 'uc') {
+ foreach my $case_table ($lc, $tc, $uc) {
+ my $case = $case_table->name;
my $full = property_ref($case);
unless (defined $full && ! $full->is_empty) {
Carp::my_carp_bug("Need to process UnicodeData before SpecialCasing. Only special casing will be generated.");
@@ -10402,6 +10412,18 @@ sub setup_special_casing {
# of the full one's
my $simple = property_ref('s' . $case);
$simple->initialize($full) if $simple->to_output_map();
+
+ my $simple_only = Property->new("_s$case",
+ Type => $STRING,
+ Default_Map => $CODE_POINT,
+ Perl_Extension => 1,
+ Description => "The simple mappings for $case for code points that have full mappings as well");
+ $simple_only->set_to_output_map($INTERNAL_MAP);
+ $simple_only->add_comment(join_lines( <<END
+This file is for UCD.pm so that it can construct simple mappings that would
+otherwise be lost because they are overridden by full mappings.
+END
+ ));
}
return;
@@ -10469,8 +10491,27 @@ sub filter_special_casing_line {
$file->insert_adjusted_lines("$fields[0]; tc; $fields[2]");
$file->insert_adjusted_lines("$fields[0]; uc; $fields[3]");
+ # Copy any simple case change to the special tables constructed if
+ # being overridden by a multi-character case change.
+ if ($fields[1] ne $fields[0]
+ && (my $value = $lc->value_of(hex $fields[0])) ne $CODE_POINT)
+ {
+ $file->insert_adjusted_lines("$fields[0]; _slc; $value");
+ }
+ if ($fields[2] ne $fields[0]
+ && (my $value = $tc->value_of(hex $fields[0])) ne $CODE_POINT)
+ {
+ $file->insert_adjusted_lines("$fields[0]; _stc; $value");
+ }
+ if ($fields[3] ne $fields[0]
+ && (my $value = $uc->value_of(hex $fields[0])) ne $CODE_POINT)
+ {
+ $file->insert_adjusted_lines("$fields[0]; _suc; $value");
+ }
+
return;
}
+}
sub filter_old_style_case_folding {
# This transforms $_ containing the case folding style of 3.0.1, to 3.1