$row{table} = Encode::decode($row{set}, pack 'C*', $row{offset} .. $row{endpoint});
}
- if ($row{set} eq 'cp437') {
- if ($row{offset} <= 0xED and $row{endpoint} >= 0xED) {
- # replace phi glyph
- substr($row{table}, 0xED - $row{offset}, 1) = 'ϕ';
- }
- if ($row{offset} < 0x20) {
- # replace control characters by visible variants
- my $sub = substr ' ☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼', $row{offset};
- substr($row{table}, 0, length $sub) = $sub;
- }
- }
- elsif ($row{set} eq 'symbol') {
- if ($row{offset} <= 0x60 and $row{endpoint} >= 0x60) {
- # replace radical extender by closest unicode equivalent
- substr($row{table}, 0x60 - $row{offset}, 1) = '│';
- }
- if ($row{offset} <= 0xBD and $row{endpoint} >= 0xFF) {
- substr($row{table}, 0xBD - $row{offset}, 2) = '⏐⎯'; # arrow extenders
- substr($row{table}, 0xD2 - $row{offset}, 3) = '®©™'; # serif variants
- substr($row{table}, 0xE0 - $row{offset}, 1) = '◊'; # replace lookalike, should match AdobeSymbol
- substr($row{table}, 0xE2 - $row{offset}, 3) = '®©™'; # sans-serif variants
- substr($row{table}, 0xE6 - $row{offset}, 10) = '⎛⎜⎝⎡⎢⎣⎧⎨⎩⎪';
- substr($row{table}, 0xF0 - $row{offset}, 1) = '€';
- substr($row{table}, 0xF4 - $row{offset}, 11) = '⎮⌡⎞⎟⎠⎤⎥⎦⎫⎬⎭';
- }
- }
-
$row{endpoint} -= $row{offset};
$visible->{ascii} = # assume common base
Alert("Encoding <q>$input</q> unknown");
return;
}
+
+ if (my $replace = $charset->{replace}) {
+ while (my ($offset, $sub) = each %{$replace}) {
+ $offset -= $row{offset};
+
+ my $length = length $sub;
+
+ if ($offset < 0) {
+ $offset > -$length or next; # at least one character after start
+ # trim leftmost part to start at offset
+ substr($sub, 0, -$offset) = '';
+ $length += $offset;
+ $offset = 0;
+ }
+
+ if ((my $excess = $row{endpoint} - $offset - $length + 1) < 0) {
+ $excess > -$length or next;
+ # trim rightmost part to prevent overflow
+ substr($sub, $excess) = '';
+ $length += $excess;
+ }
+
+ substr($row{table}, $offset, $length) = $sub;
+ }
+ }
+
push @request, \%row;
}
tabinput($_) for @tablist;