#include "../config/pathan_config.h" /* * Copyright (c) 2001, DecisionSoft Limited All rights reserved. * Please see LICENSE.TXT for more information. */ #include #include #include #include #include #include #include #include #include #include #include const XMLCh FunctionSubstringBefore::name[] = { XERCES_CPP_NAMESPACE_QUALIFIER chLatin_s, XERCES_CPP_NAMESPACE_QUALIFIER chLatin_u, XERCES_CPP_NAMESPACE_QUALIFIER chLatin_b, XERCES_CPP_NAMESPACE_QUALIFIER chLatin_s, XERCES_CPP_NAMESPACE_QUALIFIER chLatin_t, XERCES_CPP_NAMESPACE_QUALIFIER chLatin_r, XERCES_CPP_NAMESPACE_QUALIFIER chLatin_i, XERCES_CPP_NAMESPACE_QUALIFIER chLatin_n, XERCES_CPP_NAMESPACE_QUALIFIER chLatin_g, XERCES_CPP_NAMESPACE_QUALIFIER chDash, XERCES_CPP_NAMESPACE_QUALIFIER chLatin_b, XERCES_CPP_NAMESPACE_QUALIFIER chLatin_e, XERCES_CPP_NAMESPACE_QUALIFIER chLatin_f, XERCES_CPP_NAMESPACE_QUALIFIER chLatin_o, XERCES_CPP_NAMESPACE_QUALIFIER chLatin_r, XERCES_CPP_NAMESPACE_QUALIFIER chLatin_e, XERCES_CPP_NAMESPACE_QUALIFIER chNull }; /** * fn:substring-before($arg1 as xs:string?, $arg2 as xs:string?) as xs:string * fn:substring-before($arg1 as xs:string?, $arg2 as xs:string?, $collation as xs:string) as xs:string **/ FunctionSubstringBefore::FunctionSubstringBefore(const VectorOfDataItems &args, XPath2MemoryManager* memMgr) : ConstantFoldingFunction(name,2, 3, "string?,string?,string", args, memMgr) { } Sequence FunctionSubstringBefore::collapseTreeInternal(DynamicContext* context, int flags) const { XPath2MemoryManager* memMgr = context->getMemoryManager(); Sequence str1=getParamNumber(1,context); Sequence str2=getParamNumber(2,context); Collation* collation=NULL; if(getNumArgs()>2) { Sequence collArg = getParamNumber(3,context); const XMLCh* collName=collArg.first()->asString(context); try { DatatypeFactory::STR2AT::createAnyURI(memMgr, collName, context); } catch(XPath2ErrorException &e) { DSLthrow(FunctionException, X("FunctionSubstringAfter::collapseTreeInternal"), X("Invalid collationURI")); } collation=context->getCollation(collName); if(collation==NULL) DSLthrow(FunctionException,X("FunctionSubstringAfter::collapseTreeInternal"),X("Collation object is not available")); } else collation=context->getCollation(CodepointCollation::getCodepointCollationName()); const ATStringOrDerived* container = NULL; if(str1.isEmpty()) container=DatatypeFactory::STR2AT::createString(memMgr, XERCES_CPP_NAMESPACE_QUALIFIER XMLUni::fgZeroLenString, context); else container=(const ATStringOrDerived*)str1.first(); const ATStringOrDerived* pattern = NULL; if(str2.isEmpty()) pattern=DatatypeFactory::STR2AT::createString(memMgr, XERCES_CPP_NAMESPACE_QUALIFIER XMLUni::fgZeroLenString, context); else pattern=(const ATStringOrDerived*)str2.first(); return Sequence(container->substringBefore(pattern, collation, context), memMgr); }