ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/kgsueme/doc/doc2messages.xsl
(Generate patch)

Comparing kgsueme/doc/doc2messages.xsl (file contents):
Revision 1.1 by pcg, Wed Jun 4 19:12:51 2003 UTC vs.
Revision 1.2 by pcg, Thu Jun 5 10:09:10 2003 UTC

1<!DOCTYPE xsl:stylesheet> 1<!DOCTYPE xsl:stylesheet>
2<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 2<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
3 3
4<xsl:output method="text" media-type="text/plain" encoding="utf-8"/> 4<xsl:output method="text" media-type="text/plain" encoding="utf-8"/>
5 5
6<xsl:template match="/"> 6<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
7package KGS::Messages; 15package KGS::Messages;
8 16
17use strict;
18
19our %type;
20our %send;
21our %recv;
22
9{ 23{
10<xsl:apply-templates/> 24
25my $data; # stores currently processed decoding/encoding packet
26
27# primitive enc/decoders
28
29#############################################################################
30
31sub dec_U8 {
32 (my ($r), $data) = unpack "C a*", $data; $r;
33}
34
35sub dec_U16 {
36 (my ($r), $data) = unpack "v a*", $data; $r;
37}
38
39sub dec_U32 {
40 (my ($r), $data) = unpack "V a*", $data; $r;
41}
42
43sub dec_U64 {
44 my ($lo, $hi) = (dec_U32, dec_U32);
45 $lo + $hi * 2**32;
46}
47
48sub dec_I8 {
49 (my ($r), $data) = unpack "c a*", $data;
50 $r;
51}
52
53sub dec_I16 {
54 (my ($r), $data) = unpack "v a*", $data;
55 unpack "s", pack "S", $r;
56}
57
58sub dec_I32 {
59 (my ($r), $data) = unpack "V a*", $data;
60 unpack "i", pack "I", $r;
61}
62
63sub dec_DATA {
64 (my ($r), $data) = ($data, ""); $r;
65}
66
67sub dec_STRING {
68 $data =~ s/^((?:..)*?)(?:\x00\x00|\Z)//s;
69 # use Encode...
70 join "", map chr, unpack "v*", $1;
71}
72
73sub dec_CONSTANT {
74 $_[0];
75}
76
77sub dec_HEX { # for debugging
78 "HEX: " . unpack "H*", $data;#d#
79}
80
81sub enc_HEX {
82 die "enc_HEX not defined for good";
83}
84
85#############################################################################
86
87sub enc_U8 {
88 $data .= pack "C", $_[0];
89}
90
91sub enc_U16 {
92 $data .= pack "v", $_[0];
93}
94
95sub enc_U32 {
96 $data .= pack "V", $_[0];
97}
98
99sub enc_U64 {
100 enc_U32 $_[0] & 0xffffffff;
101 enc_U32 +($_[0] >> 32) & 0xffffffff;
102}
103
104sub enc_I32 {
105 enc_U32 unpack "I", pack "i", $_[0];
106}
107
108sub enc_DATA {
109 # a dream!
110 $data .= $_[0];
111}
112
113sub 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
130my %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
141my %code_marker = reverse %marker_code;
142
143# this was the most horrible thing to decode. still not everything is decoded correctly(?)
144sub dec_TREE {
145 my @r;
146 while (length $data) {
147 my $type = dec_U8;
148
149 if ($type == 255) {
150 push @r, [add_child => dec_U32];
151
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 push @r, [score => $type - 17, dec_score];
188
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
226sub enc_TREE {
227 for (@{$_[0]}) {
228 my ($type, @arg) = @$_;
229
230 if ($type eq "add_child") {
231 enc_U8 255;
232 enc_U32 $arg[0];
233
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"/>
11} 269}
12 270
131; 2711;
14</xsl:template> 272</xsl:template>
15 273
274<xsl:template match="type[@type = 'S']">
275sub 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
281sub 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']">
287sub dec_<xsl:value-of select="@name"/> {
288 (my ($r), $data) = unpack "Z<xsl:value-of select="@length"/> a*", $data; $r;
289}
290
291sub 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]">
297sub dec_<xsl:value-of select="@name"/> {
298 (1 / <xsl:value-of select="@multiplier"/>) * dec_<xsl:value-of select="@type"/>;
299}
300
301sub 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
16<xsl:template match="macro"> 339<xsl:template match="struct">
17$macro{<xsl:value-of select="@name"/>} = [<xsl:apply-templates/> 340sub dec_<xsl:value-of select="@name"/> {
18]; 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
349sub enc_<xsl:value-of select="@name"/> {
350 <xsl:apply-templates select="member" mode="enc"/>
351}
19</xsl:template> 352</xsl:template>
20 353
21<xsl:template match="message"> 354<xsl:template match="message">
22# <xsl:value-of select="@name"/> 355# <xsl:value-of select="@name"/>
23my $msg = [<xsl:apply-templates/>
24];<xsl:if test="@send='yes'"> 356<xsl:if test="@recv='yes'">
25$send{<xsl:value-of select="@name"/>} = [ 0x<xsl:value-of select="@type"/>, $msg ]; 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};
26</xsl:if> 364</xsl:if>
27<xsl:if test="@recv='yes'"> 365<xsl:if test="@send='yes'">
28$recv{0x<xsl:value-of select="@type"/>} = [ <xsl:value-of select="@name"/> => $msg ]; 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};
29</xsl:if> 372</xsl:if>
30</xsl:template> 373</xsl:template>
31 374
32<xsl:template match="member"> 375<xsl:template match="member">
33 [<xsl:value-of select="@name"/> => "<xsl:value-of select="@type"/>", "<xsl:value-of select="@default"/>", "<xsl:value-of select="@guard"/>"],<!-- 376 [<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>
34--></xsl:template> 384</xsl:template>
35 385
36<xsl:template match="text()"> 386<xsl:template match="text()">
37</xsl:template> 387</xsl:template>
38 388
39</xsl:stylesheet> 389</xsl:stylesheet>

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines