| <?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> |