mirror of
https://gitlab.gnome.org/GNOME/libxslt
synced 2025-08-08 21:42:07 +03:00
Copying testplugin.c to the right place really, Daniel
This commit is contained in:
329
tests/plugins/testplugin.c
Normal file
329
tests/plugins/testplugin.c
Normal file
@@ -0,0 +1,329 @@
|
|||||||
|
/*
|
||||||
|
* extensions.c: Implemetation of the extensions support
|
||||||
|
*
|
||||||
|
* Reference:
|
||||||
|
* http://www.w3.org/TR/1999/REC-xslt-19991116
|
||||||
|
*
|
||||||
|
* See Copyright for the status of this software.
|
||||||
|
*
|
||||||
|
* daniel@veillard.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define IN_LIBXSLT
|
||||||
|
#include "libxslt.h"
|
||||||
|
|
||||||
|
#ifdef WITH_MODULES
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include <limits.h>
|
||||||
|
|
||||||
|
#include <libxml/xmlmemory.h>
|
||||||
|
#include <libxml/tree.h>
|
||||||
|
#include <libxml/hash.h>
|
||||||
|
#include <libxml/xmlerror.h>
|
||||||
|
#include <libxml/parserInternals.h>
|
||||||
|
#include <libxml/xpathInternals.h>
|
||||||
|
#include <libxml/list.h>
|
||||||
|
#include <libxml/xmlIO.h>
|
||||||
|
#include "xslt.h"
|
||||||
|
#include "xsltInternals.h"
|
||||||
|
#include "xsltutils.h"
|
||||||
|
#include "imports.h"
|
||||||
|
#include "extensions.h"
|
||||||
|
|
||||||
|
#define XSLT_TESTPLUGIN_URL "http://xmlsoft.org/xslt/testplugin"
|
||||||
|
|
||||||
|
/************************************************************************
|
||||||
|
* *
|
||||||
|
* Test plugin module http://xmlsoft.org/xslt/testplugin *
|
||||||
|
* *
|
||||||
|
************************************************************************/
|
||||||
|
|
||||||
|
/************************************************************************
|
||||||
|
* *
|
||||||
|
* Test of the extension module API *
|
||||||
|
* *
|
||||||
|
************************************************************************/
|
||||||
|
|
||||||
|
static xmlChar *testData = NULL;
|
||||||
|
static xmlChar *testStyleData = NULL;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* xsltExtFunctionTest:
|
||||||
|
* @ctxt: the XPath Parser context
|
||||||
|
* @nargs: the number of arguments
|
||||||
|
*
|
||||||
|
* function libxslt:test() for testing the extensions support.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
xsltExtFunctionTest(xmlXPathParserContextPtr ctxt,
|
||||||
|
int nargs ATTRIBUTE_UNUSED)
|
||||||
|
{
|
||||||
|
xsltTransformContextPtr tctxt;
|
||||||
|
void *data = NULL;
|
||||||
|
|
||||||
|
tctxt = xsltXPathGetTransformContext(ctxt);
|
||||||
|
|
||||||
|
if (testData == NULL) {
|
||||||
|
xsltGenericDebug(xsltGenericDebugContext,
|
||||||
|
"xsltExtFunctionTest: not initialized,"
|
||||||
|
" calling xsltGetExtData\n");
|
||||||
|
data = xsltGetExtData(tctxt, (const xmlChar *) XSLT_TESTPLUGIN_URL);
|
||||||
|
if (data == NULL) {
|
||||||
|
xsltTransformError(tctxt, NULL, NULL,
|
||||||
|
"xsltExtElementTest: not initialized\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (tctxt == NULL) {
|
||||||
|
xsltTransformError(xsltXPathGetTransformContext(ctxt), NULL, NULL,
|
||||||
|
"xsltExtFunctionTest: failed to get the transformation context\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (data == NULL)
|
||||||
|
data = xsltGetExtData(tctxt, (const xmlChar *) XSLT_TESTPLUGIN_URL);
|
||||||
|
if (data == NULL) {
|
||||||
|
xsltTransformError(xsltXPathGetTransformContext(ctxt), NULL, NULL,
|
||||||
|
"xsltExtFunctionTest: failed to get module data\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (data != testData) {
|
||||||
|
xsltTransformError(xsltXPathGetTransformContext(ctxt), NULL, NULL,
|
||||||
|
"xsltExtFunctionTest: got wrong module data\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#ifdef WITH_XSLT_DEBUG_FUNCTION
|
||||||
|
xsltGenericDebug(xsltGenericDebugContext,
|
||||||
|
"libxslt:test() called with %d args\n", nargs);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* xsltExtElementPreCompTest:
|
||||||
|
* @style: the stylesheet
|
||||||
|
* @inst: the instruction in the stylesheet
|
||||||
|
*
|
||||||
|
* Process a libxslt:test node
|
||||||
|
*/
|
||||||
|
static xsltElemPreCompPtr
|
||||||
|
xsltExtElementPreCompTest(xsltStylesheetPtr style, xmlNodePtr inst,
|
||||||
|
xsltTransformFunction function)
|
||||||
|
{
|
||||||
|
xsltElemPreCompPtr ret;
|
||||||
|
|
||||||
|
if (style == NULL) {
|
||||||
|
xsltTransformError(NULL, NULL, inst,
|
||||||
|
"xsltExtElementTest: no transformation context\n");
|
||||||
|
return (NULL);
|
||||||
|
}
|
||||||
|
if (testStyleData == NULL) {
|
||||||
|
xsltGenericDebug(xsltGenericDebugContext,
|
||||||
|
"xsltExtElementPreCompTest: not initialized,"
|
||||||
|
" calling xsltStyleGetExtData\n");
|
||||||
|
xsltStyleGetExtData(style, (const xmlChar *) XSLT_TESTPLUGIN_URL);
|
||||||
|
if (testStyleData == NULL) {
|
||||||
|
xsltTransformError(NULL, style, inst,
|
||||||
|
"xsltExtElementPreCompTest: not initialized\n");
|
||||||
|
if (style != NULL)
|
||||||
|
style->errors++;
|
||||||
|
return (NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (inst == NULL) {
|
||||||
|
xsltTransformError(NULL, style, inst,
|
||||||
|
"xsltExtElementPreCompTest: no instruction\n");
|
||||||
|
if (style != NULL)
|
||||||
|
style->errors++;
|
||||||
|
return (NULL);
|
||||||
|
}
|
||||||
|
ret = xsltNewElemPreComp(style, inst, function);
|
||||||
|
return (ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* xsltExtElementTest:
|
||||||
|
* @ctxt: an XSLT processing context
|
||||||
|
* @node: The current node
|
||||||
|
* @inst: the instruction in the stylesheet
|
||||||
|
* @comp: precomputed informations
|
||||||
|
*
|
||||||
|
* Process a libxslt:test node
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
xsltExtElementTest(xsltTransformContextPtr ctxt, xmlNodePtr node,
|
||||||
|
xmlNodePtr inst,
|
||||||
|
xsltElemPreCompPtr comp ATTRIBUTE_UNUSED)
|
||||||
|
{
|
||||||
|
xmlNodePtr commentNode;
|
||||||
|
|
||||||
|
if (testData == NULL) {
|
||||||
|
xsltGenericDebug(xsltGenericDebugContext,
|
||||||
|
"xsltExtElementTest: not initialized,"
|
||||||
|
" calling xsltGetExtData\n");
|
||||||
|
xsltGetExtData(ctxt, (const xmlChar *) XSLT_TESTPLUGIN_URL);
|
||||||
|
if (testData == NULL) {
|
||||||
|
xsltTransformError(ctxt, NULL, inst,
|
||||||
|
"xsltExtElementTest: not initialized\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (ctxt == NULL) {
|
||||||
|
xsltTransformError(ctxt, NULL, inst,
|
||||||
|
"xsltExtElementTest: no transformation context\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (node == NULL) {
|
||||||
|
xsltTransformError(ctxt, NULL, inst,
|
||||||
|
"xsltExtElementTest: no current node\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (inst == NULL) {
|
||||||
|
xsltTransformError(ctxt, NULL, inst,
|
||||||
|
"xsltExtElementTest: no instruction\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (ctxt->insert == NULL) {
|
||||||
|
xsltTransformError(ctxt, NULL, inst,
|
||||||
|
"xsltExtElementTest: no insertion point\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
commentNode = xmlNewComment((const xmlChar *)
|
||||||
|
"libxslt:testplugin element test worked");
|
||||||
|
xmlAddChild(ctxt->insert, commentNode);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* xsltExtInitTest:
|
||||||
|
* @ctxt: an XSLT transformation context
|
||||||
|
* @URI: the namespace URI for the extension
|
||||||
|
*
|
||||||
|
* A function called at initialization time of an XSLT extension module
|
||||||
|
*
|
||||||
|
* Returns a pointer to the module specific data for this transformation
|
||||||
|
*/
|
||||||
|
static void *
|
||||||
|
xsltExtInitTest(xsltTransformContextPtr ctxt, const xmlChar * URI)
|
||||||
|
{
|
||||||
|
if (testStyleData == NULL) {
|
||||||
|
xsltGenericDebug(xsltGenericErrorContext,
|
||||||
|
"xsltExtInitTest: not initialized,"
|
||||||
|
" calling xsltStyleGetExtData\n");
|
||||||
|
xsltStyleGetExtData(ctxt->style, URI);
|
||||||
|
if (testStyleData == NULL) {
|
||||||
|
xsltTransformError(ctxt, NULL, NULL,
|
||||||
|
"xsltExtInitTest: not initialized\n");
|
||||||
|
return (NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (testData != NULL) {
|
||||||
|
xsltTransformError(ctxt, NULL, NULL,
|
||||||
|
"xsltExtInitTest: already initialized\n");
|
||||||
|
return (NULL);
|
||||||
|
}
|
||||||
|
testData = (void *) "test data";
|
||||||
|
xsltGenericDebug(xsltGenericDebugContext,
|
||||||
|
"Registered test plugin module : %s\n", URI);
|
||||||
|
return (testData);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* xsltExtShutdownTest:
|
||||||
|
* @ctxt: an XSLT transformation context
|
||||||
|
* @URI: the namespace URI for the extension
|
||||||
|
* @data: the data associated to this module
|
||||||
|
*
|
||||||
|
* A function called at shutdown time of an XSLT extension module
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
xsltExtShutdownTest(xsltTransformContextPtr ctxt,
|
||||||
|
const xmlChar * URI, void *data)
|
||||||
|
{
|
||||||
|
if (testData == NULL) {
|
||||||
|
xsltTransformError(ctxt, NULL, NULL,
|
||||||
|
"xsltExtShutdownTest: not initialized\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (data != testData) {
|
||||||
|
xsltTransformError(ctxt, NULL, NULL,
|
||||||
|
"xsltExtShutdownTest: wrong data\n");
|
||||||
|
}
|
||||||
|
testData = NULL;
|
||||||
|
xsltGenericDebug(xsltGenericDebugContext,
|
||||||
|
"Unregistered test plugin module : %s\n", URI);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* xsltExtStyleInitTest:
|
||||||
|
* @style: an XSLT stylesheet
|
||||||
|
* @URI: the namespace URI for the extension
|
||||||
|
*
|
||||||
|
* A function called at initialization time of an XSLT extension module
|
||||||
|
*
|
||||||
|
* Returns a pointer to the module specific data for this transformation
|
||||||
|
*/
|
||||||
|
static void *
|
||||||
|
xsltExtStyleInitTest(xsltStylesheetPtr style ATTRIBUTE_UNUSED,
|
||||||
|
const xmlChar * URI)
|
||||||
|
{
|
||||||
|
if (testStyleData != NULL) {
|
||||||
|
xsltTransformError(NULL, NULL, NULL,
|
||||||
|
"xsltExtInitTest: already initialized\n");
|
||||||
|
return (NULL);
|
||||||
|
}
|
||||||
|
testStyleData = (void *) "test data";
|
||||||
|
xsltGenericDebug(xsltGenericDebugContext,
|
||||||
|
"Registered test plugin module : %s\n", URI);
|
||||||
|
return (testStyleData);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* xsltExtStyleShutdownTest:
|
||||||
|
* @style: an XSLT stylesheet
|
||||||
|
* @URI: the namespace URI for the extension
|
||||||
|
* @data: the data associated to this module
|
||||||
|
*
|
||||||
|
* A function called at shutdown time of an XSLT extension module
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
xsltExtStyleShutdownTest(xsltStylesheetPtr style ATTRIBUTE_UNUSED,
|
||||||
|
const xmlChar * URI, void *data)
|
||||||
|
{
|
||||||
|
if (testStyleData == NULL) {
|
||||||
|
xsltGenericError(xsltGenericErrorContext,
|
||||||
|
"xsltExtShutdownTest: not initialized\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (data != testStyleData) {
|
||||||
|
xsltTransformError(NULL, NULL, NULL,
|
||||||
|
"xsltExtShutdownTest: wrong data\n");
|
||||||
|
}
|
||||||
|
testStyleData = NULL;
|
||||||
|
xsltGenericDebug(xsltGenericDebugContext,
|
||||||
|
"Unregistered test plugin module : %s\n", URI);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* xmlsoft_org_xslt_testplugin_init:
|
||||||
|
*
|
||||||
|
* Registers the test plugin module
|
||||||
|
*/
|
||||||
|
|
||||||
|
void
|
||||||
|
xmlsoft_org_xslt_testplugin_init(void)
|
||||||
|
{
|
||||||
|
xsltRegisterExtModuleFull((const xmlChar *) XSLT_TESTPLUGIN_URL,
|
||||||
|
xsltExtInitTest, xsltExtShutdownTest,
|
||||||
|
xsltExtStyleInitTest,
|
||||||
|
xsltExtStyleShutdownTest);
|
||||||
|
xsltRegisterExtModuleFunction((const xmlChar *) "testplugin",
|
||||||
|
(const xmlChar *) XSLT_TESTPLUGIN_URL,
|
||||||
|
xsltExtFunctionTest);
|
||||||
|
xsltRegisterExtModuleElement((const xmlChar *) "testplugin",
|
||||||
|
(const xmlChar *) XSLT_TESTPLUGIN_URL,
|
||||||
|
xsltExtElementPreCompTest,
|
||||||
|
xsltExtElementTest);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /*WITH_MODULES*/
|
Reference in New Issue
Block a user