#!/usr/bin/perl -w use strict; sub syntax { print <= 2 ** ($b - 1)) { return -(2 ** $b - $h); } else { return $h; } } sub prcmd { my ($cmd, $c, @v) = @_; return unless exists $$cmd{$c}; print $c; 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"; }; my %cmd; my ($acmd, @acmdl); while ($_ = shift) { /^[a-zA-Z]$/ and do { $cmd{$acmd} = [ @acmdl ] if defined $acmd; @acmdl = (); $acmd = $_; next; }; /^(\d+)(\.\d+)?(u?)$/ and do { syntax if !defined $acmd; push @acmdl, "$1-$1$2"; next; }; /^(\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; while (<>) { chomp; 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; } }