| Index: third_party/libxslt/libexslt/math.c
|
| diff --git a/third_party/libxslt/libexslt/math.c b/third_party/libxslt/libexslt/math.c
|
| deleted file mode 100644
|
| index 6b24dbe0d9c143cb4ed5cc13c5d2483a22011244..0000000000000000000000000000000000000000
|
| --- a/third_party/libxslt/libexslt/math.c
|
| +++ /dev/null
|
| @@ -1,1202 +0,0 @@
|
| -#define IN_LIBEXSLT
|
| -#include "libexslt/libexslt.h"
|
| -
|
| -#if defined(WIN32) && !defined (__CYGWIN__) && (!__MINGW32__)
|
| -#include <win32config.h>
|
| -#else
|
| -#include "config.h"
|
| -#endif
|
| -
|
| -#include <libxml/tree.h>
|
| -#include <libxml/xpath.h>
|
| -#include <libxml/xpathInternals.h>
|
| -
|
| -#include <libxslt/xsltconfig.h>
|
| -#include <libxslt/xsltutils.h>
|
| -#include <libxslt/xsltInternals.h>
|
| -#include <libxslt/extensions.h>
|
| -
|
| -#ifdef HAVE_MATH_H
|
| -#include <math.h>
|
| -#endif
|
| -
|
| -#ifdef HAVE_STDLIB_H
|
| -#include <stdlib.h>
|
| -#endif
|
| -
|
| -#include "exslt.h"
|
| -
|
| -/**
|
| - * exsltMathMin:
|
| - * @ns: a node-set
|
| - *
|
| - * Implements the EXSLT - Math min() function:
|
| - * number math:min (node-set)
|
| - *
|
| - * Returns the minimum value of the nodes passed as the argument, or
|
| - * xmlXPathNAN if @ns is NULL or empty or if one of the nodes
|
| - * turns into NaN.
|
| - */
|
| -static double
|
| -exsltMathMin (xmlNodeSetPtr ns) {
|
| - double ret, cur;
|
| - int i;
|
| -
|
| - if ((ns == NULL) || (ns->nodeNr == 0))
|
| - return(xmlXPathNAN);
|
| - ret = xmlXPathCastNodeToNumber(ns->nodeTab[0]);
|
| - if (xmlXPathIsNaN(ret))
|
| - return(xmlXPathNAN);
|
| - for (i = 1; i < ns->nodeNr; i++) {
|
| - cur = xmlXPathCastNodeToNumber(ns->nodeTab[i]);
|
| - if (xmlXPathIsNaN(cur))
|
| - return(xmlXPathNAN);
|
| - if (cur < ret)
|
| - ret = cur;
|
| - }
|
| - return(ret);
|
| -}
|
| -
|
| -/**
|
| - * exsltMathMinFunction:
|
| - * @ctxt: an XPath parser context
|
| - * @nargs: the number of arguments
|
| - *
|
| - * Wraps #exsltMathMin for use by the XPath processor.
|
| - */
|
| -static void
|
| -exsltMathMinFunction (xmlXPathParserContextPtr ctxt, int nargs) {
|
| - xmlNodeSetPtr ns;
|
| - double ret;
|
| - void *user = NULL;
|
| -
|
| - if (nargs != 1) {
|
| - xsltGenericError(xsltGenericErrorContext,
|
| - "math:min: invalid number of arguments\n");
|
| - ctxt->error = XPATH_INVALID_ARITY;
|
| - return;
|
| - }
|
| - /* We need to delay the freeing of value->user */
|
| - if ((ctxt->value != NULL) && (ctxt->value->boolval != 0)) {
|
| - user = ctxt->value->user;
|
| - ctxt->value->boolval = 0;
|
| - ctxt->value->user = NULL;
|
| - }
|
| - ns = xmlXPathPopNodeSet(ctxt);
|
| - if (xmlXPathCheckError(ctxt))
|
| - return;
|
| -
|
| - ret = exsltMathMin(ns);
|
| -
|
| - xmlXPathFreeNodeSet(ns);
|
| - if (user != NULL)
|
| - xmlFreeNodeList((xmlNodePtr)user);
|
| -
|
| - xmlXPathReturnNumber(ctxt, ret);
|
| -}
|
| -
|
| -/**
|
| - * exsltMathMax:
|
| - * @ns: a node-set
|
| - *
|
| - * Implements the EXSLT - Math max() function:
|
| - * number math:max (node-set)
|
| - *
|
| - * Returns the maximum value of the nodes passed as arguments, or
|
| - * xmlXPathNAN if @ns is NULL or empty or if one of the nodes
|
| - * turns into NaN.
|
| - */
|
| -static double
|
| -exsltMathMax (xmlNodeSetPtr ns) {
|
| - double ret, cur;
|
| - int i;
|
| -
|
| - if ((ns == NULL) || (ns->nodeNr == 0))
|
| - return(xmlXPathNAN);
|
| - ret = xmlXPathCastNodeToNumber(ns->nodeTab[0]);
|
| - if (xmlXPathIsNaN(ret))
|
| - return(xmlXPathNAN);
|
| - for (i = 1; i < ns->nodeNr; i++) {
|
| - cur = xmlXPathCastNodeToNumber(ns->nodeTab[i]);
|
| - if (xmlXPathIsNaN(cur))
|
| - return(xmlXPathNAN);
|
| - if (cur > ret)
|
| - ret = cur;
|
| - }
|
| - return(ret);
|
| -}
|
| -
|
| -/**
|
| - * exsltMathMaxFunction:
|
| - * @ctxt: an XPath parser context
|
| - * @nargs: the number of arguments
|
| - *
|
| - * Wraps #exsltMathMax for use by the XPath processor.
|
| - */
|
| -static void
|
| -exsltMathMaxFunction (xmlXPathParserContextPtr ctxt, int nargs) {
|
| - xmlNodeSetPtr ns;
|
| - double ret;
|
| - void *user = NULL;
|
| -
|
| - if (nargs != 1) {
|
| - xmlXPathSetArityError(ctxt);
|
| - return;
|
| - }
|
| -
|
| - /* We need to delay the freeing of value->user */
|
| - if ((ctxt->value != NULL) && (ctxt->value->boolval != 0)) {
|
| - user = ctxt->value->user;
|
| - ctxt->value->boolval = 0;
|
| - ctxt->value->user = 0;
|
| - }
|
| - ns = xmlXPathPopNodeSet(ctxt);
|
| - if (xmlXPathCheckError(ctxt))
|
| - return;
|
| -
|
| - ret = exsltMathMax(ns);
|
| -
|
| - xmlXPathFreeNodeSet(ns);
|
| -
|
| - if (user != NULL)
|
| - xmlFreeNodeList((xmlNodePtr)user);
|
| - xmlXPathReturnNumber(ctxt, ret);
|
| -}
|
| -
|
| -/**
|
| - * exsltMathHighest:
|
| - * @ns: a node-set
|
| - *
|
| - * Implements the EXSLT - Math highest() function:
|
| - * node-set math:highest (node-set)
|
| - *
|
| - * Returns the nodes in the node-set whose value is the maximum value
|
| - * for the node-set.
|
| - */
|
| -static xmlNodeSetPtr
|
| -exsltMathHighest (xmlNodeSetPtr ns) {
|
| - xmlNodeSetPtr ret = xmlXPathNodeSetCreate(NULL);
|
| - double max, cur;
|
| - int i;
|
| -
|
| - if ((ns == NULL) || (ns->nodeNr == 0))
|
| - return(ret);
|
| -
|
| - max = xmlXPathCastNodeToNumber(ns->nodeTab[0]);
|
| - if (xmlXPathIsNaN(max))
|
| - return(ret);
|
| - else
|
| - xmlXPathNodeSetAddUnique(ret, ns->nodeTab[0]);
|
| -
|
| - for (i = 1; i < ns->nodeNr; i++) {
|
| - cur = xmlXPathCastNodeToNumber(ns->nodeTab[i]);
|
| - if (xmlXPathIsNaN(cur)) {
|
| - xmlXPathEmptyNodeSet(ret);
|
| - return(ret);
|
| - }
|
| - if (cur < max)
|
| - continue;
|
| - if (cur > max) {
|
| - max = cur;
|
| - xmlXPathEmptyNodeSet(ret);
|
| - xmlXPathNodeSetAddUnique(ret, ns->nodeTab[i]);
|
| - continue;
|
| - }
|
| - xmlXPathNodeSetAddUnique(ret, ns->nodeTab[i]);
|
| - }
|
| - return(ret);
|
| -}
|
| -
|
| -/**
|
| - * exsltMathHighestFunction:
|
| - * @ctxt: an XPath parser context
|
| - * @nargs: the number of arguments
|
| - *
|
| - * Wraps #exsltMathHighest for use by the XPath processor
|
| - */
|
| -static void
|
| -exsltMathHighestFunction (xmlXPathParserContextPtr ctxt, int nargs) {
|
| - xmlNodeSetPtr ns, ret;
|
| - void *user = NULL;
|
| -
|
| - if (nargs != 1) {
|
| - xmlXPathSetArityError(ctxt);
|
| - return;
|
| - }
|
| -
|
| - /* We need to delay the freeing of value->user */
|
| - if ((ctxt->value != NULL) && ctxt->value->boolval != 0) {
|
| - user = ctxt->value->user;
|
| - ctxt->value->boolval = 0;
|
| - ctxt->value->user = NULL;
|
| - }
|
| - ns = xmlXPathPopNodeSet(ctxt);
|
| - if (xmlXPathCheckError(ctxt))
|
| - return;
|
| -
|
| - ret = exsltMathHighest(ns);
|
| -
|
| - xmlXPathFreeNodeSet(ns);
|
| - if (user != NULL)
|
| - xmlFreeNodeList((xmlNodePtr)user);
|
| -
|
| - xmlXPathReturnNodeSet(ctxt, ret);
|
| -}
|
| -
|
| -/**
|
| - * exsltMathLowest:
|
| - * @ns: a node-set
|
| - *
|
| - * Implements the EXSLT - Math lowest() function
|
| - * node-set math:lowest (node-set)
|
| - *
|
| - * Returns the nodes in the node-set whose value is the minimum value
|
| - * for the node-set.
|
| - */
|
| -static xmlNodeSetPtr
|
| -exsltMathLowest (xmlNodeSetPtr ns) {
|
| - xmlNodeSetPtr ret = xmlXPathNodeSetCreate(NULL);
|
| - double min, cur;
|
| - int i;
|
| -
|
| - if ((ns == NULL) || (ns->nodeNr == 0))
|
| - return(ret);
|
| -
|
| - min = xmlXPathCastNodeToNumber(ns->nodeTab[0]);
|
| - if (xmlXPathIsNaN(min))
|
| - return(ret);
|
| - else
|
| - xmlXPathNodeSetAddUnique(ret, ns->nodeTab[0]);
|
| -
|
| - for (i = 1; i < ns->nodeNr; i++) {
|
| - cur = xmlXPathCastNodeToNumber(ns->nodeTab[i]);
|
| - if (xmlXPathIsNaN(cur)) {
|
| - xmlXPathEmptyNodeSet(ret);
|
| - return(ret);
|
| - }
|
| - if (cur > min)
|
| - continue;
|
| - if (cur < min) {
|
| - min = cur;
|
| - xmlXPathEmptyNodeSet(ret);
|
| - xmlXPathNodeSetAddUnique(ret, ns->nodeTab[i]);
|
| - continue;
|
| - }
|
| - xmlXPathNodeSetAddUnique(ret, ns->nodeTab[i]);
|
| - }
|
| - return(ret);
|
| -}
|
| -
|
| -/**
|
| - * exsltMathLowestFunction:
|
| - * @ctxt: an XPath parser context
|
| - * @nargs: the number of arguments
|
| - *
|
| - * Wraps #exsltMathLowest for use by the XPath processor
|
| - */
|
| -static void
|
| -exsltMathLowestFunction (xmlXPathParserContextPtr ctxt, int nargs) {
|
| - xmlNodeSetPtr ns, ret;
|
| - void *user = NULL;
|
| -
|
| -
|
| - if (nargs != 1) {
|
| - xmlXPathSetArityError(ctxt);
|
| - return;
|
| - }
|
| -
|
| - /* We need to delay the freeing of value->user */
|
| - if ((ctxt->value != NULL) && (ctxt->value->boolval != 0)) {
|
| - user = ctxt->value->user;
|
| - ctxt->value->boolval = 0;
|
| - ctxt->value->user = NULL;
|
| - }
|
| - ns = xmlXPathPopNodeSet(ctxt);
|
| - if (xmlXPathCheckError(ctxt))
|
| - return;
|
| -
|
| - ret = exsltMathLowest(ns);
|
| -
|
| - xmlXPathFreeNodeSet(ns);
|
| - if (user != NULL)
|
| - xmlFreeNodeList((xmlNodePtr)user);
|
| -
|
| - xmlXPathReturnNodeSet(ctxt, ret);
|
| -}
|
| -
|
| -/* math other functions */
|
| -
|
| -/* constant values */
|
| -#define EXSLT_PI (const xmlChar *) \
|
| - "3.1415926535897932384626433832795028841971693993751"
|
| -#define EXSLT_E (const xmlChar *) \
|
| - "2.71828182845904523536028747135266249775724709369996"
|
| -#define EXSLT_SQRRT2 (const xmlChar *) \
|
| - "1.41421356237309504880168872420969807856967187537694"
|
| -#define EXSLT_LN2 (const xmlChar *) \
|
| - "0.69314718055994530941723212145817656807550013436025"
|
| -#define EXSLT_LN10 (const xmlChar *) \
|
| - "2.30258509299404568402"
|
| -#define EXSLT_LOG2E (const xmlChar *) \
|
| - "1.4426950408889634074"
|
| -#define EXSLT_SQRT1_2 (const xmlChar *) \
|
| - "0.70710678118654752440"
|
| -
|
| -/**
|
| - * exsltMathConstant
|
| - * @name: string
|
| - * @precision: number
|
| - *
|
| - * Implements the EXSLT - Math constant function:
|
| - * number math:constant(string, number)
|
| - *
|
| - * Returns a number value of the given constant with the given precision or
|
| - * xmlXPathNAN if name is unknown.
|
| - * The constants are PI, E, SQRRT2, LN2, LN10, LOG2E, and SQRT1_2
|
| - */
|
| -static double
|
| -exsltMathConstant (xmlChar *name, double precision) {
|
| - xmlChar *str;
|
| - double ret;
|
| -
|
| - if ((name == NULL) || (xmlXPathIsNaN(precision)) || (precision < 1.0)) {
|
| - return xmlXPathNAN;
|
| - }
|
| -
|
| - if (xmlStrEqual(name, BAD_CAST "PI")) {
|
| - int len = xmlStrlen(EXSLT_PI);
|
| -
|
| - if (precision <= len)
|
| - len = (int)precision;
|
| -
|
| - str = xmlStrsub(EXSLT_PI, 0, len);
|
| -
|
| - } else if (xmlStrEqual(name, BAD_CAST "E")) {
|
| - int len = xmlStrlen(EXSLT_E);
|
| -
|
| - if (precision <= len)
|
| - len = (int)precision;
|
| -
|
| - str = xmlStrsub(EXSLT_E, 0, len);
|
| -
|
| - } else if (xmlStrEqual(name, BAD_CAST "SQRRT2")) {
|
| - int len = xmlStrlen(EXSLT_SQRRT2);
|
| -
|
| - if (precision <= len)
|
| - len = (int)precision;
|
| -
|
| - str = xmlStrsub(EXSLT_SQRRT2, 0, len);
|
| -
|
| - } else if (xmlStrEqual(name, BAD_CAST "LN2")) {
|
| - int len = xmlStrlen(EXSLT_LN2);
|
| -
|
| - if (precision <= len)
|
| - len = (int)precision;
|
| -
|
| - str = xmlStrsub(EXSLT_LN2, 0, len);
|
| -
|
| - } else if (xmlStrEqual(name, BAD_CAST "LN10")) {
|
| - int len = xmlStrlen(EXSLT_LN10);
|
| -
|
| - if (precision <= len)
|
| - len = (int)precision;
|
| -
|
| - str = xmlStrsub(EXSLT_LN10, 0, len);
|
| -
|
| - } else if (xmlStrEqual(name, BAD_CAST "LOG2E")) {
|
| - int len = xmlStrlen(EXSLT_LOG2E);
|
| -
|
| - if (precision <= len)
|
| - len = (int)precision;
|
| -
|
| - str = xmlStrsub(EXSLT_LOG2E, 0, len);
|
| -
|
| - } else if (xmlStrEqual(name, BAD_CAST "SQRT1_2")) {
|
| - int len = xmlStrlen(EXSLT_SQRT1_2);
|
| -
|
| - if (precision <= len)
|
| - len = (int)precision;
|
| -
|
| - str = xmlStrsub(EXSLT_SQRT1_2, 0, len);
|
| -
|
| - } else {
|
| - str = NULL;
|
| - }
|
| - if (str == NULL)
|
| - return xmlXPathNAN;
|
| - ret = xmlXPathCastStringToNumber(str);
|
| - xmlFree(str);
|
| - return ret;
|
| -}
|
| -
|
| -/**
|
| - * exsltMathConstantFunction:
|
| - * @ctxt: an XPath parser context
|
| - * @nargs: the number of arguments
|
| - *
|
| - * Wraps #exsltMathConstant for use by the XPath processor.
|
| - */
|
| -static void
|
| -exsltMathConstantFunction (xmlXPathParserContextPtr ctxt, int nargs) {
|
| - double ret;
|
| - xmlChar *name;
|
| -
|
| - if (nargs != 2) {
|
| - xmlXPathSetArityError(ctxt);
|
| - return;
|
| - }
|
| - ret = xmlXPathPopNumber(ctxt);
|
| - if (xmlXPathCheckError(ctxt))
|
| - return;
|
| -
|
| - name = xmlXPathPopString(ctxt);
|
| - if (xmlXPathCheckError(ctxt))
|
| - return;
|
| -
|
| - ret = exsltMathConstant(name, ret);
|
| - if (name != NULL)
|
| - xmlFree(name);
|
| -
|
| - xmlXPathReturnNumber(ctxt, ret);
|
| -}
|
| -
|
| -#if defined(HAVE_STDLIB_H) && defined(RAND_MAX)
|
| -
|
| -/**
|
| - * exsltMathRandom:
|
| - *
|
| - * Implements the EXSLT - Math random() function:
|
| - * number math:random ()
|
| - *
|
| - * Returns a random number between 0 and 1 inclusive.
|
| - */
|
| -static double
|
| -exsltMathRandom (void) {
|
| - double ret;
|
| - int num;
|
| -
|
| - num = rand();
|
| - ret = (double)num / (double)RAND_MAX;
|
| - return(ret);
|
| -}
|
| -
|
| -/**
|
| - * exsltMathRandomFunction:
|
| - * @ctxt: an XPath parser context
|
| - * @nargs: the number of arguments
|
| - *
|
| - * Wraps #exsltMathRandom for use by the XPath processor.
|
| - */
|
| -static void
|
| -exsltMathRandomFunction (xmlXPathParserContextPtr ctxt, int nargs) {
|
| - double ret;
|
| -
|
| - if (nargs != 0) {
|
| - xmlXPathSetArityError(ctxt);
|
| - return;
|
| - }
|
| -
|
| - ret = exsltMathRandom();
|
| -
|
| - xmlXPathReturnNumber(ctxt, ret);
|
| -}
|
| -
|
| -#endif /* defined(HAVE_STDLIB_H) && defined(RAND_MAX) */
|
| -
|
| -#if HAVE_MATH_H
|
| -
|
| -/**
|
| - * exsltMathAbs:
|
| - * @num: a double
|
| - *
|
| - * Implements the EXSLT - Math abs() function:
|
| - * number math:abs (number)
|
| - *
|
| - * Returns the absolute value of the argument, or xmlXPathNAN if @num is Nan.
|
| - */
|
| -static double
|
| -exsltMathAbs (double num) {
|
| - double ret;
|
| -
|
| - if (xmlXPathIsNaN(num))
|
| - return(xmlXPathNAN);
|
| - ret = fabs(num);
|
| - return(ret);
|
| -}
|
| -
|
| -/**
|
| - * exsltMathAbsFunction:
|
| - * @ctxt: an XPath parser context
|
| - * @nargs: the number of arguments
|
| - *
|
| - * Wraps #exsltMathAbs for use by the XPath processor.
|
| - */
|
| -static void
|
| -exsltMathAbsFunction (xmlXPathParserContextPtr ctxt, int nargs) {
|
| - double ret;
|
| -
|
| - if (nargs != 1) {
|
| - xmlXPathSetArityError(ctxt);
|
| - return;
|
| - }
|
| - ret = xmlXPathPopNumber(ctxt);
|
| - if (xmlXPathCheckError(ctxt))
|
| - return;
|
| -
|
| - ret = exsltMathAbs(ret);
|
| -
|
| - xmlXPathReturnNumber(ctxt, ret);
|
| -}
|
| -
|
| -/**
|
| - * exsltMathSqrt:
|
| - * @num: a double
|
| - *
|
| - * Implements the EXSLT - Math sqrt() function:
|
| - * number math:sqrt (number)
|
| - *
|
| - * Returns the square root of the argument, or xmlXPathNAN if @num is Nan.
|
| - */
|
| -static double
|
| -exsltMathSqrt (double num) {
|
| - double ret;
|
| -
|
| - if (xmlXPathIsNaN(num))
|
| - return(xmlXPathNAN);
|
| - ret = sqrt(num);
|
| - return(ret);
|
| -}
|
| -
|
| -/**
|
| - * exsltMathSqrtFunction:
|
| - * @ctxt: an XPath parser context
|
| - * @nargs: the number of arguments
|
| - *
|
| - * Wraps #exsltMathSqrt for use by the XPath processor.
|
| - */
|
| -static void
|
| -exsltMathSqrtFunction (xmlXPathParserContextPtr ctxt, int nargs) {
|
| - double ret;
|
| -
|
| - if (nargs != 1) {
|
| - xmlXPathSetArityError(ctxt);
|
| - return;
|
| - }
|
| - ret = xmlXPathPopNumber(ctxt);
|
| - if (xmlXPathCheckError(ctxt))
|
| - return;
|
| -
|
| - ret = exsltMathSqrt(ret);
|
| -
|
| - xmlXPathReturnNumber(ctxt, ret);
|
| -}
|
| -
|
| -/**
|
| - * exsltMathPower:
|
| - * @base: a double
|
| - * @power: a double
|
| - *
|
| - * Implements the EXSLT - Math power() function:
|
| - * number math:power (number, number)
|
| - *
|
| - * Returns the power base and power arguments, or xmlXPathNAN
|
| - * if either @base or @power is Nan.
|
| - */
|
| -static double
|
| -exsltMathPower (double base, double power) {
|
| - double ret;
|
| -
|
| - if ((xmlXPathIsNaN(base) || xmlXPathIsNaN(power)))
|
| - return(xmlXPathNAN);
|
| - ret = pow(base, power);
|
| - return(ret);
|
| -}
|
| -
|
| -/**
|
| - * exsltMathPower:
|
| - * @ctxt: an XPath parser context
|
| - * @nargs: the number of arguments
|
| - *
|
| - * Wraps #exsltMathPower for use by the XPath processor.
|
| - */
|
| -static void
|
| -exsltMathPowerFunction (xmlXPathParserContextPtr ctxt, int nargs) {
|
| - double ret, base;
|
| -
|
| - if (nargs != 2) {
|
| - xmlXPathSetArityError(ctxt);
|
| - return;
|
| - }
|
| - ret = xmlXPathPopNumber(ctxt);
|
| - if (xmlXPathCheckError(ctxt))
|
| - return;
|
| -
|
| - /* power */
|
| - base = xmlXPathPopNumber(ctxt);
|
| - if (xmlXPathCheckError(ctxt))
|
| - return;
|
| -
|
| - ret = exsltMathPower(base, ret);
|
| -
|
| - xmlXPathReturnNumber(ctxt, ret);
|
| -}
|
| -
|
| -/**
|
| - * exsltMathLog:
|
| - * @num: a double
|
| - *
|
| - * Implements the EXSLT - Math log() function:
|
| - * number math:log (number)
|
| - *
|
| - * Returns the natural log of the argument, or xmlXPathNAN if @num is Nan.
|
| - */
|
| -static double
|
| -exsltMathLog (double num) {
|
| - double ret;
|
| -
|
| - if (xmlXPathIsNaN(num))
|
| - return(xmlXPathNAN);
|
| - ret = log(num);
|
| - return(ret);
|
| -}
|
| -
|
| -/**
|
| - * exsltMathLogFunction:
|
| - * @ctxt: an XPath parser context
|
| - * @nargs: the number of arguments
|
| - *
|
| - * Wraps #exsltMathLog for use by the XPath processor.
|
| - */
|
| -static void
|
| -exsltMathLogFunction (xmlXPathParserContextPtr ctxt, int nargs) {
|
| - double ret;
|
| -
|
| - if (nargs != 1) {
|
| - xmlXPathSetArityError(ctxt);
|
| - return;
|
| - }
|
| - ret = xmlXPathPopNumber(ctxt);
|
| - if (xmlXPathCheckError(ctxt))
|
| - return;
|
| -
|
| - ret = exsltMathLog(ret);
|
| -
|
| - xmlXPathReturnNumber(ctxt, ret);
|
| -}
|
| -
|
| -/**
|
| - * exsltMathSin:
|
| - * @num: a double
|
| - *
|
| - * Implements the EXSLT - Math sin() function:
|
| - * number math:sin (number)
|
| - *
|
| - * Returns the sine of the argument, or xmlXPathNAN if @num is Nan.
|
| - */
|
| -static double
|
| -exsltMathSin (double num) {
|
| - double ret;
|
| -
|
| - if (xmlXPathIsNaN(num))
|
| - return(xmlXPathNAN);
|
| - ret = sin(num);
|
| - return(ret);
|
| -}
|
| -
|
| -/**
|
| - * exsltMathSinFunction:
|
| - * @ctxt: an XPath parser context
|
| - * @nargs: the number of arguments
|
| - *
|
| - * Wraps #exsltMathSin for use by the XPath processor.
|
| - */
|
| -static void
|
| -exsltMathSinFunction (xmlXPathParserContextPtr ctxt, int nargs) {
|
| - double ret;
|
| -
|
| - if (nargs != 1) {
|
| - xmlXPathSetArityError(ctxt);
|
| - return;
|
| - }
|
| - ret = xmlXPathPopNumber(ctxt);
|
| - if (xmlXPathCheckError(ctxt))
|
| - return;
|
| -
|
| - ret = exsltMathSin(ret);
|
| -
|
| - xmlXPathReturnNumber(ctxt, ret);
|
| -}
|
| -
|
| -/**
|
| - * exsltMathCos:
|
| - * @num: a double
|
| - *
|
| - * Implements the EXSLT - Math cos() function:
|
| - * number math:cos (number)
|
| - *
|
| - * Returns the cosine of the argument, or xmlXPathNAN if @num is Nan.
|
| - */
|
| -static double
|
| -exsltMathCos (double num) {
|
| - double ret;
|
| -
|
| - if (xmlXPathIsNaN(num))
|
| - return(xmlXPathNAN);
|
| - ret = cos(num);
|
| - return(ret);
|
| -}
|
| -
|
| -/**
|
| - * exsltMathCosFunction:
|
| - * @ctxt: an XPath parser context
|
| - * @nargs: the number of arguments
|
| - *
|
| - * Wraps #exsltMathCos for use by the XPath processor.
|
| - */
|
| -static void
|
| -exsltMathCosFunction (xmlXPathParserContextPtr ctxt, int nargs) {
|
| - double ret;
|
| -
|
| - if (nargs != 1) {
|
| - xmlXPathSetArityError(ctxt);
|
| - return;
|
| - }
|
| - ret = xmlXPathPopNumber(ctxt);
|
| - if (xmlXPathCheckError(ctxt))
|
| - return;
|
| -
|
| - ret = exsltMathCos(ret);
|
| -
|
| - xmlXPathReturnNumber(ctxt, ret);
|
| -}
|
| -
|
| -/**
|
| - * exsltMathTan:
|
| - * @num: a double
|
| - *
|
| - * Implements the EXSLT - Math tan() function:
|
| - * number math:tan (number)
|
| - *
|
| - * Returns the tangent of the argument, or xmlXPathNAN if @num is Nan.
|
| - */
|
| -static double
|
| -exsltMathTan (double num) {
|
| - double ret;
|
| -
|
| - if (xmlXPathIsNaN(num))
|
| - return(xmlXPathNAN);
|
| - ret = tan(num);
|
| - return(ret);
|
| -}
|
| -
|
| -/**
|
| - * exsltMathTanFunction:
|
| - * @ctxt: an XPath parser context
|
| - * @nargs: the number of arguments
|
| - *
|
| - * Wraps #exsltMathTan for use by the XPath processor.
|
| - */
|
| -static void
|
| -exsltMathTanFunction (xmlXPathParserContextPtr ctxt, int nargs) {
|
| - double ret;
|
| -
|
| - if (nargs != 1) {
|
| - xmlXPathSetArityError(ctxt);
|
| - return;
|
| - }
|
| - ret = xmlXPathPopNumber(ctxt);
|
| - if (xmlXPathCheckError(ctxt))
|
| - return;
|
| -
|
| - ret = exsltMathTan(ret);
|
| -
|
| - xmlXPathReturnNumber(ctxt, ret);
|
| -}
|
| -
|
| -/**
|
| - * exsltMathAsin:
|
| - * @num: a double
|
| - *
|
| - * Implements the EXSLT - Math asin() function:
|
| - * number math:asin (number)
|
| - *
|
| - * Returns the arc sine of the argument, or xmlXPathNAN if @num is Nan.
|
| - */
|
| -static double
|
| -exsltMathAsin (double num) {
|
| - double ret;
|
| -
|
| - if (xmlXPathIsNaN(num))
|
| - return(xmlXPathNAN);
|
| - ret = asin(num);
|
| - return(ret);
|
| -}
|
| -
|
| -/**
|
| - * exsltMathAsinFunction:
|
| - * @ctxt: an XPath parser context
|
| - * @nargs: the number of arguments
|
| - *
|
| - * Wraps #exsltMathAsin for use by the XPath processor.
|
| - */
|
| -static void
|
| -exsltMathAsinFunction (xmlXPathParserContextPtr ctxt, int nargs) {
|
| - double ret;
|
| -
|
| - if (nargs != 1) {
|
| - xmlXPathSetArityError(ctxt);
|
| - return;
|
| - }
|
| - ret = xmlXPathPopNumber(ctxt);
|
| - if (xmlXPathCheckError(ctxt))
|
| - return;
|
| -
|
| - ret = exsltMathAsin(ret);
|
| -
|
| - xmlXPathReturnNumber(ctxt, ret);
|
| -}
|
| -
|
| -/**
|
| - * exsltMathAcos:
|
| - * @num: a double
|
| - *
|
| - * Implements the EXSLT - Math acos() function:
|
| - * number math:acos (number)
|
| - *
|
| - * Returns the arc cosine of the argument, or xmlXPathNAN if @num is Nan.
|
| - */
|
| -static double
|
| -exsltMathAcos (double num) {
|
| - double ret;
|
| -
|
| - if (xmlXPathIsNaN(num))
|
| - return(xmlXPathNAN);
|
| - ret = acos(num);
|
| - return(ret);
|
| -}
|
| -
|
| -/**
|
| - * exsltMathAcosFunction:
|
| - * @ctxt: an XPath parser context
|
| - * @nargs: the number of arguments
|
| - *
|
| - * Wraps #exsltMathAcos for use by the XPath processor.
|
| - */
|
| -static void
|
| -exsltMathAcosFunction (xmlXPathParserContextPtr ctxt, int nargs) {
|
| - double ret;
|
| -
|
| - if (nargs != 1) {
|
| - xmlXPathSetArityError(ctxt);
|
| - return;
|
| - }
|
| - ret = xmlXPathPopNumber(ctxt);
|
| - if (xmlXPathCheckError(ctxt))
|
| - return;
|
| -
|
| - ret = exsltMathAcos(ret);
|
| -
|
| - xmlXPathReturnNumber(ctxt, ret);
|
| -}
|
| -
|
| -/**
|
| - * exsltMathAtan:
|
| - * @num: a double
|
| - *
|
| - * Implements the EXSLT - Math atan() function:
|
| - * number math:atan (number)
|
| - *
|
| - * Returns the arc tangent of the argument, or xmlXPathNAN if @num is Nan.
|
| - */
|
| -static double
|
| -exsltMathAtan (double num) {
|
| - double ret;
|
| -
|
| - if (xmlXPathIsNaN(num))
|
| - return(xmlXPathNAN);
|
| - ret = atan(num);
|
| - return(ret);
|
| -}
|
| -
|
| -/**
|
| - * exsltMathAtanFunction:
|
| - * @ctxt: an XPath parser context
|
| - * @nargs: the number of arguments
|
| - *
|
| - * Wraps #exsltMathAtan for use by the XPath processor.
|
| - */
|
| -static void
|
| -exsltMathAtanFunction (xmlXPathParserContextPtr ctxt, int nargs) {
|
| - double ret;
|
| -
|
| - if (nargs != 1) {
|
| - xmlXPathSetArityError(ctxt);
|
| - return;
|
| - }
|
| - ret = xmlXPathPopNumber(ctxt);
|
| - if (xmlXPathCheckError(ctxt))
|
| - return;
|
| -
|
| - ret = exsltMathAtan(ret);
|
| -
|
| - xmlXPathReturnNumber(ctxt, ret);
|
| -}
|
| -
|
| -/**
|
| - * exsltMathAtan2:
|
| - * @y: a double
|
| - * @x: a double
|
| - *
|
| - * Implements the EXSLT - Math atan2() function:
|
| - * number math:atan2 (number, number)
|
| - *
|
| - * Returns the arc tangent function of the y/x arguments, or xmlXPathNAN
|
| - * if either @y or @x is Nan.
|
| - */
|
| -static double
|
| -exsltMathAtan2 (double y, double x) {
|
| - double ret;
|
| -
|
| - if ((xmlXPathIsNaN(y) || xmlXPathIsNaN(x)))
|
| - return(xmlXPathNAN);
|
| - ret = atan2(y, x);
|
| - return(ret);
|
| -}
|
| -
|
| -/**
|
| - * exsltMathAtan2Function:
|
| - * @ctxt: an XPath parser context
|
| - * @nargs: the number of arguments
|
| - *
|
| - * Wraps #exsltMathAtan2 for use by the XPath processor.
|
| - */
|
| -static void
|
| -exsltMathAtan2Function (xmlXPathParserContextPtr ctxt, int nargs) {
|
| - double ret, x;
|
| -
|
| - if (nargs != 2) {
|
| - xmlXPathSetArityError(ctxt);
|
| - return;
|
| - }
|
| - x = xmlXPathPopNumber(ctxt);
|
| - if (xmlXPathCheckError(ctxt))
|
| - return;
|
| -
|
| - /* y */
|
| - ret = xmlXPathPopNumber(ctxt);
|
| - if (xmlXPathCheckError(ctxt))
|
| - return;
|
| -
|
| - ret = exsltMathAtan2(ret, x);
|
| -
|
| - xmlXPathReturnNumber(ctxt, ret);
|
| -}
|
| -
|
| -/**
|
| - * exsltMathExp:
|
| - * @num: a double
|
| - *
|
| - * Implements the EXSLT - Math exp() function:
|
| - * number math:exp (number)
|
| - *
|
| - * Returns the exponential function of the argument, or xmlXPathNAN if
|
| - * @num is Nan.
|
| - */
|
| -static double
|
| -exsltMathExp (double num) {
|
| - double ret;
|
| -
|
| - if (xmlXPathIsNaN(num))
|
| - return(xmlXPathNAN);
|
| - ret = exp(num);
|
| - return(ret);
|
| -}
|
| -
|
| -/**
|
| - * exsltMathExpFunction:
|
| - * @ctxt: an XPath parser context
|
| - * @nargs: the number of arguments
|
| - *
|
| - * Wraps #exsltMathExp for use by the XPath processor.
|
| - */
|
| -static void
|
| -exsltMathExpFunction (xmlXPathParserContextPtr ctxt, int nargs) {
|
| - double ret;
|
| -
|
| - if (nargs != 1) {
|
| - xmlXPathSetArityError(ctxt);
|
| - return;
|
| - }
|
| - ret = xmlXPathPopNumber(ctxt);
|
| - if (xmlXPathCheckError(ctxt))
|
| - return;
|
| -
|
| - ret = exsltMathExp(ret);
|
| -
|
| - xmlXPathReturnNumber(ctxt, ret);
|
| -}
|
| -
|
| -#endif /* HAVE_MATH_H */
|
| -
|
| -/**
|
| - * exsltMathRegister:
|
| - *
|
| - * Registers the EXSLT - Math module
|
| - */
|
| -
|
| -void
|
| -exsltMathRegister (void) {
|
| - xsltRegisterExtModuleFunction ((const xmlChar *) "min",
|
| - EXSLT_MATH_NAMESPACE,
|
| - exsltMathMinFunction);
|
| - xsltRegisterExtModuleFunction ((const xmlChar *) "max",
|
| - EXSLT_MATH_NAMESPACE,
|
| - exsltMathMaxFunction);
|
| - xsltRegisterExtModuleFunction ((const xmlChar *) "highest",
|
| - EXSLT_MATH_NAMESPACE,
|
| - exsltMathHighestFunction);
|
| - xsltRegisterExtModuleFunction ((const xmlChar *) "lowest",
|
| - EXSLT_MATH_NAMESPACE,
|
| - exsltMathLowestFunction);
|
| - /* register other math functions */
|
| - xsltRegisterExtModuleFunction ((const xmlChar *) "constant",
|
| - EXSLT_MATH_NAMESPACE,
|
| - exsltMathConstantFunction);
|
| -#ifdef HAVE_STDLIB_H
|
| - xsltRegisterExtModuleFunction ((const xmlChar *) "random",
|
| - EXSLT_MATH_NAMESPACE,
|
| - exsltMathRandomFunction);
|
| -#endif
|
| -#if HAVE_MATH_H
|
| - xsltRegisterExtModuleFunction ((const xmlChar *) "abs",
|
| - EXSLT_MATH_NAMESPACE,
|
| - exsltMathAbsFunction);
|
| - xsltRegisterExtModuleFunction ((const xmlChar *) "sqrt",
|
| - EXSLT_MATH_NAMESPACE,
|
| - exsltMathSqrtFunction);
|
| - xsltRegisterExtModuleFunction ((const xmlChar *) "power",
|
| - EXSLT_MATH_NAMESPACE,
|
| - exsltMathPowerFunction);
|
| - xsltRegisterExtModuleFunction ((const xmlChar *) "log",
|
| - EXSLT_MATH_NAMESPACE,
|
| - exsltMathLogFunction);
|
| - xsltRegisterExtModuleFunction ((const xmlChar *) "sin",
|
| - EXSLT_MATH_NAMESPACE,
|
| - exsltMathSinFunction);
|
| - xsltRegisterExtModuleFunction ((const xmlChar *) "cos",
|
| - EXSLT_MATH_NAMESPACE,
|
| - exsltMathCosFunction);
|
| - xsltRegisterExtModuleFunction ((const xmlChar *) "tan",
|
| - EXSLT_MATH_NAMESPACE,
|
| - exsltMathTanFunction);
|
| - xsltRegisterExtModuleFunction ((const xmlChar *) "asin",
|
| - EXSLT_MATH_NAMESPACE,
|
| - exsltMathAsinFunction);
|
| - xsltRegisterExtModuleFunction ((const xmlChar *) "acos",
|
| - EXSLT_MATH_NAMESPACE,
|
| - exsltMathAcosFunction);
|
| - xsltRegisterExtModuleFunction ((const xmlChar *) "atan",
|
| - EXSLT_MATH_NAMESPACE,
|
| - exsltMathAtanFunction);
|
| - xsltRegisterExtModuleFunction ((const xmlChar *) "atan2",
|
| - EXSLT_MATH_NAMESPACE,
|
| - exsltMathAtan2Function);
|
| - xsltRegisterExtModuleFunction ((const xmlChar *) "exp",
|
| - EXSLT_MATH_NAMESPACE,
|
| - exsltMathExpFunction);
|
| -#endif
|
| -}
|
| -
|
| -/**
|
| - * exsltMathXpathCtxtRegister:
|
| - *
|
| - * Registers the EXSLT - Math module for use outside XSLT
|
| - */
|
| -int
|
| -exsltMathXpathCtxtRegister (xmlXPathContextPtr ctxt, const xmlChar *prefix)
|
| -{
|
| - if (ctxt
|
| - && prefix
|
| - && !xmlXPathRegisterNs(ctxt,
|
| - prefix,
|
| - (const xmlChar *) EXSLT_MATH_NAMESPACE)
|
| - && !xmlXPathRegisterFuncNS(ctxt,
|
| - (const xmlChar *) "min",
|
| - (const xmlChar *) EXSLT_MATH_NAMESPACE,
|
| - exsltMathMinFunction)
|
| - && !xmlXPathRegisterFuncNS(ctxt,
|
| - (const xmlChar *) "max",
|
| - (const xmlChar *) EXSLT_MATH_NAMESPACE,
|
| - exsltMathMaxFunction)
|
| - && !xmlXPathRegisterFuncNS(ctxt,
|
| - (const xmlChar *) "highest",
|
| - (const xmlChar *) EXSLT_MATH_NAMESPACE,
|
| - exsltMathHighestFunction)
|
| - && !xmlXPathRegisterFuncNS(ctxt,
|
| - (const xmlChar *) "lowest",
|
| - (const xmlChar *) EXSLT_MATH_NAMESPACE,
|
| - exsltMathLowestFunction)
|
| -#ifdef HAVE_STDLIB_H
|
| - && !xmlXPathRegisterFuncNS(ctxt,
|
| - (const xmlChar *) "random",
|
| - (const xmlChar *) EXSLT_MATH_NAMESPACE,
|
| - exsltMathRandomFunction)
|
| -#endif
|
| -#if HAVE_MATH_H
|
| - && !xmlXPathRegisterFuncNS(ctxt,
|
| - (const xmlChar *) "abs",
|
| - (const xmlChar *) EXSLT_MATH_NAMESPACE,
|
| - exsltMathAbsFunction)
|
| - && !xmlXPathRegisterFuncNS(ctxt,
|
| - (const xmlChar *) "sqrt",
|
| - (const xmlChar *) EXSLT_MATH_NAMESPACE,
|
| - exsltMathSqrtFunction)
|
| - && !xmlXPathRegisterFuncNS(ctxt,
|
| - (const xmlChar *) "power",
|
| - (const xmlChar *) EXSLT_MATH_NAMESPACE,
|
| - exsltMathPowerFunction)
|
| - && !xmlXPathRegisterFuncNS(ctxt,
|
| - (const xmlChar *) "log",
|
| - (const xmlChar *) EXSLT_MATH_NAMESPACE,
|
| - exsltMathLogFunction)
|
| - && !xmlXPathRegisterFuncNS(ctxt,
|
| - (const xmlChar *) "sin",
|
| - (const xmlChar *) EXSLT_MATH_NAMESPACE,
|
| - exsltMathSinFunction)
|
| - && !xmlXPathRegisterFuncNS(ctxt,
|
| - (const xmlChar *) "cos",
|
| - (const xmlChar *) EXSLT_MATH_NAMESPACE,
|
| - exsltMathCosFunction)
|
| - && !xmlXPathRegisterFuncNS(ctxt,
|
| - (const xmlChar *) "tan",
|
| - (const xmlChar *) EXSLT_MATH_NAMESPACE,
|
| - exsltMathTanFunction)
|
| - && !xmlXPathRegisterFuncNS(ctxt,
|
| - (const xmlChar *) "asin",
|
| - (const xmlChar *) EXSLT_MATH_NAMESPACE,
|
| - exsltMathAsinFunction)
|
| - && !xmlXPathRegisterFuncNS(ctxt,
|
| - (const xmlChar *) "acos",
|
| - (const xmlChar *) EXSLT_MATH_NAMESPACE,
|
| - exsltMathAcosFunction)
|
| - && !xmlXPathRegisterFuncNS(ctxt,
|
| - (const xmlChar *) "atan",
|
| - (const xmlChar *) EXSLT_MATH_NAMESPACE,
|
| - exsltMathAtanFunction)
|
| - && !xmlXPathRegisterFuncNS(ctxt,
|
| - (const xmlChar *) "atan2",
|
| - (const xmlChar *) EXSLT_MATH_NAMESPACE,
|
| - exsltMathAtan2Function)
|
| - && !xmlXPathRegisterFuncNS(ctxt,
|
| - (const xmlChar *) "exp",
|
| - (const xmlChar *) EXSLT_MATH_NAMESPACE,
|
| - exsltMathExpFunction)
|
| -#endif
|
| - && !xmlXPathRegisterFuncNS(ctxt,
|
| - (const xmlChar *) "constant",
|
| - (const xmlChar *) EXSLT_MATH_NAMESPACE,
|
| - exsltMathConstantFunction)) {
|
| - return 0;
|
| - }
|
| - return -1;
|
| -}
|
|
|