diff options
author | Roger Leigh <rleigh@debian.org> | 2008-10-26 17:28:54 +0000 |
---|---|---|
committer | Roger Leigh <rleigh@debian.org> | 2008-10-26 17:28:54 +0000 |
commit | 33a17feb28af2d2aeabc8c7ab5ef509ea3de15a7 (patch) | |
tree | d444cf1a245694bd049a9e6722c41b8f280ad429 /test/parse-escp2 | |
parent | 9d82a443d65ea3e4e015ba6988208231fa8fdc77 (diff) |
Imported Upstream version 5.2.1
Diffstat (limited to 'test/parse-escp2')
-rwxr-xr-x | test/parse-escp2 | 409 |
1 files changed, 222 insertions, 187 deletions
diff --git a/test/parse-escp2 b/test/parse-escp2 index ae95a5f..4664955 100755 --- a/test/parse-escp2 +++ b/test/parse-escp2 @@ -1,6 +1,6 @@ #!/usr/bin/perl -# Copyright 2000-2007 Robert Krawitz <rlk@alum.mit.edu> +# Copyright 2000-2008 Robert Krawitz <rlk@alum.mit.edu> # # This program is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by the Free @@ -26,8 +26,10 @@ use vars qw($atend $opt_v $opt_V $opt_O + $curoffset $curpos $esc + $initial_vertical_position $page_mgmt_unit $horizontal_position $horizontal_unit @@ -37,9 +39,21 @@ use vars qw($atend $raster_y $print_offsets %seqtable + @seqkeys + %chartable + %xchartable + %nchartable + %rchartable + %keylengths + $total_length @offsets); $atend = 0; +%chartable = (); +%xchartable = (); +%nchartable = (); +%rchartable = (); +%keylengths = (); %seqtable = ( "@", 0, "(R", "REMOTE", @@ -55,37 +69,64 @@ $atend = 0; "\001", 22 ); +map { + my ($xchar) = pack("C", $_); + if ($_ >= 32 && $_ < 127) { + $chartable{$xchar} = " $xchar"; + $xchartable{$xchar} = " *$xchar"; + $rchartable{$xchar} = $xchar; + } else { + $chartable{$xchar} = sprintf("%02x", $_); + $xchartable{$xchar} = sprintf("*%02x", $_); + $rchartable{$xchar} = sprintf("%02x ", $_); + } + $nchartable{$xchar} = $_; +} (0..255); + +@seqkeys = (sort { length $b <=> length $a } keys %seqtable); + +map { $keylengths{$_} = length $_ } @seqkeys; + $esc = "\033"; $curpos = 0; +$curoffset = 0; $page_mgmt_unit = 360; $horizontal_unit = 180; $vertical_unit = 360; +$initial_vertical_position = 0; $vertical_position = 0; $horizontal_position = 0; $print_offsets = 0; +$total_length = 0; -sub get_stuff($) { +sub fill_buffer($) { my ($where) = @_; - my ($end) = length $stuff; + return 1 if $total_length - $curoffset >= $where; + my ($end) = $total_length - $curoffset; if ($curpos == 0 && $end == 0) { $stuff = <>; # Need to do this once to "activate" ARGV - $end = length $stuff; + $total_length = length $stuff; + $end = $total_length - $curoffset; } - my ($old_end) = length $stuff; + my ($old_end) = $end; my ($tmp); - my ($bytes_to_read) = 4096; + my ($bytes_to_read) = 16384; if ($where - $end > $bytes_to_read) { $bytes_to_read = $where - $end; } + if ($curoffset >= 16384) { + substr($stuff, 0, $curoffset) = ""; + $total_length -= $curoffset; + $curoffset = 0; + } while ($end < $where) { my $foo = read ARGV, $tmp, $bytes_to_read; -# print STDERR length $tmp, " ", length $stuff, " $curpos $where $bytes_to_read $foo $!", "\n"; $stuff .= $tmp; -# print STDERR length $tmp, " ", length $stuff, " $curpos $where $bytes_to_read $foo $!", "\n\n"; - $end = length $stuff; + $end += $foo; + $total_length += $foo; if ($old_end == $end) { $atend = 1; return 0; @@ -99,8 +140,18 @@ sub get_stuff($) { sub increment_curpos($) { my ($curpos_increment) = @_; - substr($stuff, 0, $curpos_increment) = ""; $curpos += $curpos_increment; + $curoffset += $curpos_increment; +} + +# This slows things down tremendously... +sub xdata($;$) { + my ($start, $end) = @_; + if (defined $end) { + return substr($stuff, $start + $curoffset, $end); + } else { + return substr($stuff, $start + $curoffset); + } } sub do_remote_command() { @@ -108,73 +159,54 @@ sub do_remote_command() { printf "%08x ", $curpos; print "1b ( R "; increment_curpos(3); - get_stuff(2); - my $lchar = substr($stuff, 0, 1); - my $nlchar = unpack("C", $lchar); - my $hchar = substr($stuff, 1, 1); - my $nhchar = unpack("C", $hchar); - printf "%02x %02x ", $nlchar, $nhchar; + fill_buffer(2); + my $lchar = substr($stuff, $curoffset + 0, 1); + my $nlchar = $nchartable{$lchar}; + my $hchar = substr($stuff, $curoffset + 1, 1); + my $nhchar = $nchartable{$hchar}; + printf " %02x %02x ", $nlchar, $nhchar; my $skipchars = ($nhchar * 256) + $nlchar; increment_curpos(2); - my $i; - my $char; - my $nchar; - get_stuff($skipchars); - 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; - } + fill_buffer($skipchars); + for (my $i = 0; $i < $skipchars; $i++) { + print $rchartable{substr($stuff, $curoffset + $i, 1)}; } increment_curpos($skipchars); - while (get_stuff(2) && - substr($stuff, 0, 2) =~ /[A-Z0-9][A-Z0-9]/) { + while (fill_buffer(2) && + substr($stuff, $curoffset + 0, 2) =~ /[A-Z0-9][A-Z0-9]/) { print "\n"; printf "%08x ", $curpos; - my ($cmd) = substr($stuff, 0, 2); + my ($cmd) = substr($stuff, $curoffset + 0, 2); print $cmd; increment_curpos(2); - get_stuff(2); - $lchar = substr($stuff, 0, 1); - $nlchar = unpack("C", $lchar); - $hchar = substr($stuff, 1, 1); - $nhchar = unpack("C", $hchar); + fill_buffer(2); + $lchar = substr($stuff, $curoffset + 0, 1); + $nlchar = $nchartable{$lchar}; + $hchar = substr($stuff, $curoffset + 1, 1); + $nhchar = $nchartable{$hchar}; if ($cmd eq "DF") { $skipchars = 0; } else { $skipchars = ($nhchar * 256) + $nlchar; } - printf "%02x %02x ", $nlchar, $nhchar; + printf " %02x %02x ", $nlchar, $nhchar; increment_curpos(2); - get_stuff($skipchars); - for ($i = 0; $i < $skipchars; $i++) { - printf "%02x ", unpack("C", substr($stuff, $i, 1)); - } + fill_buffer($skipchars); + printf "%*v02x ", " ", substr($stuff, $curoffset, $skipchars); increment_curpos($skipchars); } } -sub print_prefix_bytes($) { +sub print_prefix_bytes($$) { my ($bytes_to_print) = @_; print "\n"; printf "%08x ", $curpos; print "1b "; - my $i; - my $char; - my $nchar; - get_stuff($bytes_to_print); - for ($i = 1; $i < $bytes_to_print; $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); - } - } + fill_buffer($bytes_to_print); + my $char = substr($stuff, $curoffset + 1, 1); + print "$chartable{$char} "; + printf "%*v02x ", " ", substr($stuff, $curoffset + 2, $bytes_to_print - 2); + increment_curpos($bytes_to_print); } sub print_output_data($$$$$$) { @@ -193,25 +225,25 @@ sub print_output_data($$$$$$) { } my $savedots = $dots; if ($comptype == 0) { + fill_buffer($dots / 8); if ($opt_V) { - get_stuff($dots); - printf "%*v02x ", " ", substr($stuff, 0, $dots); + printf "%*v02x ", " ", substr($stuff, $curoffset + 0, $dots / 8); } - increment_curpos($dots); + increment_curpos($dots / 8); } elsif ($comptype == 1) { foreach $i (0..$rows-1) { my ($found_something) = 0; $dots = $savedots; - my ($tstuff) = "\n $i ";; + my ($tstuff) = "\n $i "; while ($dots > 0) { - get_stuff(1); - $counter = ord(substr($stuff, 0, 1)); + fill_buffer(1); + $counter = ord(substr($stuff, $curoffset + 0, 1)); increment_curpos(1); if ($counter <= 127) { $counter++; - get_stuff($counter); + fill_buffer($counter); if ($opt_v || $opt_V) { - my $tmp = sprintf "%*v02x ", " ", substr($stuff, 0, $counter); + my $tmp = sprintf "%*v02x ", " ", substr($stuff, $curoffset + 0, $counter); if (!($tmp =~ /^[0 ]+$/)) { $found_something = 1; $last_row = $i; @@ -226,9 +258,9 @@ sub print_output_data($$$$$$) { increment_curpos($counter); } else { $counter = 257 - $counter; - get_stuff(1); + fill_buffer(1); if ($opt_v || $opt_V) { - $fchar = sprintf "%v02x ", substr($stuff, 0, 1); + $fchar = sprintf "%v02x ", substr($stuff, $curoffset + 0, 1); if ($fchar ne "00 ") { $found_something = 1; $last_row = $i; @@ -248,63 +280,63 @@ sub print_output_data($$$$$$) { $vstuff .= $tstuff; } } - if ($opt_v) { - my ($offset) = $offsets[$color]; - my ($first_position) = ($vertical_position / $vertical_unit) - + ($first_row + $offset) * $raster_y; - my ($last_position) = ($vertical_position / $vertical_unit) - + ($last_row + $offset) * $raster_y; - my ($final_position) = ($vertical_position / $vertical_unit) - + ($rows + $offset) * $raster_y; - my ($final_horizontal) = $horizontal_position + - ($real_dots * $page_mgmt_unit * $raster_x); - if ($print_offsets) { - printf (" %d,%d+%d %.4f %d,%d+%d %.4f %.4f) ", - $horizontal_position, $first_row, $offset, $first_position, - $final_horizontal, $last_row, $offset, $last_position, - $final_position); - } else { - printf (" %d,%d %.4f %d,%d %.4f %.4f) ", - $horizontal_position, $first_row, $first_position, - $final_horizontal, $last_row, $last_position, - $final_position); - } - } - if ($opt_V) { - print " $vstuff"; - } } else { print "\nUnknown compression type $comptype!\n"; } + if ($opt_v) { + my ($offset) = $offsets[$color]; + my ($first_position) = ($vertical_position / $vertical_unit) + + ($first_row + $offset) * $raster_y; + my ($last_position) = ($vertical_position / $vertical_unit) + + ($last_row + $offset) * $raster_y; + my ($final_position) = ($vertical_position / $vertical_unit) + + ($rows + $offset) * $raster_y; + my ($final_horizontal) = $horizontal_position + + ($real_dots * $page_mgmt_unit * $raster_x); + if ($print_offsets) { + printf (" %d,%d+%d %.4f %d,%d+%d %.4f %.4f) ", + $horizontal_position, $first_row, $offset, $first_position, + $final_horizontal, $last_row, $offset, $last_position, + $final_position); + } else { + printf (" %d,%d %.4f %d,%d %.4f %.4f) ", + $horizontal_position, $first_row, $first_position, + $final_horizontal, $last_row, $last_position, + $final_position); + } + } + if ($opt_V) { + print " $vstuff"; + } } sub do_special_command() { - get_stuff(8); - my $comptype = unpack("C", substr($stuff, 2, 1)); + fill_buffer(8); + my $comptype = $nchartable{substr($stuff, $curoffset + 2, 1)}; my $color = 0; - my $dots = unpack("v", substr($stuff, 6, 2)); - my $rows = unpack("C", substr($stuff, 5, 1)); - print_prefix_bytes(8); - increment_curpos(8); + my $dots = unpack("v", substr($stuff, $curoffset + 6, 2)); + my $rows = $nchartable{substr($stuff, $curoffset + 5, 1)}; + print_prefix_bytes(8, 2); print_output_data($comptype, 1, $dots, $rows, 8, $color); - get_stuff(1); - while (substr($stuff, 0, 1) eq "\r") { + fill_buffer(1); + while (substr($stuff, $curoffset + 0, 1) eq "\r") { + fill_buffer(1); increment_curpos(1); } } sub do_special1_command() { - get_stuff(9); - my $color = unpack("C", substr($stuff, 2, 1)); - my $comptype = unpack("C", substr($stuff, 3, 1)); - my $bitsperpixel = unpack("C", substr($stuff, 4, 1)); - my $dots = unpack("v", substr($stuff, 5, 2)); - my $rows = unpack("v", substr($stuff, 7, 2)); - print_prefix_bytes(9); - increment_curpos(9); + fill_buffer(9); + my $color = $nchartable{substr($stuff, $curoffset + 2, 1)}; + my $comptype = $nchartable{substr($stuff, $curoffset + 3, 1)}; + my $bitsperpixel = $nchartable{substr($stuff, $curoffset + 4, 1)}; + my $dots = unpack("v", substr($stuff, $curoffset + 5, 2)); + my $rows = unpack("v", substr($stuff, $curoffset + 7, 2)); + print_prefix_bytes(9, 1); print_output_data($comptype, $bitsperpixel, $dots, $rows, 1, $color); - get_stuff(1); - while (substr($stuff, 0, 1) eq "\r") { + fill_buffer(1); + while (substr($stuff, $curoffset + 0, 1) eq "\r") { + fill_buffer(1); increment_curpos(1); } } @@ -331,13 +363,13 @@ sub get_short($) { sub get_byte($) { my ($string) = @_; - return unpack("C", $string); + return $nchartable{$string}; } if ($opt_O) { - my (@stuff) = split /,/, $opt_O; + my (@stuff) = split(/,/, $opt_O); map { - my ($key, $val) = split /=/; + my ($key, $val) = split(/=/, $_); if ($val) { $print_offsets = 1; } @@ -360,12 +392,15 @@ while (! $atend) { my $char; my $nchar; my $bytes; - get_stuff(2); - if (substr($stuff, 0, 1) eq "$esc") { + my ($maxklen) = $keylengths{$seqkeys[0]}; + fill_buffer(1); + my $cchar = substr($stuff, $curoffset + 0, 1); + if ($cchar eq "$esc") { $found = 0; - foreach $key (sort { length $b <=> length $a } keys %seqtable) { - get_stuff(1 + length $key); - if (substr($stuff, 1, length $key) eq $key) { + fill_buffer(2 + $maxklen); + foreach $key (@seqkeys) { + my ($klen) = $keylengths{$key}; + if (substr($stuff, $curoffset + 1, $klen) eq $key) { $skipchars = $seqtable{$key}; if ($skipchars eq "SPECIAL") { do_special_command(); @@ -382,77 +417,89 @@ while (! $atend) { print "1b "; $startoff = 0; my $print_stuff = 0; + my $print_variable = 0; if ($skipchars eq "VARIABLE") { - get_stuff((length $key) + 3); - $kchar = substr($stuff, (length $key) + 1, 1); + fill_buffer(3); + $print_variable = 1; + $kchar = substr($stuff, $curoffset + $klen + 1, 1); $nkchar = unpack("C", $kchar); - $lchar = substr($stuff, (length $key) + 2, 1); + $lchar = substr($stuff, $curoffset + $klen + 2, 1); $nlchar = unpack("C", $lchar); - $hchar = substr($stuff, (length $key) + 3, 1); + $hchar = substr($stuff, $curoffset + $klen + 3, 1); $nhchar = unpack("C", $hchar); $skipchars = ($nhchar * 256) + $nlchar; $startoff = 3; $print_stuff = 1; } - get_stuff($skipchars + (length $key) + $startoff + 1); - 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); + my ($blen) = $skipchars + $klen + $startoff; + fill_buffer($blen + 1); + $char = substr($stuff, $curoffset + 1, 1); + print "$chartable{$char} "; + if ($blen > 1) { + $char = substr($stuff, $curoffset + 2, 1); + print "$chartable{$char} "; + if ($blen > 2) { + if ($print_variable && $char eq "d") { + printf ("%*v02x ", " ", + substr($stuff, $curoffset + 3, 2)); + } else { + printf ("%*v02x ", " ", + substr($stuff, $curoffset + 3, $blen - 2)); + } } } if ($print_stuff) { - my $xchar = substr($stuff, 2, 1); + my $xchar = substr($stuff, $curoffset + 2, 1); if ($xchar eq "c") { my ($top, $bottom); if ($skipchars == 8) { - $top = get_long(substr($stuff, 5, 4)); - $bottom = get_long(substr($stuff, 9, 4)); + $top = get_long(substr($stuff, $curoffset + 5, 4)); + if ($opt_v) { + $bottom = get_long(substr($stuff, $curoffset + 9, 4)); + } } else { - $top = get_short(substr($stuff, 5, 2)); - $bottom = get_short(substr($stuff, 7, 2)); + $top = get_short(substr($stuff, $curoffset + 5, 2)); + if ($opt_v) { + $bottom = get_short(substr($stuff, $curoffset + 7, 2)); + } } if ($opt_v) { printf (" (page format %d %d %.2f %.2f)", $top, $bottom, $top / $page_mgmt_unit, $bottom / $page_mgmt_unit); } - $vertical_position = + $initial_vertical_position = $top * $vertical_unit / $page_mgmt_unit; + $vertical_position = $initial_vertical_position; } elsif ($xchar eq "S") { - my ($width, $height); - if ($skipchars == 8) { - $width = get_long(substr($stuff, 5, 4)); - $height = get_long(substr($stuff, 9, 4)); - } else { - $width = get_short(substr($stuff, 5, 2)); - $height = get_short(substr($stuff, 7, 2)); - } if ($opt_v) { + my ($width, $height); + if ($skipchars == 8) { + $width = get_long(substr($stuff, $curoffset + 5, 4)); + $height = get_long(substr($stuff, $curoffset + 9, 4)); + } else { + $width = get_short(substr($stuff, $curoffset + 5, 2)); + $height = get_short(substr($stuff, $curoffset + 7, 2)); + } printf (" (paper size %d %d %.2f %.2f)", $width, $height, $width / $page_mgmt_unit, $height / $page_mgmt_unit); } } elsif ($xchar eq "C") { - my ($length); - if ($skipchars == 4) { - $length = get_long(substr($stuff, 5, 4)); - } else { - $length = get_short(substr($stuff, 5, 2)); - } if ($opt_v) { + my ($length); + if ($skipchars == 4) { + $length = get_long(substr($stuff, $curoffset + 5, 4)); + } else { + $length = get_short(substr($stuff, $curoffset + 5, 2)); + } printf (" (page length %d %.2f)", $length, $length / $page_mgmt_unit); } } elsif ($xchar eq "D") { - my $base = get_short(substr($stuff, 5, 2)); - my $y = get_byte(substr($stuff, 7, 1)); - my $x = get_byte(substr($stuff, 8, 1)); + my $base = get_short(substr($stuff, $curoffset + 5, 2)); + my $y = $nchartable{substr($stuff, $curoffset + 7, 1)}; + my $x = $nchartable{substr($stuff, $curoffset + 8, 1)}; $raster_x = $x / $base; $raster_y = $y / $base; if ($opt_v) { @@ -461,10 +508,10 @@ while (! $atend) { } } elsif ($xchar eq "U") { if ($skipchars == 5) { - my $page_mgmt = get_byte(substr($stuff, 5, 1)); - my $vertical = get_byte(substr($stuff, 6, 1)); - my $horiz = get_byte(substr($stuff, 7, 1)); - my $scale = get_short(substr($stuff, 8, 2)); + my $page_mgmt = $nchartable{substr($stuff, $curoffset + 5, 1)}; + my $vertical = $nchartable{substr($stuff, $curoffset + 6, 1)}; + my $horiz = $nchartable{substr($stuff, $curoffset + 7, 1)}; + my $scale = get_short(substr($stuff, $curoffset + 8, 2)); $page_mgmt_unit = $scale / $page_mgmt; $horizontal_unit = $scale / $horiz; $vertical_unit = $scale / $vertical; @@ -474,20 +521,20 @@ while (! $atend) { $vertical_unit, $horizontal_unit); } } else { - my $page_mgmt = get_byte(substr($stuff, 5, 1)); + my $page_mgmt = $nchartable{substr($stuff, $curoffset + 5, 1)}; if ($opt_v) { - printf " (units base = %d/720)", $page_mgmt; + printf " (units base = %d/3600)", $page_mgmt; } - $page_mgmt_unit = $page_mgmt; - $horizontal_unit = $page_mgmt; - $vertical_unit = $page_mgmt; + $page_mgmt_unit = 3600 / $page_mgmt; + $horizontal_unit = 3600 / $page_mgmt; + $vertical_unit = 3600 / $page_mgmt; } } elsif ($xchar eq "v") { my ($length); if ($skipchars == 4) { - $length = get_long(substr($stuff, 5, 4)); + $length = get_long(substr($stuff, $curoffset + 5, 4)); } else { - $length = get_short(substr($stuff, 5, 2)); + $length = get_short(substr($stuff, $curoffset + 5, 2)); } $vertical_position += $length; if ($opt_v) { @@ -496,24 +543,25 @@ while (! $atend) { $vertical_position / $vertical_unit); } } elsif ($xchar eq "\$") { - my ($length); if ($skipchars == 4) { $horizontal_position = - get_long(substr($stuff, 5, 4)); + get_long(substr($stuff, $curoffset + 5, 4)); } else { $horizontal_position = - get_short(substr($stuff, 5, 2)); + get_short(substr($stuff, $curoffset + 5, 2)); } if ($opt_v) { printf (" (horizontal position %d %.4f)", $horizontal_position, $horizontal_position / $horizontal_unit); } + } elsif ($xchar eq "d") { + printf " (nop)"; } } $found = 1; } - $bytes = length($key) + 1 + $skipchars + $startoff; + $bytes = $klen + 1 + $skipchars + $startoff; last; } } @@ -525,29 +573,16 @@ while (! $atend) { } elsif ($found == 1) { increment_curpos($bytes); } - } elsif (substr($stuff, 0, 1) eq "\0" || - substr($stuff, 0, 1) eq "\f") { - get_stuff(1); - $char = substr($stuff, 0, 1); - $nchar = unpack("C", $char); - if ($nchar >= 32 && $nchar < 127) { - print " $char "; - } else { - printf "%02x ", unpack("C", $char); - } + } elsif ($cchar eq "\0" || $cchar eq "\f") { + printf "\n%08x ", $curpos; + print "$chartable{$cchar} "; + $vertical_position = $initial_vertical_position; increment_curpos(1); } else { - get_stuff(1); - $char = substr($stuff, 0, 1); - $nchar = unpack("C", $char); - if ($nchar >= 32 && $nchar < 127) { - print " *$char "; - } else { - printf "*%02x ", unpack("C", $char); - } + print "$xchartable{$cchar} " if ($cchar ne "\021"); increment_curpos(1); } } -print "\n"; +print "\n" if $curpos > 1; |