From d41d8a86dbd653f7738eafcab6f3018aa04151b1 Mon Sep 17 00:00:00 2001 From: nwf Date: Sat, 2 May 2009 01:53:07 -0400 Subject: [PATCH] First pass of Microsoft Comic Chat coder Ignore-this: 64bf98af35ae9e6de9ef29e103c407f3 darcs-hash:20090502055307-4d648-839a7d3479dc639b23f97cf2ea4866824f0560c9.gz --- MSCCCoder.pm | 129 ++++++++++++++++++++++++++++++++++++++++++++ MSCCCoder_filter.pl | 19 +++++++ 2 files changed, 148 insertions(+) create mode 100644 MSCCCoder.pm create mode 100644 MSCCCoder_filter.pl diff --git a/MSCCCoder.pm b/MSCCCoder.pm new file mode 100644 index 0000000..ef035c8 --- /dev/null +++ b/MSCCCoder.pm @@ -0,0 +1,129 @@ +use warnings; + +package Instance::MSCCCoder; + + +use Math::BaseCalc; +require Instance::HuffmanCoder; +use Instance::Definitions qw( %known_types + $instance_huffman_table1 ); + +my $MSCC_CHARS = [0,1,2,3,4,5,6,7,8,9,':',';','<','>','@','=']; +my $MSCC_ES_G = 6; +my $MSCC_ES_E = 6; + +################################################################# + +# The constructor takes a MasterCoder object and peers inside to +# borrow the coding characters. + +sub new ($$) { + my $class = shift @_; + my $mc = shift @_; + + return undef if not defined $mc; + return undef if not defined $$mc{'code_chars'}; + + my $hc = Instance::HuffmanCoder->new($mc, $instance_huffman_table1); + + bless { + 'mc' => $mc, + 'hc' => $hc, + 'tc' => new Math::BaseCalc(digits => $MSCC_CHARS), + 'nog' => $$mc{'code_chars'}[-1] x $MSCC_ES_G, + 'noe' => $$mc{'code_chars'}[-1] x $MSCC_ES_E, + }, $class; +} + +################################################################# + +sub encode($$) { + my ($self, $msg) = @_; + + my $mc = $$self{'mc'}; + my $tc = $$self{'tc'}; + + my $res = ""; + + if ($msg =~ /.*G(...).*/) { + my $val = $tc->from_base($1); + $res .= $mc->tencode_padded($val, $MSCC_ES_G); + } else { + $res .= $$self{'nog'}; + } + + if ($msg =~ /.*E(...).*/) { + my $val = $tc->from_base($1); + $res .= $mc->tencode_padded($val, $MSCC_ES_E); + } else { + $res .= $$self{'noe'}; + } + + $res .= $mc->tencode_padded( ($msg =~ /.*R.*/) ? 1 : 0, 1 ) ; + + if ($msg =~ /.*M(.).*/) { + my $val = $tc->from_base($1); + die "M0?" if $val == 0; + $res .= $mc->tencode_padded($val, 1); + } else { + $res .= $mc->tencode_padded(0, 1); + } + + if ($msg =~ /.*T(.*)$/) { + my $val .= $$self{'hc'}->encode($1); + $res .= $mc->tencode_padded(1, 1) . $val; + } else { + $res .= $mc->tencode_padded(0, 1); + } + + return $res; + +} + +sub decode($$) { + my ($self, $msg) = @_; + + my $mc = $self->{'mc'}; + my $tc = $$self{'tc'}; + + my $res = ""; + + { + my $g = substr $msg, 0 , $MSCC_ES_G; + if ($g ne $$self{'nog'}) { + my $val = $mc->tdecode($g); + $res .= "G" . sprintf "%.3d", $tc->to_base($val); + } + } + + { + my $e = substr $msg, $MSCC_ES_G, $MSCC_ES_E; + if ($e ne $$self{'noe'}) { + my $val = $mc->tdecode($e); + $res .= "E" . sprintf "%.3d", $tc->to_base($val); + } + } + + { + my $r = substr $msg, $MSCC_ES_G + $MSCC_ES_E, 1; + $res .= "R" if ($mc->tdecode($r) != 0); + } + + { + my $m = substr $msg, $MSCC_ES_G + $MSCC_ES_E + 1, 1; + my $val = $mc->tdecode($m); + $res .= "M$val" if $val != 0; + } + + { + my $t = substr $msg, $MSCC_ES_G + $MSCC_ES_E + 2; + if ($mc->tdecode(substr $t, 0, 1) != 0) { + my $val = $$self{'hc'}->decode(substr $t, 1) ; + $res .= "T$val"; + } + } + + return $res; +} + +1; diff --git a/MSCCCoder_filter.pl b/MSCCCoder_filter.pl new file mode 100644 index 0000000..4d3f5c5 --- /dev/null +++ b/MSCCCoder_filter.pl @@ -0,0 +1,19 @@ +use warnings; +use strict; +#use Data::Dumper; + +require Instance::MasterCoder; +require Instance::MSCCCoder; +use Instance::Definitions qw( @debug_code_chars $MESSAGE_START $MESSAGE_END ); + +my $mc = Instance::MasterCoder->new(\@debug_code_chars, $MESSAGE_START, $MESSAGE_END); +my $msccc = Instance::MSCCCoder->new($mc); + +print "FOO ", $mc->{'code_chars'}[0], "\n"; + +while(my $in = <>) { + chomp $in; + my $enc = $msccc->encode($in); + my $dec = $msccc->decode($enc); + print $in, " ==> ", $enc, " ==> ", $dec, "\n"; +} -- 2.50.1