bool TestNumericResult( XPathProcessor& theXPathProcessor, XPath& theXPath, XPathConstructionContext& theXPathConstructionContext, const XalanDOMString& theXPathString, PrintWriter& thePrintWriter, double theExpectedResult, XalanNode* theContextNode, const PrefixResolver& thePrefixResolver, const NodeRefListBase& theContextNodeList, XPathExecutionContext& theExecutionContext) { bool fError = false; const XObjectPtr theResult = ExecuteXPath( theXPathProcessor, theXPathConstructionContext, theXPath, theXPathString, theContextNode, thePrefixResolver, theContextNodeList, theExecutionContext); thePrintWriter.print("Execution of XPath "); thePrintWriter.print(theXPathString); if (theResult->num() == theExpectedResult) { thePrintWriter.println(" succeeded."); thePrintWriter.print("The result was "); thePrintWriter.println(theResult->num()); } else { fError = true; thePrintWriter.println(" failed!"); thePrintWriter.print("The expected result was "); thePrintWriter.println(theExpectedResult); thePrintWriter.print("The actual result was "); thePrintWriter.println(theResult->num()); } return fError; }
/* * Get the total of the second and third arguments. */ inline double getTotal( XalanDOMString::size_type theSourceStringLength, double theSecondArgValue, const XObjectPtr& arg3) { // Total the second and third arguments. If the third argument is // missing, make it the length of the string + 1 (for XPath // indexing style). if (arg3.null() == true) { return double(theSourceStringLength + 1); } else { const double theRoundedValue = DoubleSupport::round(DoubleSupport::add(theSecondArgValue, arg3->num())); // If there's overflow, then we should return the length of the string + 1. if (DoubleSupport::isPositiveInfinity(theRoundedValue) == true) { return double(theSourceStringLength + 1); } else { return theRoundedValue; } } }
XObjectPtr FunctionFormatNumber::execute( XPathExecutionContext& executionContext, XalanNode* context, const XObjectPtr arg1, const XObjectPtr arg2, const XObjectPtr arg3, const LocatorType* locator) const { assert(arg1.null() == false && arg2.null() == false && arg3.null() == false); const double theNumber = arg1->num(); const XalanDOMString& thePattern = arg2->str(); const XalanDOMString& theDFSName = arg3->str(); assert(length(theDFSName) != 0); typedef XPathExecutionContext::GetAndReleaseCachedString GetAndReleaseCachedString; GetAndReleaseCachedString theString(executionContext); executionContext.formatNumber( theNumber, thePattern, theDFSName, theString.get(), context, locator); return executionContext.getXObjectFactory().createString(theString); }
XObjectPtr FunctionSubstring::execute( XPathExecutionContext& executionContext, XalanNode* /* context */, const XObjectPtr arg1, const XObjectPtr arg2, const XObjectPtr arg3, const LocatorType* /* locator */) const { assert(arg1.null() == false && arg2.null() == false); const XalanDOMString& theSourceString = arg1->str(); const XalanDOMString::size_type theSourceStringLength = length(theSourceString); if (theSourceStringLength == 0) { return createEmptyString(executionContext); } else { // Get the value of the second argument... const double theSecondArgValue = DoubleSupport::round(arg2->num()); // XPath indexes from 1, so this is the first XPath index.... const XalanDOMString::size_type theStartIndex = getStartIndex(theSecondArgValue, theSourceStringLength); if (theStartIndex >= theSourceStringLength) { return createEmptyString(executionContext); } else { const double theTotal = getTotal(theSourceStringLength, theSecondArgValue, arg3); if (DoubleSupport::isNaN(theSecondArgValue) == true || DoubleSupport::isNaN(theTotal) == true || DoubleSupport::isNegativeInfinity(theTotal) == true || theTotal == 0.0 || theTotal < double(theStartIndex)) { return createEmptyString(executionContext); } else { const XalanDOMString::size_type theSubstringLength = getSubstringLength( theSourceStringLength, theStartIndex, theTotal); XPathExecutionContext::GetAndReleaseCachedString theResult(executionContext); XalanDOMString& theString = theResult.get(); assign( theString, toCharArray(theSourceString) + theStartIndex, theSubstringLength); return executionContext.getXObjectFactory().createString(theResult); } } } }