123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275 |
- <?xml version="1.0"?>
- <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
- <xsl:output method="text"/>
- <xsl:template match="/">
- <xsl:text><![CDATA[
- #include <libxml/parser.h>
- #include <libxml/tree.h>
- #include <libxml/xpath.h>
- #include <libxml/xpathInternals.h>
- ]]>
- </xsl:text>
- <xsl:call-template name="serializer"/>
- <xsl:apply-templates select="tests/test"/>
- <xsl:text>
- int main(int argc, char **argv) {
</xsl:text>
- <xsl:apply-templates select="tests/test" mode="call"/>
- <xsl:text>
- /* printf("finished.\n"); */
- return (0);
- }
- </xsl:text>
- </xsl:template>
- <xsl:template match="tests/test" mode="call">
- <xsl:text> nsTest_</xsl:text>
- <xsl:value-of select="@name"/>
- <xsl:text>();
</xsl:text>
- </xsl:template>
- <xsl:template name="xml-text">
- <xsl:param name="text"/>
- <xsl:call-template name="replace-string">
- <!-- Substitute #10 for " -->
- <xsl:with-param name="from" select="' '"/>
- <xsl:with-param name="to" select="'" "'"/>
- <xsl:with-param name="text">
- <xsl:call-template name="replace-string">
- <!-- Substitute " for \" -->
- <xsl:with-param name="from" select="'"'"/>
- <xsl:with-param name="to" select="'\"'"/>
- <xsl:with-param name="text">
- <xsl:call-template name="replace-string">
- <!-- Remove tabs. -->
- <xsl:with-param name="from" select="'	'"/>
- <xsl:with-param name="to" select="''"/>
- <xsl:with-param name="text" select="$text"/>
- </xsl:call-template>
- </xsl:with-param>
- </xsl:call-template>
- </xsl:with-param>
- </xsl:call-template>
-
- </xsl:template>
- <xsl:template match="doc" mode="define">
- <xsl:text> xmlDocPtr </xsl:text>
- <xsl:value-of select="@name"/>
- <xsl:text>;
</xsl:text>
- <xsl:text> const char * </xsl:text>
- <xsl:value-of select="@name"/>
- <xsl:text>_str = "</xsl:text>
- <xsl:call-template name="xml-text">
- <xsl:with-param name="text" select="."/>
- </xsl:call-template>
- <xsl:text>";
</xsl:text>
- </xsl:template>
- <xsl:template match="expected" mode="define">
- <xsl:text> const char * </xsl:text>
- <xsl:text>exp_str = "</xsl:text>
- <xsl:call-template name="xml-text">
- <xsl:with-param name="text" select="."/>
- </xsl:call-template>
- <xsl:text>";
</xsl:text>
- </xsl:template>
- <xsl:template match="doc">
- <xsl:text> </xsl:text>
- <xsl:value-of select="@name"/>
- <xsl:text> = xmlReadDoc(BAD_CAST </xsl:text>
- <xsl:value-of select="@name"/>
- <xsl:text>_str, NULL, NULL, 0);
</xsl:text>
-
- <xsl:apply-templates select="following-sibling::*[1]"/>
- <xsl:text> xmlFreeDoc(</xsl:text>
- <xsl:value-of select="@name"/>
- <xsl:text>);
</xsl:text>
- </xsl:template>
- <xsl:template match="xpath">
- </xsl:template>
- <xsl:template match="var" mode="define">
- <xsl:text> xmlNodePtr </xsl:text>
- <xsl:value-of select="@name"/>
- <xsl:text>;
</xsl:text>
- </xsl:template>
- <xsl:template match="var">
- <xsl:if test="xpath">
- <!-- Create XPath context. -->
- <xsl:text> /* Selecting node "</xsl:text><xsl:value-of select="@name"/><xsl:text>". */
</xsl:text>
- <xsl:text> xp = xmlXPathNewContext(</xsl:text>
- <xsl:value-of select="xpath/@doc"/>
- <xsl:text>);
</xsl:text>
- <!-- Register namespaces. -->
- <xsl:for-each select="xpath/reg-ns">
- <xsl:text> xmlXPathRegisterNs(xp, BAD_CAST "</xsl:text>
- <xsl:value-of select="@prefix"/>
- <xsl:text>", BAD_CAST "</xsl:text>
- <xsl:value-of select="@ns"/>
- <xsl:text>");
</xsl:text>
- </xsl:for-each>
- <!-- Evaluate. -->
- <xsl:text> </xsl:text>
- <xsl:value-of select="@name"/>
- <xsl:text> = nsSelectNode(xp, "</xsl:text>
- <xsl:value-of select="xpath/@select-node"/>
- <xsl:text>");
</xsl:text>
- <xsl:text> xmlXPathFreeContext(xp);
</xsl:text>
- </xsl:if>
- <xsl:apply-templates select="following-sibling::*[1]"/>
- </xsl:template>
- <xsl:template match="reconcile-ns">
- <xsl:text> /* Reconcile node "</xsl:text><xsl:value-of select="@ref"/><xsl:text>". */
</xsl:text>
- <xsl:text> xmlDOMWrapReconcileNamespaces(NULL, </xsl:text>
- <xsl:value-of select="@node"/>
- <xsl:text>, 0);
</xsl:text>
- <xsl:apply-templates select="following-sibling::*[1]"/>
- </xsl:template>
- <xsl:template match="remove">
- <xsl:text> xmlDOMWrapRemoveNode(NULL, </xsl:text>
- <xsl:value-of select="@node"/>
- <xsl:text>->doc, </xsl:text>
- <xsl:value-of select="@node"/>
- <xsl:text>, 0);
</xsl:text>
- <xsl:apply-templates select="following-sibling::*[1]"/>
- </xsl:template>
- <xsl:template match="adopt">
- <xsl:text> /* Adopt "</xsl:text><xsl:value-of select="@node"/><xsl:text>". */
</xsl:text>
- <xsl:text> xmlDOMWrapAdoptNode(NULL, </xsl:text>
- <xsl:value-of select="@node"/>
- <xsl:text>->doc, </xsl:text>
- <xsl:value-of select="@node"/>
- <xsl:text>, </xsl:text>
- <xsl:value-of select="@dest-doc"/>
- <xsl:text>, </xsl:text>
- <xsl:choose>
- <xsl:when test="@dest-parent">
- <xsl:value-of select="@dest-parent"/>
- </xsl:when>
- <xsl:otherwise>
- <xsl:text>NULL</xsl:text>
- </xsl:otherwise>
- </xsl:choose>
- <xsl:text>, 0);
</xsl:text>
- <xsl:apply-templates select="following-sibling::*[1]"/>
- </xsl:template>
- <xsl:template match="append-child">
- <xsl:text> xmlAddChild(</xsl:text>
- <xsl:value-of select="@parent"/>
- <xsl:text>, </xsl:text>
- <xsl:value-of select="@child"/>
- <xsl:text>);
</xsl:text>
- <xsl:apply-templates select="following-sibling::*[1]"/>
- </xsl:template>
- <xsl:template match="expected">
- <xsl:text> /* Serialize "</xsl:text><xsl:value-of select="@doc"/><xsl:text>". */
</xsl:text>
- <xsl:text> result_str = nsSerializeNode(xmlDocGetRootElement(</xsl:text>
- <xsl:value-of select="@doc"/>
- <xsl:text>));
</xsl:text>
- <xsl:text> /* Compare result. */
- if (! xmlStrEqual(BAD_CAST result_str, BAD_CAST exp_str)) {
- printf("FAILED\n");
- printf("%s\n", (const char *) result_str);
- printf("- - -\n");
- printf("Expected:\n%s\n", exp_str);
- printf("= = =\n");
- }
- xmlFree(result_str);
</xsl:text>
- </xsl:template>
- <!--********
- * TEST *
- ********-->
- <xsl:template match="test">
- <xsl:text>void nsTest_</xsl:text>
- <xsl:value-of select="@name"/>
- <xsl:text>(void) {
- xmlChar * result_str;
- xmlXPathContextPtr xp;
- int memory;
</xsl:text>
- <xsl:apply-templates select="*" mode="define"/>
- <xsl:text>
- memory = xmlMemUsed();
- xmlInitParser();

</xsl:text>
- <xsl:apply-templates select="child::*[1]"/>
- <xsl:text>
- xmlCleanupParser();
- memory = xmlMemUsed() - memory;
- if (memory != 0) {
- printf("## '%s' MEMORY leak: %d\n", "</xsl:text>
- <xsl:value-of select="@name"/>
- <xsl:text>", memory);
- }
- }
- </xsl:text>
- </xsl:template>
- <xsl:template name="serializer">
- <xsl:text>
-
- xmlChar * nsSerializeNode(xmlNodePtr node) {
- xmlChar * ret;
- xmlOutputBufferPtr buf;
- buf = xmlAllocOutputBuffer(NULL);
- xmlNodeDumpOutput(buf, node->doc, node, 0, 0, NULL);
- xmlOutputBufferFlush(buf);
- ret = (xmlChar *) buf->buffer->content;
- buf->buffer->content = NULL;
- (void) xmlOutputBufferClose(buf);
- return (ret);
- }
- xmlNodePtr nsSelectNode(xmlXPathContextPtr xp, const char * xpath) {
- xmlXPathObjectPtr xpres;
- xmlNodePtr ret;
-
- xpres = xmlXPathEval(BAD_CAST xpath, xp);
- ret = xpres->nodesetval->nodeTab[0];
- xmlXPathFreeObject(xpres);
- return (ret);
- }
- </xsl:text>
- </xsl:template>
- <xsl:template name="replace-string">
- <xsl:param name="text"/>
- <xsl:param name="from"/>
- <xsl:param name="to"/>
- <xsl:choose>
- <xsl:when test="contains($text, $from)">
- <xsl:variable name="before" select="substring-before($text, $from)"/>
- <xsl:variable name="after" select="substring-after($text, $from)"/>
- <xsl:variable name="prefix" select="concat($before, $to)"/>
- <xsl:value-of select="$before"/>
- <xsl:value-of select="$to"/>
- <xsl:call-template name="replace-string">
- <xsl:with-param name="text" select="$after"/>
- <xsl:with-param name="from" select="$from"/>
- <xsl:with-param name="to" select="$to"/>
- </xsl:call-template>
- </xsl:when>
- <xsl:otherwise>
- <xsl:value-of select="$text"/>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-
-
- </xsl:stylesheet>
|