ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/kgsueme/doc/doc2haskell.xsl
Revision: 1.4
Committed: Fri Jul 25 22:35:50 2003 UTC (20 years, 10 months ago) by pcg
Content type: application/xml
Branch: MAIN
Changes since 1.3: +7 -8 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     <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/doc2haskell.xsl
14    
15     -- primitive enc/decoders
16    
17 pcg 1.2 import Data.Word
18     import Control.Monad.State
19 pcg 1.1
20 pcg 1.4 hasData :: State [Word8] Bool
21     hasData = do
22     xs <- get
23     return $ not $ null xs
24    
25 pcg 1.2 getU8 :: State [Word8] Int
26     getU8 = do
27     (x:xs) <- get
28     put xs
29     return x
30    
31     getU16 :: State [Word8] Int
32     getU16 = do
33     a <- getU8
34     b <- getU8
35     return $ a + b * 256
36    
37 pcg 1.3 decU64
38     decI8
39     decI16
40     decI32
41     decDATA
42 pcg 1.1
43     sub dec_STRING {
44     $data =~ s/^((?:..)*?)(?:\x00\x00|\Z)//s;
45     # use Encode...
46     join "", map chr, unpack "v*", $1;
47     }
48    
49     sub dec_CONSTANT {
50     $_[0];
51     }
52    
53     sub dec_password {
54     dec_U64;
55     }
56    
57     sub dec_HEX { # for debugging
58     "HEX: " . unpack "H*", $data;#d#
59     }
60    
61     #############################################################################
62    
63     sub enc_U8 {
64     $data .= pack "C", $_[0];
65     }
66    
67     sub enc_U16 {
68     $data .= pack "v", $_[0];
69     }
70    
71     sub enc_U32 {
72     $data .= pack "V", $_[0];
73     }
74    
75     sub enc_U64 {
76     enc_U32 $_[0] & 0xffffffff;
77     enc_U32 +($_[0] >> 32) & 0xffffffff;
78     }
79    
80     sub enc_I8 {
81     $data .= pack "c", $_[0];
82     }
83    
84     sub enc_I16 {
85     enc_U16 unpack "S", pack "s", $_[0];
86     }
87    
88     sub enc_I32 {
89     enc_U32 unpack "I", pack "i", $_[0];
90     }
91    
92     sub enc_DATA {
93     # a dream!
94     $data .= $_[0];
95     }
96    
97     sub enc_STRING {
98     # should use encode for speed and clarity ;)
99     $data .= pack "v*", map ord, split //, $_[0];
100     }
101    
102     sub enc_CONSTANT {
103     # nop
104     }
105    
106     sub enc_password {
107     require Math::BigInt; # I insist on 32-bit-perl.. should use C
108     # $hash must be 64 bit
109     my $hash = new Math::BigInt;
110     $hash = $hash * 1055 + ord for split //, $_[0];
111     enc_U64 $hash;
112     }
113    
114     sub enc_HEX {
115     die "enc_HEX not defined for good";
116     }
117    
118     ]]>
119    
120     #############################################################################
121     # types
122     <xsl:apply-templates select="descendant::type"/>
123    
124     #############################################################################
125     # structures
126     <xsl:apply-templates select="descendant::struct"/>
127    
128     #############################################################################
129     # "less" primitive types<![CDATA[
130    
131 pcg 1.3 decTREE
132     encTREE
133    
134 pcg 1.1 ]]>
135    
136     #############################################################################
137     # messages
138     <xsl:apply-templates select="descendant::message"/>
139     }
140    
141     1;
142     </xsl:template>
143    
144     <xsl:template match="type[@type = 'S']">
145 pcg 1.3 dec<xsl:value-of select="@name"/> :: State [Word8] [Char]
146     dec<xsl:value-of select="@name"/> = do
147     -- decode UCS-2 string of length <xsl:value-of select="@length"/>
148     -- the first 0 terminates the string, but not the field
149 pcg 1.1
150 pcg 1.3 enc<xsl:value-of select="@name"/> =
151     -- likewise, encode as UCS-2, fill space with 0
152 pcg 1.1 </xsl:template>
153    
154     <xsl:template match="type[@type = 'A']">
155 pcg 1.3 dec<xsl:value-of select="@name"/> :: State [Word8] [Char]
156     dec<xsl:value-of select="@name"/> = do
157     -- decode ASCII string of length <xsl:value-of select="@length"/>
158     -- the first 0 terminates the string, but not the field
159 pcg 1.1
160 pcg 1.3 enc<xsl:value-of select="@name"/> =
161     -- likewise, encode as ASCII, fill space with 0
162 pcg 1.1 </xsl:template>
163    
164     <xsl:template match="type[@multiplier]">
165 pcg 1.3 dec<xsl:value-of select="@name"/> = do
166     n &lt;- dec<xsl:value-of select="@type"/>
167     return n * (1 / <xsl:value-of select="@multiplier"/>)
168 pcg 1.1
169 pcg 1.3 enc<xsl:value-of select="@name"/> =
170     <xsl:value-of select="@multiplier"/> * enc<xsl:value-of select="@type"/>
171 pcg 1.1 </xsl:template>
172    
173     <xsl:template match="member[@array = 'yes']" mode="dec">
174     $r->{<xsl:value-of select="@name"/>} = (my $array = []);
175     while (length $data) {
176     push @$array, dec_<xsl:value-of select="@type"/>
177     <xsl:text> </xsl:text>
178     <xsl:value-of select="@default"/>;
179     }
180     </xsl:template>
181    
182     <xsl:template match="member" mode="dec">
183     <xsl:if test="@guard-cond">
184     if ($r->{<xsl:value-of select="@guard-member"/>} <xsl:value-of select="@guard-cond"/>)</xsl:if>
185     <xsl:text>;</xsl:text>
186 pcg 1.4 dec<xsl:value-of select="@type"/> -- default <xsl:value-of select="@default"/> --
187 pcg 1.1 </xsl:template>
188    
189     <xsl:template match="member" mode="enc">
190 pcg 1.4 enc<xsl:value-of select="@type"/> defined $_[0]{<xsl:value-of select="@name"/>} ? $_[0]{<xsl:value-of select="@name"/>
191 pcg 1.1 <xsl:text>} : (</xsl:text>
192     <xsl:value-of select="@default"/>
193     <xsl:text>);</xsl:text>
194     </xsl:template>
195    
196     <xsl:template match="struct">
197     sub dec_<xsl:value-of select="@name"/> {
198     my $r = {};
199     <xsl:apply-templates select="member" mode="dec"/>
200     <xsl:if test="@class">
201     bless $r, <xsl:value-of select="@class"/>::;
202     </xsl:if>
203     $r;
204     }
205    
206     sub enc_<xsl:value-of select="@name"/> {
207     <xsl:apply-templates select="member" mode="enc"/>
208     }
209     </xsl:template>
210    
211     <xsl:template match="message">
212     # <xsl:value-of select="@name"/>
213     $dec_<xsl:value-of select="@src"/>{0x<xsl:value-of select="@type"/>} = sub {
214     $data = $_[0];
215     my $r;
216     $r->{type} = "<xsl:value-of select="@name"/>";
217     <xsl:apply-templates select="member" mode="dec"/>
218     $r;
219     };
220     $enc_<xsl:value-of select="@src"/>{<xsl:value-of select="@name"/>} = sub {
221     $data = "";
222     enc_U16 0x<xsl:value-of select="@type"/>;
223     <xsl:apply-templates select="member" mode="enc"/>
224     $data;
225     };
226     </xsl:template>
227    
228     <xsl:template match="member">
229     [<xsl:value-of select="@name"/>
230     <xsl:text>=> "</xsl:text>
231     <xsl:value-of select="@type"/>
232     <xsl:text>", "</xsl:text>
233     <xsl:value-of select="@default"/>
234     <xsl:text>", "</xsl:text>
235     <xsl:value-of select="@guard"/>
236     <xsl:text>;"],</xsl:text>
237     </xsl:template>
238    
239     <xsl:template match="text()">
240     </xsl:template>
241    
242     </xsl:stylesheet>
243