#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 const XMLCh FunctionTranslate::name[] = { XERCES_CPP_NAMESPACE_QUALIFIER chLatin_t, XERCES_CPP_NAMESPACE_QUALIFIER chLatin_r, XERCES_CPP_NAMESPACE_QUALIFIER chLatin_a, XERCES_CPP_NAMESPACE_QUALIFIER chLatin_n, XERCES_CPP_NAMESPACE_QUALIFIER chLatin_s, XERCES_CPP_NAMESPACE_QUALIFIER chLatin_l, XERCES_CPP_NAMESPACE_QUALIFIER chLatin_a, XERCES_CPP_NAMESPACE_QUALIFIER chLatin_t, XERCES_CPP_NAMESPACE_QUALIFIER chLatin_e, XERCES_CPP_NAMESPACE_QUALIFIER chNull }; /** * fn:translate($arg as xs:string?, $mapString as xs:string, $transString as xs:string) as xs:string **/ FunctionTranslate::FunctionTranslate(const VectorOfDataItems &args, XPath2MemoryManager* memMgr) : ConstantFoldingFunction(name,3, 3, "string?,string,string", args, memMgr) { } Sequence FunctionTranslate::collapseTreeInternal(DynamicContext* context, int flags) const { XPath2MemoryManager* memMgr = context->getMemoryManager(); Sequence str1 = getParamNumber(1,context); if(str1.isEmpty()) { return Sequence(DatatypeFactory::STR2AT::createString(memMgr, XERCES_CPP_NAMESPACE_QUALIFIER XMLUni::fgZeroLenString, context), memMgr); } Sequence str2 = getParamNumber(2,context); Sequence str3 = getParamNumber(3,context); const XMLCh* container = ((const ATStringOrDerived*)str1.first())->asString(context); const XMLCh* search = ((const ATStringOrDerived*)str2.first())->asString(context); const XMLCh* replace = ((const ATStringOrDerived*)str3.first())->asString(context); const XMLCh* newString = XERCES_CPP_NAMESPACE_QUALIFIER XMLUni::fgZeroLenString; if(XERCES_CPP_NAMESPACE_QUALIFIER XMLString::stringLen(search)==0) return Sequence(DatatypeFactory::STR2AT::createString(memMgr, container, context), memMgr); std::map Change; for ( unsigned int i = 0; i < XERCES_CPP_NAMESPACE_QUALIFIER XMLString::stringLen(search) ; i++) { if(Change.find(search[i])!=Change.end()) continue; if(i