diff options
Diffstat (limited to 'trunk/tools/compress-table.pl')
-rwxr-xr-x | trunk/tools/compress-table.pl | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/trunk/tools/compress-table.pl b/trunk/tools/compress-table.pl new file mode 100755 index 00000000..55129651 --- /dev/null +++ b/trunk/tools/compress-table.pl @@ -0,0 +1,123 @@ +#!/usr/bin/perl -w + +sub convert { + $s = shift; + $s = "ENC_".uc($s); + $s =~ s/-/_/g; + return $s; +} + +$combo_index = 1; + +sub add { + my $combo = shift; + if (!exists($combos{$combo})) { + $combos{$combo} = $combo_index++; + printf " $combo,\n", $combos{$combo}; + } +} + +my $col = 0; + +sub output { + my ($start,$u,$index) = @_; + + for (my $i = $start; $i < $u; $i++) { + print " 0,"; + $col = ($col + 1) % 16; + if ($col == 0) { + print "\n"; + } + } + printf " %2d,", $index; + $col = ($col + 1) % 16; + if ($col == 0) { + print "\n"; + } +} + +# +# Read in the maps +# +my @codepoints = (); + +opendir (MAPS, "maps") || die "Cannot open maps/ subdirectory: $!\n"; +while (defined (my $map = readdir (MAPS))) { + next if ($map =~ /^\./); + next if ($map =~ /~$/); + next if ($map =~ /^CVS|README$/); + + open (MAP, "maps/$map") || die "Cannot open map '$map:!\n"; + + $encoding = convert($map); + while (<MAP>) { + s/\s*#.*//; + s/\s*$//; + next if /^$/; + if (!/^\s*(0x[A-Fa-f0-9]+)\s+(0x[A-Fa-f0-9]+)$/) { + die "Cannot parse line '%s' in map '$map'\n"; + } + push @codepoints, [hex($2), $encoding]; + } + close (MAP); +} + +# +# And sort them +# +@codepoints = sort { $a->[0] <=> $b->[0] } @codepoints; + +print "const guint32 char_mask_map[] = {\n 0,\n"; + +$encodings = ""; + +for $cp (@codepoints) { + $u = $cp->[0]; $e = $cp->[1]; + + if (!defined $old_u) { + $old_u = $u; + $encodings = $e; + } elsif ($old_u ne $u) { + add($encodings); + $old_u = $u; + $encodings = $e; + } else { + $encodings .= "|".$e; + } +} + +if (defined $old_u) { + add($encodings); +} + +print <<EOF; +}; + +const guchar char_masks[] = { +EOF + +$encodings = ""; + +undef $old_u; +$start = 0; +for $cp (@codepoints) { + $u = $cp->[0]; $e = $cp->[1]; + + if (!defined $old_u) { + $old_u = $u; + $encodings = $e; + } elsif ($old_u ne $u) { + output($start, $old_u, $combos{$encodings}); + $start = $old_u + 1; + $old_u = $u; + $encodings = $e; + } else { + $encodings .= "|".$e; + } +} + +if (defined $old_u) { + output($start, $old_u, $combos{$encodings}); +} + +print "\n};\n"; |