• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<?xml version="1.0"?>
2<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
3	<xsl:output method="text"/>
4
5	<xsl:template match="/">
6		<xsl:text><![CDATA[
7#include <libxml/parser.h>
8#include <libxml/tree.h>
9#include <libxml/xpath.h>
10#include <libxml/xpathInternals.h>
11]]>
12</xsl:text>
13		<xsl:call-template name="serializer"/>
14		<xsl:apply-templates select="tests/test"/>
15		<xsl:text>
16
17int main(int argc, char **argv) {&#xA;</xsl:text>
18		<xsl:apply-templates select="tests/test" mode="call"/>
19		<xsl:text>
20	/* printf("finished.\n"); */
21	return (0);
22}
23</xsl:text>
24	</xsl:template>
25
26	<xsl:template match="tests/test" mode="call">
27		<xsl:text>	nsTest_</xsl:text>
28		<xsl:value-of select="@name"/>
29		<xsl:text>();&#xA;</xsl:text>
30	</xsl:template>
31
32	<xsl:template name="xml-text">
33		<xsl:param name="text"/>
34		<xsl:call-template name="replace-string">
35			<!-- Substitute #10 for " -->
36	        <xsl:with-param name="from" select="'&#10;'"/>
37	        <xsl:with-param name="to" select="'&quot;&#10;&quot;'"/>
38			<xsl:with-param name="text">
39				<xsl:call-template name="replace-string">
40					<!-- Substitute " for \" -->
41	        		<xsl:with-param name="from" select="'&quot;'"/>
42	        		<xsl:with-param name="to" select="'\&quot;'"/>
43					<xsl:with-param name="text">
44						<xsl:call-template name="replace-string">
45							<!-- Remove tabs. -->
46			        		<xsl:with-param name="from" select="'&#9;'"/>
47			        		<xsl:with-param name="to" select="''"/>
48							<xsl:with-param name="text" select="$text"/>
49	    				</xsl:call-template>
50					</xsl:with-param>
51    			</xsl:call-template>
52			</xsl:with-param>
53    	</xsl:call-template>
54
55	</xsl:template>
56
57	<xsl:template match="doc" mode="define">
58		<xsl:text>	xmlDocPtr </xsl:text>
59		<xsl:value-of select="@name"/>
60		<xsl:text>;&#xA;</xsl:text>
61		<xsl:text>	const char * </xsl:text>
62		<xsl:value-of select="@name"/>
63		<xsl:text>_str = "</xsl:text>
64		<xsl:call-template name="xml-text">
65	        <xsl:with-param name="text" select="."/>
66    	</xsl:call-template>
67		<xsl:text>";&#xA;</xsl:text>
68	</xsl:template>
69
70	<xsl:template match="expected" mode="define">
71		<xsl:text>	const char * </xsl:text>
72		<xsl:text>exp_str = "</xsl:text>
73		<xsl:call-template name="xml-text">
74	        <xsl:with-param name="text" select="."/>
75    	</xsl:call-template>
76		<xsl:text>";&#xA;</xsl:text>
77	</xsl:template>
78
79	<xsl:template match="doc">
80		<xsl:text>	</xsl:text>
81		<xsl:value-of select="@name"/>
82		<xsl:text> = xmlReadDoc(BAD_CAST </xsl:text>
83		<xsl:value-of select="@name"/>
84		<xsl:text>_str, NULL, NULL, 0);&#xA;</xsl:text>
85
86		<xsl:apply-templates select="following-sibling::*[1]"/>
87
88		<xsl:text>	xmlFreeDoc(</xsl:text>
89		<xsl:value-of select="@name"/>
90		<xsl:text>);&#xA;</xsl:text>
91	</xsl:template>
92
93	<xsl:template match="xpath">
94	</xsl:template>
95
96	<xsl:template match="var" mode="define">
97		<xsl:text>	xmlNodePtr </xsl:text>
98		<xsl:value-of select="@name"/>
99		<xsl:text>;&#xA;</xsl:text>
100	</xsl:template>
101
102	<xsl:template match="var">
103		<xsl:if test="xpath">
104			<!-- Create XPath context. -->
105			<xsl:text>	/* Selecting node "</xsl:text><xsl:value-of select="@name"/><xsl:text>". */&#xA;</xsl:text>
106			<xsl:text>	xp = xmlXPathNewContext(</xsl:text>
107			<xsl:value-of select="xpath/@doc"/>
108			<xsl:text>);&#xA;</xsl:text>
109			<!-- Register namespaces. -->
110			<xsl:for-each select="xpath/reg-ns">
111				<xsl:text>	xmlXPathRegisterNs(xp, BAD_CAST "</xsl:text>
112				<xsl:value-of select="@prefix"/>
113				<xsl:text>", BAD_CAST "</xsl:text>
114				<xsl:value-of select="@ns"/>
115				<xsl:text>");&#xA;</xsl:text>
116			</xsl:for-each>
117			<!-- Evaluate. -->
118			<xsl:text>	</xsl:text>
119			<xsl:value-of select="@name"/>
120			<xsl:text> = nsSelectNode(xp, "</xsl:text>
121			<xsl:value-of select="xpath/@select-node"/>
122			<xsl:text>");&#xA;</xsl:text>
123			<xsl:text>	xmlXPathFreeContext(xp);&#xA;</xsl:text>
124		</xsl:if>
125		<xsl:apply-templates select="following-sibling::*[1]"/>
126	</xsl:template>
127
128	<xsl:template match="reconcile-ns">
129		<xsl:text>	/* Reconcile node "</xsl:text><xsl:value-of select="@ref"/><xsl:text>". */&#xA;</xsl:text>
130		<xsl:text>	xmlDOMWrapReconcileNamespaces(NULL, </xsl:text>
131		<xsl:value-of select="@node"/>
132		<xsl:text>, 0);&#xA;</xsl:text>
133		<xsl:apply-templates select="following-sibling::*[1]"/>
134	</xsl:template>
135
136	<xsl:template match="remove">
137		<xsl:text>	xmlDOMWrapRemoveNode(NULL, </xsl:text>
138		<xsl:value-of select="@node"/>
139		<xsl:text>->doc, </xsl:text>
140		<xsl:value-of select="@node"/>
141		<xsl:text>, 0);&#xA;</xsl:text>
142		<xsl:apply-templates select="following-sibling::*[1]"/>
143	</xsl:template>
144
145	<xsl:template match="adopt">
146		<xsl:text>	/* Adopt "</xsl:text><xsl:value-of select="@node"/><xsl:text>". */&#xA;</xsl:text>
147		<xsl:text>	xmlDOMWrapAdoptNode(NULL, </xsl:text>
148		<xsl:value-of select="@node"/>
149		<xsl:text>->doc, </xsl:text>
150		<xsl:value-of select="@node"/>
151		<xsl:text>, </xsl:text>
152		<xsl:value-of select="@dest-doc"/>
153		<xsl:text>, </xsl:text>
154		<xsl:choose>
155			<xsl:when test="@dest-parent">
156				<xsl:value-of select="@dest-parent"/>
157			</xsl:when>
158			<xsl:otherwise>
159				<xsl:text>NULL</xsl:text>
160			</xsl:otherwise>
161		</xsl:choose>
162		<xsl:text>, 0);&#xA;</xsl:text>
163		<xsl:apply-templates select="following-sibling::*[1]"/>
164	</xsl:template>
165
166	<xsl:template match="append-child">
167		<xsl:text>	xmlAddChild(</xsl:text>
168		<xsl:value-of select="@parent"/>
169		<xsl:text>, </xsl:text>
170		<xsl:value-of select="@child"/>
171		<xsl:text>);&#xA;</xsl:text>
172		<xsl:apply-templates select="following-sibling::*[1]"/>
173	</xsl:template>
174
175	<xsl:template match="expected">
176		<xsl:text>	/* Serialize "</xsl:text><xsl:value-of select="@doc"/><xsl:text>". */&#xA;</xsl:text>
177		<xsl:text>	result_str = nsSerializeNode(xmlDocGetRootElement(</xsl:text>
178		<xsl:value-of select="@doc"/>
179		<xsl:text>));&#xA;</xsl:text>
180		<xsl:text>	/* Compare result. */
181	if (! xmlStrEqual(BAD_CAST result_str, BAD_CAST exp_str)) {
182		printf("FAILED\n");
183		printf("%s\n", (const char *) result_str);
184		printf("- - -\n");
185		printf("Expected:\n%s\n", exp_str);
186		printf("= = =\n");
187	}
188	xmlFree(result_str);&#xA;</xsl:text>
189	</xsl:template>
190
191	<!--********
192	    * TEST *
193	    ********-->
194	<xsl:template match="test">
195		<xsl:text>void nsTest_</xsl:text>
196		<xsl:value-of select="@name"/>
197		<xsl:text>(void) {
198	xmlChar * result_str;
199	xmlXPathContextPtr xp;
200	int memory;&#xA;</xsl:text>
201		<xsl:apply-templates select="*" mode="define"/>
202		<xsl:text>
203	memory = xmlMemUsed();
204	xmlInitParser();&#xA;&#xA;</xsl:text>
205		<xsl:apply-templates select="child::*[1]"/>
206		<xsl:text>
207	xmlCleanupParser();
208	memory = xmlMemUsed() - memory;
209
210	if (memory != 0) {
211		printf("## '%s' MEMORY leak: %d\n", "</xsl:text>
212		<xsl:value-of select="@name"/>
213		<xsl:text>", memory);
214    }
215}
216</xsl:text>
217	</xsl:template>
218
219	<xsl:template name="serializer">
220		<xsl:text>
221
222xmlChar * nsSerializeNode(xmlNodePtr node) {
223	xmlChar * ret;
224
225	xmlOutputBufferPtr buf;
226	buf = xmlAllocOutputBuffer(NULL);
227	xmlNodeDumpOutput(buf, node->doc, node, 0, 0, NULL);
228	xmlOutputBufferFlush(buf);
229	ret = (xmlChar *) buf->buffer->content;
230	buf->buffer->content = NULL;
231	(void) xmlOutputBufferClose(buf);
232	return (ret);
233}
234
235xmlNodePtr nsSelectNode(xmlXPathContextPtr xp, const char * xpath) {
236	xmlXPathObjectPtr xpres;
237	xmlNodePtr ret;
238
239	xpres = xmlXPathEval(BAD_CAST xpath, xp);
240	ret = xpres->nodesetval->nodeTab[0];
241	xmlXPathFreeObject(xpres);
242	return (ret);
243}
244
245</xsl:text>
246	</xsl:template>
247
248	<xsl:template name="replace-string">
249    <xsl:param name="text"/>
250    <xsl:param name="from"/>
251    <xsl:param name="to"/>
252
253    <xsl:choose>
254      <xsl:when test="contains($text, $from)">
255
256	<xsl:variable name="before" select="substring-before($text, $from)"/>
257	<xsl:variable name="after" select="substring-after($text, $from)"/>
258	<xsl:variable name="prefix" select="concat($before, $to)"/>
259
260	<xsl:value-of select="$before"/>
261	<xsl:value-of select="$to"/>
262        <xsl:call-template name="replace-string">
263	  <xsl:with-param name="text" select="$after"/>
264	  <xsl:with-param name="from" select="$from"/>
265	  <xsl:with-param name="to" select="$to"/>
266	</xsl:call-template>
267      </xsl:when>
268      <xsl:otherwise>
269        <xsl:value-of select="$text"/>
270      </xsl:otherwise>
271    </xsl:choose>
272 </xsl:template>
273
274
275</xsl:stylesheet>
276