ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/kgsueme/doc/doc2messages.xsl
Revision: 1.4
Committed: Fri Jun 6 05:50:32 2003 UTC (20 years, 11 months ago) by pcg
Content type: application/xml
Branch: MAIN
Changes since 1.3: +1 -1 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 pcg 1.1 <!DOCTYPE xsl:stylesheet>
2     <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
3    
4     <xsl:output method="text" media-type="text/plain" encoding="utf-8"/>
5    
6 pcg 1.2 <xsl:template match="/"><![CDATA[
7     # This is an automatically generated file.
8     # This is an automatically generated file.
9     # This is an automatically generated file.
10     # This is an automatically generated file.
11     # This is an automatically generated file.
12    
13     # See doc/protocol.xml and doc/doc2messages.xsl
14    
15 pcg 1.1 package KGS::Messages;
16    
17 pcg 1.2 use strict;
18    
19     our %type;
20     our %send;
21     our %recv;
22    
23 pcg 1.1 {
24 pcg 1.2
25     my $data; # stores currently processed decoding/encoding packet
26    
27     # primitive enc/decoders
28    
29     #############################################################################
30    
31     sub dec_U8 {
32     (my ($r), $data) = unpack "C a*", $data; $r;
33     }
34    
35     sub dec_U16 {
36     (my ($r), $data) = unpack "v a*", $data; $r;
37     }
38    
39     sub dec_U32 {
40     (my ($r), $data) = unpack "V a*", $data; $r;
41     }
42    
43     sub dec_U64 {
44     my ($lo, $hi) = (dec_U32, dec_U32);
45     $lo + $hi * 2**32;
46     }
47    
48     sub dec_I8 {
49     (my ($r), $data) = unpack "c a*", $data;
50     $r;
51     }
52    
53     sub dec_I16 {
54     (my ($r), $data) = unpack "v a*", $data;
55     unpack "s", pack "S", $r;
56     }
57    
58     sub dec_I32 {
59     (my ($r), $data) = unpack "V a*", $data;
60     unpack "i", pack "I", $r;
61     }
62    
63     sub dec_DATA {
64     (my ($r), $data) = ($data, ""); $r;
65     }
66    
67     sub dec_STRING {
68     $data =~ s/^((?:..)*?)(?:\x00\x00|\Z)//s;
69     # use Encode...
70     join "", map chr, unpack "v*", $1;
71     }
72    
73     sub dec_CONSTANT {
74     $_[0];
75     }
76    
77     sub dec_HEX { # for debugging
78     "HEX: " . unpack "H*", $data;#d#
79     }
80    
81     sub enc_HEX {
82     die "enc_HEX not defined for good";
83     }
84    
85     #############################################################################
86    
87     sub enc_U8 {
88     $data .= pack "C", $_[0];
89     }
90    
91     sub enc_U16 {
92     $data .= pack "v", $_[0];
93     }
94    
95     sub enc_U32 {
96     $data .= pack "V", $_[0];
97     }
98    
99     sub enc_U64 {
100     enc_U32 $_[0] & 0xffffffff;
101     enc_U32 +($_[0] >> 32) & 0xffffffff;
102     }
103    
104     sub enc_I32 {
105     enc_U32 unpack "I", pack "i", $_[0];
106     }
107    
108     sub enc_DATA {
109     # a dream!
110     $data .= $_[0];
111     }
112    
113     sub enc_STRING {
114     # should use encode for speed and clarity ;)
115     $data .= pack "v*", map ord, split //, $_[0];
116     }
117     ]]>
118    
119     #############################################################################
120     # types
121     <xsl:apply-templates select="descendant::type"/>
122    
123     #############################################################################
124     # structures
125     <xsl:apply-templates select="descendant::struct"/>
126    
127     #############################################################################
128     # "less" primitive types<![CDATA[
129    
130     my %marker_code = (
131     triangle => 1,
132     square => 2,
133     circle => 3,
134     small_b => 4,
135     small_w => 5,
136     gray => 6,
137     move => 7,
138     addstone => 8,
139     );
140    
141     my %code_marker = reverse %marker_code;
142    
143     # this was the most horrible thing to decode. still not everything is decoded correctly(?)
144     sub dec_TREE {
145     my @r;
146     while (length $data) {
147     my $type = dec_U8;
148    
149     if ($type == 255) {
150 pcg 1.3 push @r, [add_child => dec_I32];
151 pcg 1.2
152     } elsif ($type == 254) {
153     push @r, ["done"];
154    
155     } elsif ($type == 253) {
156     push @r, ["type253"];
157     # ????
158    
159     } elsif ($type == 252) { # even less clear
160     push @r, ["more"];
161    
162     } elsif ($type == 10) {
163     # as usual, wms finds yet another way to duplicate code... oh well, what a mess.
164     # (no wonder he is so keen on keeping it secret...)
165    
166     push @r, [rules => dec_rules];
167    
168     } elsif ($type == 9 || $type == 22 || $type == 25 || $type == 31 || $type == 32) {
169     push @r, [({
170     9 => "comment",
171     22 => "unknown_comment22",
172     25 => "copyright", #?
173     31 => "date",
174     32 => "unknown_comment32",
175     })->{$type} => dec_STRING];
176    
177     } elsif ($type == 11 || $type == 12) {
178     push @r, [player => $type - 11, dec_STRING];
179    
180     } elsif ($type == 13 || $type == 14) {
181     push @r, [rank => $type - 13, dec_U32];
182    
183     } elsif ($type == 15 || $type == 16) {
184     push @r, [set_timer => $type - 15, dec_time, dec_U16];
185    
186     } elsif ($type == 17 || $type == 18) {
187 pcg 1.4 push @r, [score => $type - 17, dec_score16];
188 pcg 1.2
189     } elsif ($type == 19) {
190     push @r, [result => dec_result];
191    
192     } elsif ($type == 30) {
193     push @r, [active_player => dec_U8];
194    
195     } elsif ($type == 0) { # label(?)
196     my $label;
197     my $c = dec_U16; $label .= chr $c if $c;
198     my $c = dec_U16; $label .= chr $c if $c;
199     my $c = dec_U16; $label .= chr $c if $c;
200    
201     # empty label == remove label
202     push @r, [label => $label, dec_U8, dec_U8];
203    
204     } elsif ($type > 0 && $type < 9) {
205     # 1 marker type triangle
206     # 2 marker type square
207     # 3 marker type circle
208     # 4 small stone b
209     # 5 small stone w
210     # 6 grayed out
211     # 7 move
212     # 8 also move(?) or preset?
213     #
214     # $a1 is probably player again (2 == remove)
215     # x is from left 0 to right boardsize-1
216     # y is from top 0 to bottom boardsize-1
217     push @r, [$code_marker{$type} => dec_U8, dec_U8, dec_U8];
218    
219     } else {
220     push @r, [unknown => $type];
221     }
222     }
223     \@r;
224     }
225    
226     sub enc_TREE {
227     for (@{$_[0]}) {
228     my ($type, @arg) = @$_;
229    
230     if ($type eq "add_child") {
231     enc_U8 255;
232 pcg 1.3 enc_I32 $arg[0];
233 pcg 1.2
234     } elsif ($type eq "done") {
235     enc_U8 254;
236    
237     } elsif ($type eq "more") {
238     enc_U8 253;
239    
240     } elsif ($type eq "comment") {
241     # handle other string params, too
242     enc_U8 9;
243     enc_STRING $arg[0];
244    
245     } elsif ($type eq "label") {
246     enc_U8 0;
247     enc_U16 ord substr "$arg[0]\x00\x00", 0, 1;
248     enc_U16 ord substr "$arg[0]\x00\x00", 1, 1;
249     enc_U16 ord substr "$arg[0]\x00\x00", 2, 1;
250     enc_U8 $arg[1];
251     enc_U8 $arg[2];
252    
253     } elsif ($marker_code{$type}) {
254     enc_U8 $marker_code{$type};
255     enc_U8 $arg[0];
256     enc_U8 $arg[1];
257     enc_U8 $arg[2];
258    
259     } else {
260     warn "unable to encode tree node type $type\n";
261     }
262     }
263     }
264     ]]>
265    
266     #############################################################################
267     # messages
268     <xsl:apply-templates select="descendant::message"/>
269 pcg 1.1 }
270    
271     1;
272     </xsl:template>
273    
274 pcg 1.2 <xsl:template match="type[@type = 'S']">
275     sub dec_<xsl:value-of select="@name"/> {
276     my @r = unpack "v<xsl:value-of select="@length"/> a*", $data;
277     $data = pop @r;
278     join ":", map chr, @r;
279     }
280    
281     sub enc_<xsl:value-of select="@name"/> {
282     $data .= pack "v<xsl:value-of select="@length"/>", map ord, split //, $_[0];
283     }
284     </xsl:template>
285    
286     <xsl:template match="type[@type = 'A']">
287     sub dec_<xsl:value-of select="@name"/> {
288     (my ($r), $data) = unpack "Z<xsl:value-of select="@length"/> a*", $data; $r;
289     }
290    
291     sub enc_<xsl:value-of select="@name"/> {
292     $data .= pack "Z<xsl:value-of select="@length"/>", $_[0];
293     }
294     </xsl:template>
295    
296     <xsl:template match="type[@multiplier]">
297     sub dec_<xsl:value-of select="@name"/> {
298     (1 / <xsl:value-of select="@multiplier"/>) * dec_<xsl:value-of select="@type"/>;
299     }
300    
301     sub enc_<xsl:value-of select="@name"/> {
302     enc_<xsl:value-of select="@type"/> $_[0] * <xsl:value-of select="@multiplier"/>;
303     }
304     </xsl:template>
305    
306     <xsl:template match="member[@array = 'yes']" mode="dec">
307     $r->{<xsl:value-of select="@name"/>} = (my $array = []);
308     while (length $data) {
309     push @$array, dec_<xsl:value-of select="@type"/>
310     <xsl:text> </xsl:text>
311     <xsl:value-of select="@default"/>;
312     }
313     </xsl:template>
314    
315     <xsl:template match="member" mode="dec">
316     $r->{<xsl:value-of select="@name"/>} = dec_<xsl:value-of select="@type"/>
317     <xsl:text> </xsl:text>
318     <xsl:value-of select="@default"/>
319     <xsl:if test="@guard-cond">
320     if ($r->{<xsl:value-of select="@guard-member"/>} <xsl:value-of select="@guard-cond"/>)</xsl:if>
321     <xsl:text>;</xsl:text>
322     </xsl:template>
323    
324     <xsl:template match="member" mode="enc">
325     <!-- #d#, remove when kgs is repaired --><xsl:if test="@type = 'username'">
326     $_[0]{<xsl:value-of select="@name"/>} =~ /^[A-Za-z][A-Za-z0-9]{0,11}$/
327     or Carp::confess "FATAL: tried to send illegal username '$_[0]{<xsl:value-of select="@name"/>}'";
328     </xsl:if><!--#d#-->
329     <!-- #d#, remove when kgs is repaired --><xsl:if test="@name = 'channel'">
330     $_[0]{<xsl:value-of select="@name"/>} > 0
331     or Carp::confess "FATAL: tried to send a zero channel id";
332     </xsl:if><!--#d#-->
333     enc_<xsl:value-of select="@type"/> defined $_[0]{<xsl:value-of select="@name"/>} ? $_[0]{<xsl:value-of select="@name"/>
334     <xsl:text>} : (</xsl:text>
335     <xsl:value-of select="@default"/>
336     <xsl:text>);</xsl:text>
337     </xsl:template>
338    
339     <xsl:template match="struct">
340     sub dec_<xsl:value-of select="@name"/> {
341     my $r = {};
342     <xsl:apply-templates select="member" mode="dec"/>
343     <xsl:if test="@class">
344     bless $r, <xsl:value-of select="@class"/>::;
345     </xsl:if>
346     $r;
347     }
348    
349     sub enc_<xsl:value-of select="@name"/> {
350     <xsl:apply-templates select="member" mode="enc"/>
351     }
352 pcg 1.1 </xsl:template>
353    
354     <xsl:template match="message">
355     # <xsl:value-of select="@name"/>
356 pcg 1.2 <xsl:if test="@recv='yes'">
357     $recv{0x<xsl:value-of select="@type"/>} = sub {
358     $data = $_[0];
359     my $r;
360     $r->{type} = "<xsl:value-of select="@name"/>";
361     <xsl:apply-templates select="member" mode="dec"/>
362     $r;
363     };
364 pcg 1.1 </xsl:if>
365 pcg 1.2 <xsl:if test="@send='yes'">
366     $send{<xsl:value-of select="@name"/>} = sub {
367     $data = "";
368     enc_U16 0x<xsl:value-of select="@type"/>;
369     <xsl:apply-templates select="member" mode="enc"/>
370     $data;
371     };
372 pcg 1.1 </xsl:if>
373     </xsl:template>
374    
375     <xsl:template match="member">
376 pcg 1.2 [<xsl:value-of select="@name"/>
377     <xsl:text>=> "</xsl:text>
378     <xsl:value-of select="@type"/>
379     <xsl:text>", "</xsl:text>
380     <xsl:value-of select="@default"/>
381     <xsl:text>", "</xsl:text>
382     <xsl:value-of select="@guard"/>
383     <xsl:text>;"],</xsl:text>
384     </xsl:template>
385 pcg 1.1
386     <xsl:template match="text()">
387     </xsl:template>
388    
389     </xsl:stylesheet>
390