#!/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"; } } print "const guint32 char_mask_map[] = {\n 0,\n"; open TABLE, "table"; $encodings = ""; while () { if (/^(0x[0-9a-fA-F]+)\s+([^:]*):(0x[0-9a-fA-F]+)/) { ($u, $e) = ($1, $2); $u = oct($u); if (!defined $old_u) { $old_u = $u; $encodings = convert($e); } elsif ($old_u ne $u) { add($encodings); $old_u = $u; $encodings = convert($e); } else { $encodings .= "|".convert($e); } } } if (defined $old_u) { add($encodings); } close TABLE; print <) { if (/^(0x[0-9a-fA-F]+)\s+([^:]*):(0x[0-9a-fA-F]+)/) { ($u, $e) = ($1, $2); $u = oct($u); if (!defined $old_u) { $old_u = $u; $encodings = convert($e); } elsif ($old_u ne $u) { output($start, $old_u, $combos{$encodings}); $start = $old_u + 1; $old_u = $u; $encodings = convert($e); } else { $encodings .= "|".convert($e); } } } if (defined $old_u) { output($start, $old_u, $combos{$encodings}); } close TABLE; print "\n};\n";