elsif ($param =~ m{ \A cols = (\d+) \z }x) {
$row{cols} = $1;
}
- elsif ($param =~ m{ \A (?<offset> \d+) (?: [-] (?<endpoint> \d+) )? \z }x) {
+ elsif ($param =~ m{ \A (?<start> \d+) (?: [-] (?<end> \d+) )? \z }x) {
if (defined $row{endpoint}) {
# extend earlier range
- my $skip = int(($row{endpoint} || $row{offset}) / $row{cols});
- for ($skip + 1 .. ($+{offset} / $row{cols}) - 1) {
- $row{skip}->{ $_ * $row{cols} - $row{offset} }++;
+ my $skip = int(($row{endpoint} || $row{startpoint}) / $row{cols});
+ for ($skip + 1 .. ($+{start} / $row{cols}) - 1) {
+ $row{skip}->{ $_ * $row{cols} - $row{startpoint} }++;
}
}
else {
- $row{offset} = $+{offset};
+ $row{startpoint} = $+{start};
}
- $row{endpoint} = $+{endpoint} || 0;
+ $row{endpoint} = $+{end} || 0;
}
else {
Alert("Unknown option <q>$param</q> for charset $input");
$row{endpoint} = $end - $start;
$row{set} = sprintf 'Unicode block U+%02Xxx', $start >> 8;
$row{offset} = $start % 256;
+ $row{startpoint} = 0;
}
elsif (lc $input eq 'uu') {
$row{set} = 'Unicode planes';
$row{cell} = do 'charset-ucplanes.inc.pl'
or Alert('Table data could not be read', $@ || $!);
- $row{endpoint} = 1023 * $row{cell}->{colsize};
+ $row{endpoint} ||= 1023;
}
elsif (lc $input eq 'u') {
$row{cell} = do 'charset-unicode.inc.pl'
or Alert('Table data could not be read', $@ || $!);
$row{endpoint} ||= 8191;
- $row{endpoint} *= $row{cell}->{colsize};
- $row{startpoint} = $row{cell}->{colsize} * $row{offset};
- $row{offset} = 0;
$row{set} = 'Unicode ' . (
- $row{startpoint} < 0x10000 && $row{endpoint} < 0x10000 ? 'BMP' :
- $row{startpoint} >= 0x10000 && $row{endpoint} < 0x20000 ? 'SMP' :
+ $row{startpoint} < 0x1000 && $row{endpoint} < 0x1000 ? 'BMP' :
+ $row{startpoint} >= 0x1000 && $row{endpoint} < 0x2000 ? 'SMP' :
'allocations'
);
}
$row{endpoint} = 255;
}
elsif ($row{set} = Encode::resolve_alias($input)) {
+ $row{offset} = delete $row{startpoint};
$row{endpoint} ||= 255;
if ($row{set} eq 'MacHebrew' or $row{set} eq 'MacThai') {
# array of possibly multiple characters per code point
# substr strings is twice as fast as splitting to an array
$row{table} = Encode::decode($row{set}, pack 'C*', $row{offset} .. $row{endpoint});
}
- $row{endpoint} -= $row{offset};
if ($row{set} eq 'cp437') {
- if ($row{offset} <= 0xED and $row{endpoint} >= 0xED - $row{offset}) {
+ if ($row{offset} <= 0xED and $row{endpoint} >= 0xED) {
# replace phi glyph
substr($row{table}, 0xED - $row{offset}, 1) = 'ϕ';
}
}
}
elsif ($row{set} eq 'symbol') {
- if ($row{offset} <= 0x60 and $row{endpoint} >= 0x60 - $row{offset}) {
+ 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 - $row{offset}) {
+ 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
}
}
+ $row{endpoint} -= $row{offset};
+
$visible->{ascii} = # assume common base
$visible->{ $row{set} } = 1;
}
$len /= $colsize;
$name //= $len <= 2 ? 'res' : 'reserved';
- if (my $part = $offset/$colsize % $cols) {
+ if (my $part = ($offset/$colsize - $info->{startpoint}) % $cols) {
# continued row
my $rest = $cols - $part; # remaining
$rest = $len if $len < $rest; #TODO: optimise
my $coldigits = ceil(log($colsize * $cols) / log(16)); # uniform length of hexadecimal header
my $rowdiv = 16 ** $coldigits; # row divide for column digits
$rowdiv = 1 if $rowdiv != $cols * $colsize; # divide only if all columns are matched
- my $offset = $row->{startpoint} || 0;
+ my $offset = $row->{startpoint} * $colsize || 0;
printf '<div class="section"><table class="glyphs%s">', !$row->{cell} && ' charmap';
my $title = $row->{set};
print "\n";
}
print '<tbody>';
- while ($offset < $row->{endpoint}) {
+ while ($offset < $row->{endpoint} * $colsize) {
if ($row->{skip}->{$offset}) {
$offset += $cols * $colsize;
next;