]> hydra-www.ietfng.org Git - instirc/commitdiff
First pass of Microsoft Comic Chat coder
authornwf <nwf@cs.jhu.edu>
Sat, 2 May 2009 05:53:07 +0000 (01:53 -0400)
committernwf <nwf@cs.jhu.edu>
Sat, 2 May 2009 05:53:07 +0000 (01:53 -0400)
Ignore-this: 64bf98af35ae9e6de9ef29e103c407f3

darcs-hash:20090502055307-4d648-839a7d3479dc639b23f97cf2ea4866824f0560c9.gz

MSCCCoder.pm [new file with mode: 0644]
MSCCCoder_filter.pl [new file with mode: 0644]

diff --git a/MSCCCoder.pm b/MSCCCoder.pm
new file mode 100644 (file)
index 0000000..ef035c8
--- /dev/null
@@ -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 (file)
index 0000000..4d3f5c5
--- /dev/null
@@ -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";
+}