ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/kgsueme/doc/doc2messages.xsl
Revision: 1.5
Committed: Tue Jun 10 08:01:17 2003 UTC (20 years, 11 months ago) by pcg
Content type: application/xml
Branch: MAIN
Changes since 1.4: +2 -0 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_I32 {
107 enc_U32 unpack "I", pack "i", $_[0];
108 }
109
110 sub enc_DATA {
111 # a dream!
112 $data .= $_[0];
113 }
114
115 sub enc_STRING {
116 # should use encode for speed and clarity ;)
117 $data .= pack "v*", map ord, split //, $_[0];
118 }
119 ]]>
120
121 #############################################################################
122 # types
123 <xsl:apply-templates select="descendant::type"/>
124
125 #############################################################################
126 # structures
127 <xsl:apply-templates select="descendant::struct"/>
128
129 #############################################################################
130 # "less" primitive types<![CDATA[
131
132 my %marker_code = (
133 triangle => 1,
134 square => 2,
135 circle => 3,
136 small_b => 4,
137 small_w => 5,
138 gray => 6,
139 move => 7,
140 addstone => 8,
141 );
142
143 my %code_marker = reverse %marker_code;
144
145 # this was the most horrible thing to decode. still not everything is decoded correctly(?)
146 sub dec_TREE {
147 my @r;
148 while (length $data) {
149 my $type = dec_U8;
150
151 if ($type == 255) {
152 push @r, [add_child => dec_I32];
153
154 } elsif ($type == 254) {
155 push @r, ["done"];
156
157 } elsif ($type == 253) {
158 push @r, ["type253"];
159 # ????
160
161 } elsif ($type == 252) { # even less clear
162 push @r, ["more"];
163
164 } elsif ($type == 10) {
165 # as usual, wms finds yet another way to duplicate code... oh well, what a mess.
166 # (no wonder he is so keen on keeping it secret...)
167
168 push @r, [rules => dec_rules];
169
170 } elsif ($type == 9 || $type == 22 || $type == 25 || $type == 31 || $type == 32) {
171 push @r, [({
172 9 => "comment",
173 22 => "unknown_comment22",
174 25 => "copyright", #?
175 31 => "date",
176 32 => "unknown_comment32",
177 })->{$type} => dec_STRING];
178
179 } elsif ($type == 11 || $type == 12) {
180 push @r, [player => $type - 11, dec_STRING];
181
182 } elsif ($type == 13 || $type == 14) {
183 push @r, [rank => $type - 13, dec_U32];
184
185 } elsif ($type == 15 || $type == 16) {
186 push @r, [set_timer => $type - 15, dec_time, dec_U16];
187
188 } elsif ($type == 17 || $type == 18) {
189 push @r, [score => $type - 17, dec_score16];
190
191 } elsif ($type == 19) {
192 push @r, [result => dec_result];
193
194 } elsif ($type == 30) {
195 push @r, [active_player => dec_U8];
196
197 } elsif ($type == 0) { # label(?)
198 my $label;
199 my $c = dec_U16; $label .= chr $c if $c;
200 my $c = dec_U16; $label .= chr $c if $c;
201 my $c = dec_U16; $label .= chr $c if $c;
202
203 # empty label == remove label
204 push @r, [label => $label, dec_U8, dec_U8];
205
206 } elsif ($type > 0 && $type < 9) {
207 # 1 marker type triangle
208 # 2 marker type square
209 # 3 marker type circle
210 # 4 small stone b
211 # 5 small stone w
212 # 6 grayed out
213 # 7 move
214 # 8 also move(?) or preset?
215 #
216 # $a1 is probably player again (2 == remove)
217 # x is from left 0 to right boardsize-1
218 # y is from top 0 to bottom boardsize-1
219 push @r, [$code_marker{$type} => dec_U8, dec_U8, dec_U8];
220
221 } else {
222 push @r, [unknown => $type];
223 }
224 }
225 \@r;
226 }
227
228 sub enc_TREE {
229 for (@{$_[0]}) {
230 my ($type, @arg) = @$_;
231
232 if ($type eq "add_child") {
233 enc_U8 255;
234 enc_I32 $arg[0];
235
236 } elsif ($type eq "done") {
237 enc_U8 254;
238
239 } elsif ($type eq "more") {
240 enc_U8 253;
241
242 } elsif ($type eq "comment") {
243 # handle other string params, too
244 enc_U8 9;
245 enc_STRING $arg[0];
246
247 } elsif ($type eq "label") {
248 enc_U8 0;
249 enc_U16 ord substr "$arg[0]\x00\x00", 0, 1;
250 enc_U16 ord substr "$arg[0]\x00\x00", 1, 1;
251 enc_U16 ord substr "$arg[0]\x00\x00", 2, 1;
252 enc_U8 $arg[1];
253 enc_U8 $arg[2];
254
255 } elsif ($marker_code{$type}) {
256 enc_U8 $marker_code{$type};
257 enc_U8 $arg[0];
258 enc_U8 $arg[1];
259 enc_U8 $arg[2];
260
261 } else {
262 warn "unable to encode tree node type $type\n";
263 }
264 }
265 }
266 ]]>
267
268 #############################################################################
269 # messages
270 <xsl:apply-templates select="descendant::message"/>
271 }
272
273 1;
274 </xsl:template>
275
276 <xsl:template match="type[@type = 'S']">
277 sub dec_<xsl:value-of select="@name"/> {
278 my @r = unpack "v<xsl:value-of select="@length"/> a*", $data;
279 $data = pop @r;
280 join ":", map chr, @r;
281 }
282
283 sub enc_<xsl:value-of select="@name"/> {
284 $data .= pack "v<xsl:value-of select="@length"/>", map ord, split //, $_[0];
285 }
286 </xsl:template>
287
288 <xsl:template match="type[@type = 'A']">
289 sub dec_<xsl:value-of select="@name"/> {
290 (my ($r), $data) = unpack "Z<xsl:value-of select="@length"/> a*", $data; $r;
291 }
292
293 sub enc_<xsl:value-of select="@name"/> {
294 $data .= pack "Z<xsl:value-of select="@length"/>", $_[0];
295 }
296 </xsl:template>
297
298 <xsl:template match="type[@multiplier]">
299 sub dec_<xsl:value-of select="@name"/> {
300 (1 / <xsl:value-of select="@multiplier"/>) * dec_<xsl:value-of select="@type"/>;
301 }
302
303 sub enc_<xsl:value-of select="@name"/> {
304 enc_<xsl:value-of select="@type"/> $_[0] * <xsl:value-of select="@multiplier"/>;
305 }
306 </xsl:template>
307
308 <xsl:template match="member[@array = 'yes']" mode="dec">
309 $r->{<xsl:value-of select="@name"/>} = (my $array = []);
310 while (length $data) {
311 push @$array, dec_<xsl:value-of select="@type"/>
312 <xsl:text> </xsl:text>
313 <xsl:value-of select="@default"/>;
314 }
315 </xsl:template>
316
317 <xsl:template match="member" mode="dec">
318 $r->{<xsl:value-of select="@name"/>} = dec_<xsl:value-of select="@type"/>
319 <xsl:text> </xsl:text>
320 <xsl:value-of select="@default"/>
321 <xsl:if test="@guard-cond">
322 if ($r->{<xsl:value-of select="@guard-member"/>} <xsl:value-of select="@guard-cond"/>)</xsl:if>
323 <xsl:text>;</xsl:text>
324 </xsl:template>
325
326 <xsl:template match="member" mode="enc">
327 <!-- #d#, remove when kgs is repaired --><xsl:if test="@type = 'username'">
328 $_[0]{<xsl:value-of select="@name"/>} =~ /^[A-Za-z][A-Za-z0-9]{0,11}$/
329 or Carp::confess "FATAL: tried to send illegal username '$_[0]{<xsl:value-of select="@name"/>}'";
330 </xsl:if><!--#d#-->
331 <!-- #d#, remove when kgs is repaired --><xsl:if test="@name = 'channel'">
332 $_[0]{<xsl:value-of select="@name"/>} > 0
333 or Carp::confess "FATAL: tried to send a zero channel id";
334 </xsl:if><!--#d#-->
335 enc_<xsl:value-of select="@type"/> defined $_[0]{<xsl:value-of select="@name"/>} ? $_[0]{<xsl:value-of select="@name"/>
336 <xsl:text>} : (</xsl:text>
337 <xsl:value-of select="@default"/>
338 <xsl:text>);</xsl:text>
339 </xsl:template>
340
341 <xsl:template match="struct">
342 sub dec_<xsl:value-of select="@name"/> {
343 my $r = {};
344 <xsl:apply-templates select="member" mode="dec"/>
345 <xsl:if test="@class">
346 bless $r, <xsl:value-of select="@class"/>::;
347 </xsl:if>
348 $r;
349 }
350
351 sub enc_<xsl:value-of select="@name"/> {
352 <xsl:apply-templates select="member" mode="enc"/>
353 }
354 </xsl:template>
355
356 <xsl:template match="message">
357 # <xsl:value-of select="@name"/>
358 <xsl:if test="@recv='yes'">
359 $recv{0x<xsl:value-of select="@type"/>} = sub {
360 $data = $_[0];
361 my $r;
362 $r->{type} = "<xsl:value-of select="@name"/>";
363 <xsl:apply-templates select="member" mode="dec"/>
364 $r;
365 };
366 </xsl:if>
367 <xsl:if test="@send='yes'">
368 $send{<xsl:value-of select="@name"/>} = sub {
369 $data = "";
370 enc_U16 0x<xsl:value-of select="@type"/>;
371 <xsl:apply-templates select="member" mode="enc"/>
372 $data;
373 };
374 </xsl:if>
375 </xsl:template>
376
377 <xsl:template match="member">
378 [<xsl:value-of select="@name"/>
379 <xsl:text>=> "</xsl:text>
380 <xsl:value-of select="@type"/>
381 <xsl:text>", "</xsl:text>
382 <xsl:value-of select="@default"/>
383 <xsl:text>", "</xsl:text>
384 <xsl:value-of select="@guard"/>
385 <xsl:text>;"],</xsl:text>
386 </xsl:template>
387
388 <xsl:template match="text()">
389 </xsl:template>
390
391 </xsl:stylesheet>
392