#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 const XMLCh FunctionStringLength::name[] = { 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_l, XERCES_CPP_NAMESPACE_QUALIFIER chLatin_e, XERCES_CPP_NAMESPACE_QUALIFIER chLatin_n, XERCES_CPP_NAMESPACE_QUALIFIER chLatin_g, XERCES_CPP_NAMESPACE_QUALIFIER chLatin_t, XERCES_CPP_NAMESPACE_QUALIFIER chLatin_h, XERCES_CPP_NAMESPACE_QUALIFIER chNull }; /** * fn:string-length() as xs:integer * fn:string-length($arg as xs:string?) as xs:integer **/ FunctionStringLength::FunctionStringLength(const VectorOfDataItems &args, XPath2MemoryManager* memMgr) : DataItemFunction(name,0, 1, "string?", args, memMgr) { } const XMLCh* FunctionStringLength::getString(DynamicContext* context) const { XPath2MemoryManager* memMgr = context->getMemoryManager(); //setup xf:string with empty args VectorOfDataItems args=VectorOfDataItems(PathanAllocator(context->getMemoryManager())); FunctionString stringGrabber(args, memMgr); //call xf:string and extract result return ((const ATStringOrDerived*)stringGrabber.collapseTree(context).first())->asString(context); } DataItem* FunctionStringLength::staticResolution(StaticContext *context, StaticResolutionContext *src) { if(_args.empty()) { src->contextItemUsed(true); } return resolveDataItems(_args, context, src, !_args.empty()); } Sequence FunctionStringLength::collapseTreeInternal(DynamicContext* context, int flags) const { const XMLCh* str; XPath2MemoryManager* memMgr = context->getMemoryManager(); if (getNumArgs() == 0) { str = getString(context); } else { Sequence strParm=getParamNumber(1,context); if(strParm.isEmpty()) return Sequence(DatatypeFactory::POD2AT::createInteger(memMgr, 0, context), memMgr); str = ((const ATStringOrDerived*)strParm.first())->asString(context); } const ATDecimalOrDerived* length = DatatypeFactory::POD2AT::createInteger(memMgr, (long)XERCES_CPP_NAMESPACE_QUALIFIER XMLString::stringLen(str), context); return Sequence(length, memMgr); }