ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/kgsueme/doc/doc2messages.xsl
Revision: 1.6
Committed: Tue Jun 10 08:30:09 2003 UTC (20 years, 11 months ago) by pcg
Content type: application/xml
Branch: MAIN
Changes since 1.5: +5 -1 lines
Log Message:
*** empty log message ***

File Contents

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