blob: b42c5b32d2bb3203a3c147f99984b28d001e32b7 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "XalanEXSLTCommon.hpp"
#include "XalanEXSLTCommonImpl.hpp"
#include <xalanc/PlatformSupport/XalanUnicode.hpp>
#include <xalanc/PlatformSupport/XalanMessageLoader.hpp>
#include <xalanc/XPath/XObjectFactory.hpp>
#include <xalanc/XPath/XPathEnvSupportDefault.hpp>
namespace XALAN_CPP_NAMESPACE {
const XalanDOMChar XalanEXSLTFunctionObjectType::s_booleanString[] =
{
XalanUnicode::charLetter_b,
XalanUnicode::charLetter_o,
XalanUnicode::charLetter_o,
XalanUnicode::charLetter_l,
XalanUnicode::charLetter_e,
XalanUnicode::charLetter_a,
XalanUnicode::charLetter_n,
0
};
const XalanDOMChar XalanEXSLTFunctionObjectType::s_externalString[] =
{
XalanUnicode::charLetter_e,
XalanUnicode::charLetter_x,
XalanUnicode::charLetter_t,
XalanUnicode::charLetter_e,
XalanUnicode::charLetter_r,
XalanUnicode::charLetter_n,
XalanUnicode::charLetter_a,
XalanUnicode::charLetter_l,
0
};
const XalanDOMChar XalanEXSLTFunctionObjectType::s_nodeSetString[] =
{
XalanUnicode::charLetter_n,
XalanUnicode::charLetter_o,
XalanUnicode::charLetter_d,
XalanUnicode::charLetter_e,
XalanUnicode::charHyphenMinus,
XalanUnicode::charLetter_s,
XalanUnicode::charLetter_e,
XalanUnicode::charLetter_t,
0
};
const XalanDOMChar XalanEXSLTFunctionObjectType::s_numberString[] =
{
XalanUnicode::charLetter_n,
XalanUnicode::charLetter_u,
XalanUnicode::charLetter_m,
XalanUnicode::charLetter_b,
XalanUnicode::charLetter_e,
XalanUnicode::charLetter_r,
0
};
const XalanDOMChar XalanEXSLTFunctionObjectType::s_rtfString[] =
{
XalanUnicode::charLetter_R,
XalanUnicode::charLetter_T,
XalanUnicode::charLetter_F,
0
};
const XalanDOMChar XalanEXSLTFunctionObjectType::s_stringString[] =
{
XalanUnicode::charLetter_s,
XalanUnicode::charLetter_t,
XalanUnicode::charLetter_r,
XalanUnicode::charLetter_i,
XalanUnicode::charLetter_n,
XalanUnicode::charLetter_g,
0
};
static const XalanDOMChar s_objectTypeFunctionName[] =
{
XalanUnicode::charLetter_o,
XalanUnicode::charLetter_b,
XalanUnicode::charLetter_j,
XalanUnicode::charLetter_e,
XalanUnicode::charLetter_c,
XalanUnicode::charLetter_t,
XalanUnicode::charHyphenMinus,
XalanUnicode::charLetter_t,
XalanUnicode::charLetter_y,
XalanUnicode::charLetter_p,
XalanUnicode::charLetter_e,
0
};
XObjectPtr
XalanEXSLTFunctionObjectType::execute(
XPathExecutionContext& executionContext,
XalanNode* context,
const XObjectArgVectorType& args,
const Locator* locator) const
{
// Make sure nothing's happened to our strings and that
// they were actually initialized...
assert(XalanDOMString::equals(m_boolean, s_booleanString) == true);
assert(XalanDOMString::equals(m_external, s_externalString) == true);
assert(XalanDOMString::equals(m_nodeSet, s_nodeSetString) == true);
assert(XalanDOMString::equals(m_number, s_numberString) == true);
assert(XalanDOMString::equals(m_rtf, s_rtfString) == true);
assert(XalanDOMString::equals(m_string, s_stringString) == true);
if (args.size() != 1)
{
generalError(
executionContext,
context,
locator);
}
assert(args[0].null() == false);
const XalanDOMString* theResult = &m_external;
switch(args[0]->getType())
{
case XObject::eTypeBoolean:
theResult = &m_boolean;
break;
case XObject::eTypeNodeSet:
theResult = &m_nodeSet;
break;
case XObject::eTypeNumber:
theResult = &m_number;
break;
case XObject::eTypeResultTreeFrag:
theResult = &m_rtf;
break;
case XObject::eTypeString:
theResult = &m_string;
break;
default:
break;
}
assert(theResult != 0);
return executionContext.getXObjectFactory().createStringReference(*theResult);
}
const XalanDOMString&
XalanEXSLTFunctionObjectType::getError(XalanDOMString& theResult) const
{
return XalanMessageLoader::getMessage(
theResult,
XalanMessages::EXSLTFunctionAcceptsOneArgument_1Param,
s_objectTypeFunctionName);
}
static const XalanDOMChar s_commonNamespace[] =
{
XalanUnicode::charLetter_h,
XalanUnicode::charLetter_t,
XalanUnicode::charLetter_t,
XalanUnicode::charLetter_p,
XalanUnicode::charColon,
XalanUnicode::charSolidus,
XalanUnicode::charSolidus,
XalanUnicode::charLetter_e,
XalanUnicode::charLetter_x,
XalanUnicode::charLetter_s,
XalanUnicode::charLetter_l,
XalanUnicode::charLetter_t,
XalanUnicode::charFullStop,
XalanUnicode::charLetter_o,
XalanUnicode::charLetter_r,
XalanUnicode::charLetter_g,
XalanUnicode::charSolidus,
XalanUnicode::charLetter_c,
XalanUnicode::charLetter_o,
XalanUnicode::charLetter_m,
XalanUnicode::charLetter_m,
XalanUnicode::charLetter_o,
XalanUnicode::charLetter_n,
0
};
static const XalanDOMChar s_nodeSetFunctionName[] =
{
XalanUnicode::charLetter_n,
XalanUnicode::charLetter_o,
XalanUnicode::charLetter_d,
XalanUnicode::charLetter_e,
XalanUnicode::charHyphenMinus,
XalanUnicode::charLetter_s,
XalanUnicode::charLetter_e,
XalanUnicode::charLetter_t,
0
};
static const XalanEXSLTFunctionNodeSet s_nodesetFunction;
// Note this is a special constructor of XalanEXSLTFunctionObjectType which
// allocates no memory. It is only used here, so we can have table-based
// initialization, but not have any memory allocation.
static const XalanEXSLTFunctionObjectType s_objectTypeFunction(XalanMemMgrs::getDummyMemMgr(), 1);
static const XalanEXSLTCommonFunctionsInstaller::FunctionTableEntry theFunctionTable[] =
{
{ s_nodeSetFunctionName, &s_nodesetFunction },
{ s_objectTypeFunctionName, &s_objectTypeFunction },
{ 0, 0 }
};
void
XalanEXSLTCommonFunctionsInstaller::installLocal(XPathEnvSupportDefault& theSupport)
{
doInstallLocal(s_commonNamespace, theFunctionTable, theSupport);
}
void
XalanEXSLTCommonFunctionsInstaller::installGlobal(MemoryManager& theManager)
{
doInstallGlobal( theManager, s_commonNamespace, theFunctionTable);
}
void
XalanEXSLTCommonFunctionsInstaller::uninstallLocal(XPathEnvSupportDefault& theSupport)
{
doUninstallLocal(s_commonNamespace, theFunctionTable, theSupport);
}
void
XalanEXSLTCommonFunctionsInstaller::uninstallGlobal(MemoryManager& theManager)
{
doUninstallGlobal(theManager, s_commonNamespace, theFunctionTable);
}
}