require("getopts.pl");
do Getopts('v');
while (<>) {
$stuff .= $_;
}
%seqtable = ( "@", 0,
"(R", "REMOTE",
"(", "VARIABLE",
"U", 1,
"\\", 2,
"\$", 2,
"r", 1,
".", "SPECIAL",
"i", "SPECIAL1",
"\000", 2,
"\001", 22
);
$esc = "\033";
$skipcount = 0;
$curpos = 0;
$verbose = $opt_v;
sub do_remote_command {
print "\n";
printf "%08x ", $curpos;
print "1b ( R ";
substr($stuff, 0, 3) = "";
$curpos += 3;
$lchar = substr($stuff, 0, 1);
$nlchar = unpack("C", $lchar);
$hchar = substr($stuff, 1, 1);
$nhchar = unpack("C", $hchar);
printf "%02x %02x ", $nlchar, $nhchar;
$skipchars = ($nhchar * 256) + $nlchar;
substr($stuff, 0, 2) = "";
$curpos += 2;
for ($i = 0; $i < $skipchars; $i++) {
$char = substr($stuff, $i, 1);
$nchar = unpack("C", $char);
if ($nchar >= 32 && $nchar < 127) {
print $char;
} else {
printf "%02x ", $nchar;
}
}
substr($stuff, 0, $skipchars) = "";
$curpos += skipchars;
while (substr($stuff, 0, 2) =~ /[A-Z0-9][A-Z0-9]/) {
print "\n";
printf "%08x ", $curpos;
my ($cmd) = substr($stuff, 0, 2);
print substr($stuff, 0, 2);
substr($stuff, 0, 2) = "";
$curpos += 2;
$lchar = substr($stuff, 0, 1);
$nlchar = unpack("C", $lchar);
$hchar = substr($stuff, 1, 1);
$nhchar = unpack("C", $hchar);
if ($cmd eq "DF") {
$skipchars = 0;
} else {
$skipchars = ($nhchar * 256) + $nlchar;
}
printf "%02x %02x ", $nlchar, $nhchar;
substr($stuff, 0, 2) = "";
$curpos += 2;
for ($i = 0; $i < $skipchars; $i++) {
printf "%02x ", unpack("C", substr($stuff, $i, 1));
}
substr($stuff, 0, $skipchars) = "";
$curpos += $skipchars;
}
}
sub do_special_command {
print "\n";
printf "%08x ", $curpos;
print "1b ";
for ($i = 1; $i < 8; $i++) {
$char = substr($stuff, $i, 1);
$nchar = unpack("C", $char);
if ($i < 2 && $nchar >= 32 && $nchar < 127) {
print " $char ";
} else {
printf "%02x ", unpack("C", $char);
}
}
$comptype = unpack("C", substr($stuff, 2, 1));
$dots = unpack("v", substr($stuff, 6, 2));
$something = unpack("C", substr($stuff, 5, 1));
print " ($dots, $something) ";
$savedots = $dots;
$dots *= $something;
$curpos += 8;
substr($stuff, 0, 8) = "";
if ($comptype == 0) {
$bytes = ($dots + 7) / 8;
if ($verbose) {
for ($k = 0; $k < $bytes; $k++) {
$char = substr($stuff, $k, 1);
printf "%02x", unpack("C", $char);
}
}
$curpos += $bytes;
substr($stuff, 0, $bytes) = "";
} elsif ($comptype == 1) {
while ($something > 0) {
$dots = $savedots;
while ($dots > 0) {
$counter = unpack("C", substr($stuff, 0, 1));
$curpos++;
substr($stuff, 0, 1) = "";
if ($counter <= 127) {
$counter++;
if ($verbose) {
for ($k = 0; $k < $counter; $k++) {
$char = substr($stuff, $k, 1);
printf "%02x ", unpack("C", $char);
}
}
$curpos += $counter;
substr($stuff, 0, $counter) = "";
$dots -= 8 * $counter;
} else {
$counter = 257 - $counter;
if ($verbose) {
for ($k = 0; $k < $counter; $k++) {
$char = substr($stuff, 0, 1);
printf "%02x ", unpack("C", $char);
}
}
$curpos++;
substr($stuff, 0, 1) = "";
$dots -= 8 * $counter;
}
}
$something--;
}
} else {
print "\nUnknown compression type $comptype!\n";
}
}
sub do_special1_command {
print "\n";
printf "%08x ", $curpos;
print "1b ";
for ($i = 1; $i < 9; $i++) {
$char = substr($stuff, $i, 1);
$nchar = unpack("C", $char);
if ($i < 2 && $nchar >= 32 && $nchar < 127) {
print " $char ";
} else {
printf "%02x ", unpack("C", $char);
}
}
$comptype = unpack("C", substr($stuff, 3, 1));
$bitsperpixel = unpack("C", substr($stuff, 4, 1));
$dots = unpack("v", substr($stuff, 5, 2));
$something = unpack("v", substr($stuff, 7, 2));
print " ($dots, $something, $bitsperpixel) ";
$dots *= 8;
$savedots = $dots;
$dots *= $something;
$curpos += 9;
substr($stuff, 0, 9) = "";
if ($comptype == 0) {
$bytes = ($dots + 7) / 8;
if ($verbose) {
for ($k = 0; $k < $bytes; $k++) {
$char = substr($stuff, $k, 1);
printf "%02x", unpack("C", $char);
}
}
$curpos += $bytes;
substr($stuff, 0, $bytes) = "";
} elsif ($comptype == 1) {
while ($something > 0) {
$dots = $savedots;
while ($dots > 0) {
$counter = unpack("C", substr($stuff, 0, 1));
$curpos++;
substr($stuff, 0, 1) = "";
if ($counter <= 127) {
$counter++;
if ($verbose) {
for ($k = 0; $k < $counter; $k++) {
$char = substr($stuff, $k, 1);
printf "%02x ", unpack("C", $char);
}
}
$curpos += $counter;
substr($stuff, 0, $counter) = "";
$dots -= 8 * $counter;
} else {
$counter = 257 - $counter;
if ($verbose) {
$char = substr($stuff, 0, 1);
for ($k = 0; $k < $counter; $k++) {
printf "%02x ", unpack("C", $char);
}
}
$curpos++;
substr($stuff, 0, 1) = "";
$dots -= 8 * $counter;
}
}
$something--;
if ($something > 0 && $verbose) {
print "\n ";
}
}
} else {
print "\nUnknown compression type $comptype!\n";
}
}
while ($stuff ne "") {
if (substr($stuff, 0, 1) eq "$esc") {
$found = 0;
foreach $key (sort { length $b <=> length $a } keys %seqtable) {
if (substr($stuff, 1, length $key) eq $key) {
$skipchars = $seqtable{$key};
if ($skipchars eq "SPECIAL") {
do_special_command;
$found = 2;
} elsif ($skipchars eq "SPECIAL1") {
do_special1_command;
$found = 2;
} elsif ($skipchars eq "REMOTE") {
do_remote_command;
$found = 2;
} else {
print "\n";
printf "%08x ", $curpos;
print "1b ";
$startoff = 0;
if ($skipchars eq "VARIABLE") {
$kchar = substr($stuff, (length $key) + 1, 1);
$nkchar = unpack("C", $kchar);
$lchar = substr($stuff, (length $key) + 2, 1);
$nlchar = unpack("C", $lchar);
$hchar = substr($stuff, (length $key) + 3, 1);
$nhchar = unpack("C", $hchar);
$skipchars = ($nhchar * 256) + $nlchar;
$startoff = 3;
}
for ($i = 0;
$i < $skipchars + (length $key) + $startoff;
$i++) {
$char = substr($stuff, $i + 1, 1);
$nchar = unpack("C", $char);
if ($i < 3 && $nchar >= 32 && $nchar < 127) {
print " $char ";
} else {
printf "%02x ", unpack("C", $char);
}
}
$found = 1;
}
$bytes = length($key) + 1 + $skipchars + $startoff;
last;
}
}
if (! $found) {
print "\n";
printf "%08x ", $curpos;
print "1b ";
substr($stuff, 0, 1) = "";
$curpos += 1;
} elsif ($found == 1) {
substr($stuff, 0, $bytes) = "";
$curpos += $bytes;
} else {
}
} else {
$char = substr($stuff, 0, 1);
$nchar = unpack("C", $char);
if ($nchar >= 32 && $nchar < 127) {
print " *$char ";
} else {
printf "*%02x ", unpack("C", $char);
}
$curpos++;
substr($stuff, 0, 1) = "";
}
}