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/doc2C.xsl |
14 |
|
15 |
// this is NOT really c++, but it should compile as such |
16 |
|
17 |
// this code is untested and just exists for demo purposes. |
18 |
// please test and improve :) |
19 |
|
20 |
#include <assert.h> |
21 |
|
22 |
#include <...> should provide |
23 |
typedef unsigned char U16; |
24 |
typedef unsigned short U16; |
25 |
typedef unsigned int U32; |
26 |
typedef unsigned long long U64; |
27 |
typedef signed char I8; |
28 |
typedef signed short I16; |
29 |
typedef signed int I32; |
30 |
typedef signed long long I64; |
31 |
|
32 |
// yeah, not very elegant |
33 |
static U8 *data; |
34 |
static U16 dlen; |
35 |
|
36 |
static U8 |
37 |
dec_U8 (void) |
38 |
{ |
39 |
assert (dlen > 0); |
40 |
dlen--; |
41 |
return *data++; |
42 |
} |
43 |
|
44 |
static U16 |
45 |
dec_U16 (void) |
46 |
{ |
47 |
U16 l = dec_U8 (); |
48 |
U16 h = dec_U8 (); |
49 |
|
50 |
return l | (h << 8); |
51 |
} |
52 |
|
53 |
static U32 |
54 |
dec_U32 (void) |
55 |
{ |
56 |
U32 l = dec_U16 (); |
57 |
U32 h = dec_U16 (); |
58 |
|
59 |
return l | (h << 16); |
60 |
} |
61 |
|
62 |
static U64 |
63 |
dec_U64 (void) |
64 |
{ |
65 |
U64 l = dec_U32 (); |
66 |
U64 h = dec_U32 (); |
67 |
|
68 |
return l | (h << 32); |
69 |
} |
70 |
|
71 |
#define dec_I8() ((I8)dec_U8 ()) |
72 |
#define dec_I16() ((I16)dec_U16 ()) |
73 |
#define dec_I32() ((I32)dec_U32 ()) |
74 |
#define dec_I64() ((I64)dec_U64 ()) |
75 |
|
76 |
// dec_DATA |
77 |
// dec_STRING n |
78 |
// dec_CONSTANT |
79 |
|
80 |
#define dec_password() dec_U64() |
81 |
|
82 |
static void |
83 |
enc_U8 (U8 d) |
84 |
{ |
85 |
assert (dlen > 0); |
86 |
dlen--; |
87 |
*data++ = d; |
88 |
} |
89 |
|
90 |
#define enc_U16(d) enc_U8 (d); enc_U16 ((d) >> 8) |
91 |
#define enc_U32(d) enc_U16 (d); enc_U16 ((d) >> 16) |
92 |
#define enc_U64(d) enc_U32 (d); enc_U32 ((d) >> 32) |
93 |
#define enc_I8(d) enc_U8 ((U8 )d) |
94 |
#define enc_I16(d) enc_U16 ((U16)d) |
95 |
#define enc_I32(d) enc_U32 ((U32)d) |
96 |
#define enc_I64(d) enc_U64 ((U64)d) |
97 |
|
98 |
// enc_DATA |
99 |
// enc_STRING ,n |
100 |
// enc_CONSTANT |
101 |
|
102 |
// enc_password |
103 |
// # $hash must be 64 bit |
104 |
// my $hash = new Math::BigInt; |
105 |
// $hash = $hash * 1055 + ord for split //, $_[0]; |
106 |
// enc_U64 $hash; |
107 |
|
108 |
]]> |
109 |
|
110 |
############################################################################# |
111 |
# types |
112 |
<xsl:apply-templates select="descendant::type"/> |
113 |
|
114 |
############################################################################# |
115 |
# structures |
116 |
<xsl:apply-templates select="descendant::struct"/> |
117 |
|
118 |
############################################################################# |
119 |
# "less" primitive types<![CDATA[ |
120 |
|
121 |
// dec_TREE |
122 |
// enc_TREE |
123 |
} |
124 |
]]> |
125 |
|
126 |
############################################################################# |
127 |
# messages |
128 |
<xsl:apply-templates select="descendant::message"/> |
129 |
} |
130 |
|
131 |
1; |
132 |
</xsl:template> |
133 |
|
134 |
<xsl:template match="type[@type = 'S']"> |
135 |
|
136 |
static U16 * |
137 |
dec_<xsl:value-of select="@name"/> () |
138 |
{ |
139 |
return dec_STRING (<xsl:value-of select="@length"/>); |
140 |
} |
141 |
|
142 |
static void |
143 |
enc_<xsl:value-of select="@name"/> (const U16 *s) |
144 |
{ |
145 |
enc_STRING (s, <xsl:value-of select="@length"/>); |
146 |
} |
147 |
</xsl:template> |
148 |
|
149 |
<xsl:template match="type[@type = 'A']"> |
150 |
|
151 |
static char * |
152 |
dec_<xsl:value-of select="@name"/> () |
153 |
{ |
154 |
return dec_ASCIZ (<xsl:value-of select="@length"/>); |
155 |
} |
156 |
|
157 |
static void |
158 |
enc_<xsl:value-of select="@name"/> (const char *s) |
159 |
{ |
160 |
enc_ASCIZ (s, <xsl:value-of select="@length"/>); |
161 |
} |
162 |
</xsl:template> |
163 |
|
164 |
<xsl:template match="type[@multiplier]"> |
165 |
static float |
166 |
dec_<xsl:value-of select="@name"/> () |
167 |
{ |
168 |
(1. / <xsl:value-of select="@multiplier"/>) * dec_<xsl:value-of select="@type"/> (); |
169 |
} |
170 |
|
171 |
static void |
172 |
enc_<xsl:value-of select="@name"/> (float f) |
173 |
{ |
174 |
enc_<xsl:value-of select="@type"/> (f * <xsl:value-of select="@multiplier"/>); |
175 |
} |
176 |
</xsl:template> |
177 |
|
178 |
<xsl:template match="member" mode="decl"> |
179 |
<xsl:text> </xsl:text><xsl:value-of select="@type"/><xsl:text> </xsl:text><xsl:value-of select="@name"/>; |
180 |
</xsl:template> |
181 |
|
182 |
<xsl:template match="member[@array = 'yes']" mode="dec"> |
183 |
while (dlen) |
184 |
r.<xsl:value-of select="@name"/>->append (dec_<xsl:value-of select="@type"/> ()); |
185 |
</xsl:template> |
186 |
|
187 |
<xsl:template match="member" mode="dec"> |
188 |
<xsl:if test="@guard-cond"> |
189 |
if (r.<xsl:value-of select="@guard-member"/> <xsl:value-of select="@guard-cond"/>)</xsl:if> |
190 |
r.<xsl:value-of select="@name"/> = dec_<xsl:value-of select="@type"/> (); |
191 |
</xsl:template> |
192 |
|
193 |
<xsl:template match="member" mode="enc"> |
194 |
enc_<xsl:value-of select="@type"/> (r.<xsl:value-of select="@name"/>); |
195 |
</xsl:template> |
196 |
|
197 |
<xsl:template match="struct"> |
198 |
struct KGS_<xsl:value-of select="@name"/> { |
199 |
<xsl:apply-templates select="member" mode="decl"/>}; |
200 |
|
201 |
static const struct KGS_<xsl:value-of select="@name"/> & |
202 |
dec_<xsl:value-of select="@name"/> () |
203 |
{ |
204 |
struct KGS_<xsl:value-of select="@name"/> r; |
205 |
|
206 |
<xsl:apply-templates select="member" mode="dec"/> |
207 |
|
208 |
return r; |
209 |
} |
210 |
|
211 |
static void |
212 |
enc_<xsl:value-of select="@name"/> (const struct KGS_<xsl:value-of select="@name"/> &r) |
213 |
{ |
214 |
<xsl:apply-templates select="member" mode="enc"/> |
215 |
} |
216 |
</xsl:template> |
217 |
|
218 |
<xsl:template match="message"> |
219 |
struct KGS_<xsl:value-of select="@src"/>_<xsl:value-of select="@name"/> { |
220 |
<xsl:apply-templates select="member" mode="decl"/>}; |
221 |
|
222 |
static struct KGS_<xsl:value-of select="@src"/>_<xsl:value-of select="@name"/> & |
223 |
dec_<xsl:value-of select="@src"/>_<xsl:value-of select="@name"/> () |
224 |
{ |
225 |
struct KGS_<xsl:value-of select="@src"/>_<xsl:value-of select="@name"/> r; |
226 |
|
227 |
r.type = MSG_<xsl:value-of select="@name"/>; |
228 |
<xsl:apply-templates select="member" mode="dec"/> |
229 |
} |
230 |
|
231 |
static void |
232 |
enc_<xsl:value-of select="@src"/>_<xsl:value-of select="@name"/> (const struct KGS_<xsl:value-of select="@src"/>_<xsl:value-of select="@name"/> &r) |
233 |
{ |
234 |
enc_U16 (0x<xsl:value-of select="@type"/>); |
235 |
<xsl:apply-templates select="member" mode="enc"/> |
236 |
} |
237 |
|
238 |
</xsl:template> |
239 |
|
240 |
<xsl:template match="text()"> |
241 |
</xsl:template> |
242 |
|
243 |
</xsl:stylesheet> |
244 |
|