#!/usr/bin/perl -w use strict; sub syntax { print <= 2 ** ($b - 1)) { return -(2 ** $b - $h); } else { return $h; } } # Process one proto packet. sub prcmd { my ($cmd, $c, @v) = @_; # Return if not wanted. return unless exists $$cmd{$c}; print $c; # Print each args. for (@{$$cmd{$c}}) { /^(\d+)-(\d+)(?:\.(\d+))?(u?)$/o; my $fp = 0; $fp = $3 if $3; if ($4 eq 'u') { print ' ', (cvhexu @v[$1 - 1 .. $2 - 1]) / (1 << $fp); } else { print ' ', (cvhex @v[$1 - 1 .. $2 - 1]) / (1 << $fp); } } print "\n"; }; # Read command line. my %cmd; my ($acmd, @acmdl); while ($_ = shift) { # Command char. /^[a-zA-Z]$/ and do { $cmd{$acmd} = [ @acmdl ] if defined $acmd; @acmdl = (); $acmd = $_; next; }; # Single arg. /^(\d+)(\.\d+)?(u?)$/ and do { syntax if !defined $acmd; push @acmdl, "$1-$1$2"; next; }; # Range arg. /^(\d+)-(\d+)(\.\d+)?(u?)$/ and do { syntax if !defined $acmd; syntax if $2 <= $1; push @acmdl, $_; next; }; syntax; } $cmd{$acmd} = [ @acmdl ] if defined $acmd; syntax if !scalar %cmd; # For each line. while (<>) { chomp; # Match a proto packet. if (/^!([a-zA-Z])(?:[a-f0-9]{2})*$/o) { my $c = $1; s/^!([a-zA-Z])//; my @args = /[a-f0-9]{2}/og; prcmd \%cmd, $c, @args; } if (/^#.*$/o) { print "$_\n"; } }