15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IN_LIBEXSLT
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "libexslt/libexslt.h"
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(WIN32) && !defined (__CYGWIN__) && (!__MINGW32__)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <win32config.h>
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "config.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/tree.h>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/xpath.h>
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/xpathInternals.h>
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxslt/xsltutils.h>
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxslt/xsltInternals.h>
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxslt/extensions.h>
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "exslt.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * exsltSetsDifferenceFunction:
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  an XPath parser context
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @nargs:  the number of arguments
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Wraps #xmlXPathDifference for use by the XPath processor
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)exsltSetsDifferenceFunction (xmlXPathParserContextPtr ctxt, int nargs) {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodeSetPtr arg1, arg2, ret;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (nargs != 2) {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlXPathSetArityError(ctxt);
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    arg2 = xmlXPathPopNodeSet(ctxt);
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlXPathCheckError(ctxt)) {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlXPathSetTypeError(ctxt);
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    arg1 = xmlXPathPopNodeSet(ctxt);
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlXPathCheckError(ctxt)) {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlXPathSetTypeError(ctxt);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlXPathDifference(arg1, arg2);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret != arg1)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlXPathFreeNodeSet(arg1);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlXPathFreeNodeSet(arg2);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlXPathReturnNodeSet(ctxt, ret);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * exsltSetsIntersectionFunction:
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  an XPath parser context
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @nargs:  the number of arguments
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Wraps #xmlXPathIntersection for use by the XPath processor
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)exsltSetsIntersectionFunction (xmlXPathParserContextPtr ctxt, int nargs) {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodeSetPtr arg1, arg2, ret;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (nargs != 2) {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlXPathSetArityError(ctxt);
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    arg2 = xmlXPathPopNodeSet(ctxt);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlXPathCheckError(ctxt)) {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlXPathSetTypeError(ctxt);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    arg1 = xmlXPathPopNodeSet(ctxt);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlXPathCheckError(ctxt)) {
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlXPathSetTypeError(ctxt);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlXPathIntersection(arg1, arg2);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlXPathFreeNodeSet(arg1);
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlXPathFreeNodeSet(arg2);
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlXPathReturnNodeSet(ctxt, ret);
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * exsltSetsDistinctFunction:
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  an XPath parser context
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @nargs:  the number of arguments
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Wraps #xmlXPathDistinct for use by the XPath processor
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)exsltSetsDistinctFunction (xmlXPathParserContextPtr ctxt, int nargs) {
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlXPathObjectPtr obj;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodeSetPtr ns, ret;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int boolval = 0;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void *user = NULL;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (nargs != 1) {
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlXPathSetArityError(ctxt);
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt->value != NULL) {
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        boolval = ctxt->value->boolval;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	user = ctxt->value->user;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ctxt->value->boolval = 0;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ctxt->value->user = NULL;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ns = xmlXPathPopNodeSet(ctxt);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlXPathCheckError(ctxt))
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* !!! must be sorted !!! */
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlXPathDistinctSorted(ns);
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ret != ns)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlXPathFreeNodeSet(ns);
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    obj = xmlXPathWrapNodeSet(ret);
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    obj->user = user;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    obj->boolval = boolval;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    valuePush((ctxt), obj);
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * exsltSetsHasSameNodesFunction:
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  an XPath parser context
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @nargs:  the number of arguments
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Wraps #xmlXPathHasSameNodes for use by the XPath processor
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)exsltSetsHasSameNodesFunction (xmlXPathParserContextPtr ctxt,
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			      int nargs) {
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodeSetPtr arg1, arg2;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (nargs != 2) {
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlXPathSetArityError(ctxt);
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    arg2 = xmlXPathPopNodeSet(ctxt);
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlXPathCheckError(ctxt)) {
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlXPathSetTypeError(ctxt);
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    arg1 = xmlXPathPopNodeSet(ctxt);
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlXPathCheckError(ctxt)) {
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlXPathSetTypeError(ctxt);
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlXPathHasSameNodes(arg1, arg2);
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlXPathFreeNodeSet(arg1);
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlXPathFreeNodeSet(arg2);
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlXPathReturnBoolean(ctxt, ret);
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * exsltSetsLeadingFunction:
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  an XPath parser context
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @nargs:  the number of arguments
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Wraps #xmlXPathLeading for use by the XPath processor
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)exsltSetsLeadingFunction (xmlXPathParserContextPtr ctxt, int nargs) {
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodeSetPtr arg1, arg2, ret;
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (nargs != 2) {
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlXPathSetArityError(ctxt);
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    arg2 = xmlXPathPopNodeSet(ctxt);
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlXPathCheckError(ctxt)) {
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlXPathSetTypeError(ctxt);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    arg1 = xmlXPathPopNodeSet(ctxt);
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlXPathCheckError(ctxt)) {
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlXPathSetTypeError(ctxt);
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*  If the second node set is empty, then the first node set is
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * returned.
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlXPathNodeSetIsEmpty(arg2)) {
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlXPathReturnNodeSet(ctxt, arg1);
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlXPathFreeNodeSet(arg2);
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* !!! must be sorted */
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlXPathNodeLeadingSorted(arg1, xmlXPathNodeSetItem(arg2, 0));
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlXPathFreeNodeSet(arg1);
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlXPathFreeNodeSet(arg2);
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlXPathReturnNodeSet(ctxt, ret);
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * exsltSetsTrailingFunction:
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  an XPath parser context
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @nargs:  the number of arguments
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Wraps #xmlXPathTrailing for use by the XPath processor
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)exsltSetsTrailingFunction (xmlXPathParserContextPtr ctxt, int nargs) {
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodeSetPtr arg1, arg2, ret;
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (nargs != 2) {
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlXPathSetArityError(ctxt);
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    arg2 = xmlXPathPopNodeSet(ctxt);
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlXPathCheckError(ctxt)) {
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlXPathSetTypeError(ctxt);
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    arg1 = xmlXPathPopNodeSet(ctxt);
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlXPathCheckError(ctxt)) {
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlXPathSetTypeError(ctxt);
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*  If the second node set is empty, then the first node set is
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * returned.
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlXPathNodeSetIsEmpty(arg2)) {
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlXPathReturnNodeSet(ctxt, arg1);
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlXPathFreeNodeSet(arg2);
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* !!! mist be sorted */
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlXPathNodeTrailingSorted(arg1, xmlXPathNodeSetItem(arg2, 0));
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlXPathFreeNodeSet(arg1);
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlXPathFreeNodeSet(arg2);
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlXPathReturnNodeSet(ctxt, ret);
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * exsltSetsRegister:
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Registers the EXSLT - Sets module
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)exsltSetsRegister (void) {
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xsltRegisterExtModuleFunction ((const xmlChar *) "difference",
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				   EXSLT_SETS_NAMESPACE,
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				   exsltSetsDifferenceFunction);
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xsltRegisterExtModuleFunction ((const xmlChar *) "intersection",
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				   EXSLT_SETS_NAMESPACE,
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				   exsltSetsIntersectionFunction);
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xsltRegisterExtModuleFunction ((const xmlChar *) "distinct",
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				   EXSLT_SETS_NAMESPACE,
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				   exsltSetsDistinctFunction);
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xsltRegisterExtModuleFunction ((const xmlChar *) "has-same-node",
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				   EXSLT_SETS_NAMESPACE,
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				   exsltSetsHasSameNodesFunction);
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xsltRegisterExtModuleFunction ((const xmlChar *) "leading",
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				   EXSLT_SETS_NAMESPACE,
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				   exsltSetsLeadingFunction);
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xsltRegisterExtModuleFunction ((const xmlChar *) "trailing",
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				   EXSLT_SETS_NAMESPACE,
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				   exsltSetsTrailingFunction);
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * exsltSetsXpathCtxtRegister:
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Registers the EXSLT - Sets module for use outside XSLT
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)exsltSetsXpathCtxtRegister (xmlXPathContextPtr ctxt, const xmlChar *prefix)
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        && prefix
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        && !xmlXPathRegisterNs(ctxt,
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               prefix,
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               (const xmlChar *) EXSLT_SETS_NAMESPACE)
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        && !xmlXPathRegisterFuncNS(ctxt,
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   (const xmlChar *) "difference",
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   (const xmlChar *) EXSLT_SETS_NAMESPACE,
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   exsltSetsDifferenceFunction)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        && !xmlXPathRegisterFuncNS(ctxt,
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   (const xmlChar *) "intersection",
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   (const xmlChar *) EXSLT_SETS_NAMESPACE,
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   exsltSetsIntersectionFunction)
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        && !xmlXPathRegisterFuncNS(ctxt,
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   (const xmlChar *) "distinct",
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   (const xmlChar *) EXSLT_SETS_NAMESPACE,
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   exsltSetsDistinctFunction)
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        && !xmlXPathRegisterFuncNS(ctxt,
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   (const xmlChar *) "has-same-node",
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   (const xmlChar *) EXSLT_SETS_NAMESPACE,
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   exsltSetsHasSameNodesFunction)
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        && !xmlXPathRegisterFuncNS(ctxt,
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   (const xmlChar *) "leading",
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   (const xmlChar *) EXSLT_SETS_NAMESPACE,
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   exsltSetsLeadingFunction)
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        && !xmlXPathRegisterFuncNS(ctxt,
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   (const xmlChar *) "trailing",
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   (const xmlChar *) EXSLT_SETS_NAMESPACE,
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   exsltSetsTrailingFunction)) {
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return 0;
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return -1;
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
335