--- kgsueme/doc/doc2messages.xsl 2003/06/04 19:12:51 1.1
+++ kgsueme/doc/doc2messages.xsl 2003/06/05 10:09:10 1.2
@@ -3,35 +3,385 @@
-
+
+
+my $data; # stores currently processed decoding/encoding packet
+
+# primitive enc/decoders
+
+#############################################################################
+
+sub dec_U8 {
+ (my ($r), $data) = unpack "C a*", $data; $r;
+}
+
+sub dec_U16 {
+ (my ($r), $data) = unpack "v a*", $data; $r;
+}
+
+sub dec_U32 {
+ (my ($r), $data) = unpack "V a*", $data; $r;
+}
+
+sub dec_U64 {
+ my ($lo, $hi) = (dec_U32, dec_U32);
+ $lo + $hi * 2**32;
+}
+
+sub dec_I8 {
+ (my ($r), $data) = unpack "c a*", $data;
+ $r;
+}
+
+sub dec_I16 {
+ (my ($r), $data) = unpack "v a*", $data;
+ unpack "s", pack "S", $r;
+}
+
+sub dec_I32 {
+ (my ($r), $data) = unpack "V a*", $data;
+ unpack "i", pack "I", $r;
+}
+
+sub dec_DATA {
+ (my ($r), $data) = ($data, ""); $r;
+}
+
+sub dec_STRING {
+ $data =~ s/^((?:..)*?)(?:\x00\x00|\Z)//s;
+ # use Encode...
+ join "", map chr, unpack "v*", $1;
+}
+
+sub dec_CONSTANT {
+ $_[0];
+}
+
+sub dec_HEX { # for debugging
+ "HEX: " . unpack "H*", $data;#d#
+}
+
+sub enc_HEX {
+ die "enc_HEX not defined for good";
+}
+
+#############################################################################
+
+sub enc_U8 {
+ $data .= pack "C", $_[0];
+}
+
+sub enc_U16 {
+ $data .= pack "v", $_[0];
+}
+
+sub enc_U32 {
+ $data .= pack "V", $_[0];
+}
+
+sub enc_U64 {
+ enc_U32 $_[0] & 0xffffffff;
+ enc_U32 +($_[0] >> 32) & 0xffffffff;
+}
+
+sub enc_I32 {
+ enc_U32 unpack "I", pack "i", $_[0];
+}
+
+sub enc_DATA {
+ # a dream!
+ $data .= $_[0];
+}
+
+sub enc_STRING {
+ # should use encode for speed and clarity ;)
+ $data .= pack "v*", map ord, split //, $_[0];
+}
+]]>
+
+#############################################################################
+# types
+
+
+#############################################################################
+# structures
+
+
+#############################################################################
+# "less" primitive types 1,
+ square => 2,
+ circle => 3,
+ small_b => 4,
+ small_w => 5,
+ gray => 6,
+ move => 7,
+ addstone => 8,
+ );
+
+my %code_marker = reverse %marker_code;
+
+# this was the most horrible thing to decode. still not everything is decoded correctly(?)
+sub dec_TREE {
+ my @r;
+ while (length $data) {
+ my $type = dec_U8;
+
+ if ($type == 255) {
+ push @r, [add_child => dec_U32];
+
+ } elsif ($type == 254) {
+ push @r, ["done"];
+
+ } elsif ($type == 253) {
+ push @r, ["type253"];
+ # ????
+
+ } elsif ($type == 252) { # even less clear
+ push @r, ["more"];
+
+ } elsif ($type == 10) {
+ # as usual, wms finds yet another way to duplicate code... oh well, what a mess.
+ # (no wonder he is so keen on keeping it secret...)
+
+ push @r, [rules => dec_rules];
+
+ } elsif ($type == 9 || $type == 22 || $type == 25 || $type == 31 || $type == 32) {
+ push @r, [({
+ 9 => "comment",
+ 22 => "unknown_comment22",
+ 25 => "copyright", #?
+ 31 => "date",
+ 32 => "unknown_comment32",
+ })->{$type} => dec_STRING];
+
+ } elsif ($type == 11 || $type == 12) {
+ push @r, [player => $type - 11, dec_STRING];
+
+ } elsif ($type == 13 || $type == 14) {
+ push @r, [rank => $type - 13, dec_U32];
+
+ } elsif ($type == 15 || $type == 16) {
+ push @r, [set_timer => $type - 15, dec_time, dec_U16];
+
+ } elsif ($type == 17 || $type == 18) {
+ push @r, [score => $type - 17, dec_score];
+
+ } elsif ($type == 19) {
+ push @r, [result => dec_result];
+
+ } elsif ($type == 30) {
+ push @r, [active_player => dec_U8];
+
+ } elsif ($type == 0) { # label(?)
+ my $label;
+ my $c = dec_U16; $label .= chr $c if $c;
+ my $c = dec_U16; $label .= chr $c if $c;
+ my $c = dec_U16; $label .= chr $c if $c;
+
+ # empty label == remove label
+ push @r, [label => $label, dec_U8, dec_U8];
+
+ } elsif ($type > 0 && $type < 9) {
+ # 1 marker type triangle
+ # 2 marker type square
+ # 3 marker type circle
+ # 4 small stone b
+ # 5 small stone w
+ # 6 grayed out
+ # 7 move
+ # 8 also move(?) or preset?
+ #
+ # $a1 is probably player again (2 == remove)
+ # x is from left 0 to right boardsize-1
+ # y is from top 0 to bottom boardsize-1
+ push @r, [$code_marker{$type} => dec_U8, dec_U8, dec_U8];
+
+ } else {
+ push @r, [unknown => $type];
+ }
+ }
+ \@r;
+}
+
+sub enc_TREE {
+ for (@{$_[0]}) {
+ my ($type, @arg) = @$_;
+
+ if ($type eq "add_child") {
+ enc_U8 255;
+ enc_U32 $arg[0];
+
+ } elsif ($type eq "done") {
+ enc_U8 254;
+
+ } elsif ($type eq "more") {
+ enc_U8 253;
+
+ } elsif ($type eq "comment") {
+ # handle other string params, too
+ enc_U8 9;
+ enc_STRING $arg[0];
+
+ } elsif ($type eq "label") {
+ enc_U8 0;
+ enc_U16 ord substr "$arg[0]\x00\x00", 0, 1;
+ enc_U16 ord substr "$arg[0]\x00\x00", 1, 1;
+ enc_U16 ord substr "$arg[0]\x00\x00", 2, 1;
+ enc_U8 $arg[1];
+ enc_U8 $arg[2];
+
+ } elsif ($marker_code{$type}) {
+ enc_U8 $marker_code{$type};
+ enc_U8 $arg[0];
+ enc_U8 $arg[1];
+ enc_U8 $arg[2];
+
+ } else {
+ warn "unable to encode tree node type $type\n";
+ }
+ }
+}
+]]>
+
+#############################################################################
+# messages
+
}
1;
-
-$macro{} = [
-];
+
+sub dec_ {
+ my @r = unpack "v a*", $data;
+ $data = pop @r;
+ join ":", map chr, @r;
+}
+
+sub enc_ {
+ $data .= pack "v", map ord, split //, $_[0];
+}
+
+
+
+sub dec_ {
+ (my ($r), $data) = unpack "Z a*", $data; $r;
+}
+
+sub enc_ {
+ $data .= pack "Z", $_[0];
+}
+
+
+
+sub dec_ {
+ (1 / ) * dec_;
+}
+
+sub enc_ {
+ enc_ $_[0] * ;
+}
+
+
+
+ $r->{} = (my $array = []);
+ while (length $data) {
+ push @$array, dec_
+
+ ;
+ }
+
+
+
+ $r->{} = dec_
+
+
+
+ if ($r->{} )
+ ;
+
+
+
+
+ $_[0]{} =~ /^[A-Za-z][A-Za-z0-9]{0,11}$/
+ or Carp::confess "FATAL: tried to send illegal username '$_[0]{}'";
+
+
+ $_[0]{} > 0
+ or Carp::confess "FATAL: tried to send a zero channel id";
+
+ enc_ defined $_[0]{} ? $_[0]{
+ } : (
+
+ );
+
+
+
+sub dec_ {
+ my $r = {};
+
+
+ bless $r, ::;
+
+ $r;
+}
+
+sub enc_ {
+
+}
#
-my $msg = [
-];
-$send{} = [ 0x, $msg ];
-
-$recv{0x} = [ => $msg ];
+$recv{0x} = sub {
+ $data = $_[0];
+ my $r;
+ $r->{type} = "";
+
+ $r;
+};
+
+
+$send{} = sub {
+ $data = "";
+ enc_U16 0x;
+
+ $data;
+};
- [ => "", "", ""],
+ [
+ => "
+
+ ", "
+
+ ", "
+
+ ;"],
+