blob: 8c3e0ed0bc96465de670e6e83398015fb9928613 [file] [log] [blame]
/*
* Copyright 1999-2004 The Apache Software Foundation.
*
* Licensed 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.
*/
// Base class header file
#include "XPathFunctionTable.hpp"
#include <cstring>
#include <xalanc/PlatformSupport/DOMStringHelper.hpp>
#include <xalanc/PlatformSupport/XalanMessageLoader.hpp>
#include "FunctionConcat.hpp"
#include "FunctionContains.hpp"
#include "FunctionID.hpp"
#include "FunctionLang.hpp"
#include "FunctionString.hpp"
#include "FunctionNamespaceURI.hpp"
#include "FunctionNormalizeSpace.hpp"
#include "FunctionStartsWith.hpp"
#include "FunctionSubstring.hpp"
#include "FunctionSubstringAfter.hpp"
#include "FunctionSubstringBefore.hpp"
#include "FunctionTranslate.hpp"
XALAN_CPP_NAMESPACE_BEGIN
class FunctionNotImplemented : public Function
{
public:
FunctionNotImplemented(const XalanDOMChar* theName) :
m_name(theName)
{
}
/**
* Create a copy of the function object.
*
* @return pointer to the new object
*/
virtual Function*
clone() const
{
return new FunctionNotImplemented(m_name);
}
protected:
/**
* Get the error message to report when
* the function is called with the wrong
* number of arguments.
*
* @return function error message
*/
virtual const XalanDOMString
getError() const
{
XalanDOMString theName(m_name);
return XalanMessageLoader::getMessage(XalanMessages::FunctionIsNotImplemented_1Param, theName);
}
private:
// Not implemented...
Function&
operator=(const Function&);
bool
operator==(const Function&) const;
const XalanDOMChar* const m_name;
};
XPathFunctionTable::XPathFunctionTable(bool fCreateTable) :
m_functionTable(),
m_functionTableEnd(m_functionTable + (sizeof(m_functionTable) / sizeof(m_functionTable[0])) - 1)
{
assert(int(s_functionNamesSize) == TableSize);
#if defined(XALAN_STRICT_ANSI_HEADERS)
std::memset(m_functionTable, 0, sizeof(m_functionTable));
#else
memset(m_functionTable, 0, sizeof(m_functionTable));
#endif
if (fCreateTable == true)
{
CreateTable();
}
}
XPathFunctionTable::~XPathFunctionTable()
{
DestroyTable();
}
void
XPathFunctionTable::InstallFunction(
const XalanDOMChar* theFunctionName,
const Function& theFunction)
{
const int theFunctionID =
getFunctionIndex(theFunctionName);
if (theFunctionID == InvalidFunctionNumberID)
{
throw XPathExceptionFunctionNotSupported(theFunctionName);
}
else
{
if (m_functionTable[theFunctionID] == 0)
{
m_functionTable[theFunctionID] = theFunction.clone();
}
else
{
const Function* const theOldFunction = m_functionTable[theFunctionID];
m_functionTable[theFunctionID] = theFunction.clone();
#if defined(XALAN_CANNOT_DELETE_CONST)
delete (Function*)theOldFunction;
#else
delete theOldFunction;
#endif
}
}
}
bool
XPathFunctionTable::UninstallFunction(const XalanDOMChar* theFunctionName)
{
const int theFunctionID =
getFunctionIndex(theFunctionName);
if (theFunctionID == InvalidFunctionNumberID)
{
return false;
}
else
{
const Function* const theFunction = m_functionTable[theFunctionID];
m_functionTable[theFunctionID] = 0;
#if defined(XALAN_CANNOT_DELETE_CONST)
delete (Function*)theFunction;
#else
delete theFunction;
#endif
return true;
}
}
#if 0
#include <fstream>
void
dumpTable(
const XPathFunctionTable::FunctionNameIndexMapType& theTable,
std::ostream& theSourceStream,
std::ostream& theHeaderStream)
{
XPathFunctionTable::FunctionNameIndexMapType::const_iterator i = theTable.begin();
while(i != theTable.end())
{
theSourceStream << "const XalanDOMChar\tXPathFunctionTable::s_";
const XalanDOMString& theString = (*i).first;
theHeaderStream << "\t// The string \"" << theString << "\"\n\tstatic const XalanDOMChar\ts_";
bool nextCap = false;
XalanDOMString::const_iterator j = theString.begin();
while(*j)
{
if (*j == '-')
{
nextCap = true;
}
else
{
assert(*j >= 'a' && *j <= 'z');
if (nextCap)
{
theSourceStream << char(*j -'a' + 'A');
theHeaderStream << char(*j -'a' + 'A');
nextCap = false;
}
else
{
theSourceStream << char(*j);
theHeaderStream << char(*j);
}
}
++j;
}
j = theString.begin();
theSourceStream << "[] =\n{\n";
theHeaderStream << "[];\n\n";
while(*j)
{
if (*j == '-')
{
theSourceStream << "\tXalanUnicode::charHyphenMinus,\n";
}
else
{
assert(*j >= 'a' && *j <= 'z');
theSourceStream << "\tXalanUnicode::charLetter_";
theSourceStream << char(*j) << ",\n";
}
++j;
}
theSourceStream << "\t0\n};\n\n";
++i;
}
}
#endif
void
XPathFunctionTable::CreateTable()
{
try
{
InstallFunction(
s_id,
FunctionID());
InstallFunction(
s_key,
FunctionNotImplemented(s_key));
InstallFunction(
s_not,
FunctionNotImplemented(s_not));
InstallFunction(
s_sum,
FunctionNotImplemented(s_sum));
InstallFunction(
s_lang,
FunctionLang());
InstallFunction(
s_last,
FunctionNotImplemented(s_last));
InstallFunction(
s_name,
FunctionNotImplemented(s_name));
InstallFunction(
s_true,
FunctionNotImplemented(s_true));
InstallFunction(
s_count,
FunctionNotImplemented(s_count));
InstallFunction(
s_false,
FunctionNotImplemented(s_false));
InstallFunction(
s_floor,
FunctionNotImplemented(s_floor));
InstallFunction(
s_round,
FunctionNotImplemented(s_round));
InstallFunction(
s_concat,
FunctionConcat());
InstallFunction(
s_number,
FunctionNotImplemented(s_number));
InstallFunction(
s_string,
FunctionString());
InstallFunction(
s_boolean,
FunctionNotImplemented(s_boolean));
InstallFunction(
s_ceiling,
FunctionNotImplemented(s_ceiling));
InstallFunction(
s_current,
FunctionNotImplemented(s_current));
InstallFunction(
s_contains,
FunctionContains());
InstallFunction(
s_document,
FunctionNotImplemented(s_document));
InstallFunction(
s_position,
FunctionNotImplemented(s_position));
InstallFunction(
s_substring,
FunctionSubstring());
InstallFunction(
s_translate,
FunctionTranslate());
InstallFunction(
s_localName,
FunctionNotImplemented(s_localName));
InstallFunction(
s_generateId,
FunctionNotImplemented(s_generateId));
InstallFunction(
s_startsWith,
FunctionStartsWith());
InstallFunction(
s_formatNumber,
FunctionNotImplemented(s_formatNumber));
InstallFunction(
s_namespaceUri,
FunctionNamespaceURI());
InstallFunction(
s_stringLength,
FunctionNotImplemented(s_stringLength));
InstallFunction(
s_normalizeSpace,
FunctionNormalizeSpace());
InstallFunction(
s_substringAfter,
FunctionSubstringAfter());
InstallFunction(
s_systemProperty,
FunctionNotImplemented(s_systemProperty));
InstallFunction(
s_substringBefore,
FunctionSubstringBefore());
InstallFunction(
s_elementAvailable,
FunctionNotImplemented(s_elementAvailable));
InstallFunction(
s_functionAvailable,
FunctionNotImplemented(s_functionAvailable));
InstallFunction(
s_unparsedEntityUri,
FunctionNotImplemented(s_unparsedEntityUri));
#if 0
std::ofstream theSourceStream("\\foo.cpp");
std::ofstream theHeaderStream("\\foo.hpp");
dumpTable(m_FunctionNameIndex, theSourceStream, theHeaderStream);
#endif
}
catch(...)
{
DestroyTable();
throw;
}
}
void
XPathFunctionTable::DestroyTable()
{
try
{
XALAN_USING_STD(for_each)
for_each(
m_functionTable,
m_functionTable + TableSize,
DeleteFunctorType());
#if defined(XALAN_STRICT_ANSI_HEADERS)
std::memset(m_functionTable, 0, sizeof(m_functionTable));
#else
memset(m_functionTable, 0, sizeof(m_functionTable));
#endif
}
catch(...)
{
}
}
int
XPathFunctionTable::getFunctionIndex(
const XalanDOMChar* theName,
StringSizeType theNameLength)
{
assert(theName != 0);
// Do a binary search...
const FunctionNameTableEntry* theFirst = s_functionNames;
const FunctionNameTableEntry* theLast = s_lastFunctionName;
while(theFirst <= theLast)
{
const FunctionNameTableEntry* const theCurrent =
theFirst + (theLast - theFirst) / 2;
assert(theCurrent->m_size == length(theCurrent->m_name));
const int theResult = compare(
theName,
theNameLength,
theCurrent->m_name,
theCurrent->m_size);
if (theResult < 0)
{
theLast = theCurrent - 1;
}
else if (theResult > 0)
{
theFirst = theCurrent + 1;
}
else
{
assert(int(theCurrent - s_functionNames) == theCurrent - s_functionNames);
return int(theCurrent - s_functionNames);
}
}
return InvalidFunctionNumberID;
}
XPathExceptionFunctionNotAvailable::XPathExceptionFunctionNotAvailable(int theFunctionNumber) :
XalanXPathException(XalanMessageLoader::getMessage(XalanMessages::FunctionNumberIsNotAvailable_1Param,LongToDOMString(theFunctionNumber)))
{
}
XPathExceptionFunctionNotAvailable::XPathExceptionFunctionNotAvailable(const XalanDOMString& theFunctionName) :
XalanXPathException(XalanMessageLoader::getMessage(XalanMessages::SpecifiedFuncIsNotAvailable_1Param, theFunctionName))
{
}
XPathExceptionFunctionNotAvailable::XPathExceptionFunctionNotAvailable(
int theFunctionNumber,
const LocatorType& theLocator) :
XalanXPathException(
theLocator,
XalanMessageLoader::getMessage(XalanMessages::FunctionNumberIsNotAvailable_1Param,LongToDOMString(theFunctionNumber)))
{
}
XPathExceptionFunctionNotAvailable::XPathExceptionFunctionNotAvailable(
const XalanDOMString& theFunctionName,
const LocatorType& theLocator) :
XalanXPathException(
theLocator,
XalanMessageLoader::getMessage(XalanMessages::SpecifiedFuncIsNotAvailable_1Param, theFunctionName))
{
}
XPathExceptionFunctionNotAvailable::~XPathExceptionFunctionNotAvailable()
{
}
XPathExceptionFunctionNotSupported::XPathExceptionFunctionNotSupported(const XalanDOMChar* theFunctionName) :
XalanXPathException(XalanMessageLoader::getMessage(XalanMessages::FunctionIsNotSupported_1Param,XalanDOMString(theFunctionName)))
{
}
XPathExceptionFunctionNotSupported::~XPathExceptionFunctionNotSupported()
{
}
const XalanDOMChar XPathFunctionTable::s_id[] =
{
XalanUnicode::charLetter_i,
XalanUnicode::charLetter_d,
0
};
const XalanDOMChar XPathFunctionTable::s_key[] =
{
XalanUnicode::charLetter_k,
XalanUnicode::charLetter_e,
XalanUnicode::charLetter_y,
0
};
const XalanDOMChar XPathFunctionTable::s_not[] =
{
XalanUnicode::charLetter_n,
XalanUnicode::charLetter_o,
XalanUnicode::charLetter_t,
0
};
const XalanDOMChar XPathFunctionTable::s_sum[] =
{
XalanUnicode::charLetter_s,
XalanUnicode::charLetter_u,
XalanUnicode::charLetter_m,
0
};
const XalanDOMChar XPathFunctionTable::s_lang[] =
{
XalanUnicode::charLetter_l,
XalanUnicode::charLetter_a,
XalanUnicode::charLetter_n,
XalanUnicode::charLetter_g,
0
};
const XalanDOMChar XPathFunctionTable::s_last[] =
{
XalanUnicode::charLetter_l,
XalanUnicode::charLetter_a,
XalanUnicode::charLetter_s,
XalanUnicode::charLetter_t,
0
};
const XalanDOMChar XPathFunctionTable::s_name[] =
{
XalanUnicode::charLetter_n,
XalanUnicode::charLetter_a,
XalanUnicode::charLetter_m,
XalanUnicode::charLetter_e,
0
};
const XalanDOMChar XPathFunctionTable::s_true[] =
{
XalanUnicode::charLetter_t,
XalanUnicode::charLetter_r,
XalanUnicode::charLetter_u,
XalanUnicode::charLetter_e,
0
};
const XalanDOMChar XPathFunctionTable::s_count[] =
{
XalanUnicode::charLetter_c,
XalanUnicode::charLetter_o,
XalanUnicode::charLetter_u,
XalanUnicode::charLetter_n,
XalanUnicode::charLetter_t,
0
};
const XalanDOMChar XPathFunctionTable::s_false[] =
{
XalanUnicode::charLetter_f,
XalanUnicode::charLetter_a,
XalanUnicode::charLetter_l,
XalanUnicode::charLetter_s,
XalanUnicode::charLetter_e,
0
};
const XalanDOMChar XPathFunctionTable::s_floor[] =
{
XalanUnicode::charLetter_f,
XalanUnicode::charLetter_l,
XalanUnicode::charLetter_o,
XalanUnicode::charLetter_o,
XalanUnicode::charLetter_r,
0
};
const XalanDOMChar XPathFunctionTable::s_round[] =
{
XalanUnicode::charLetter_r,
XalanUnicode::charLetter_o,
XalanUnicode::charLetter_u,
XalanUnicode::charLetter_n,
XalanUnicode::charLetter_d,
0
};
const XalanDOMChar XPathFunctionTable::s_concat[] =
{
XalanUnicode::charLetter_c,
XalanUnicode::charLetter_o,
XalanUnicode::charLetter_n,
XalanUnicode::charLetter_c,
XalanUnicode::charLetter_a,
XalanUnicode::charLetter_t,
0
};
const XalanDOMChar XPathFunctionTable::s_number[] =
{
XalanUnicode::charLetter_n,
XalanUnicode::charLetter_u,
XalanUnicode::charLetter_m,
XalanUnicode::charLetter_b,
XalanUnicode::charLetter_e,
XalanUnicode::charLetter_r,
0
};
const XalanDOMChar XPathFunctionTable::s_string[] =
{
XalanUnicode::charLetter_s,
XalanUnicode::charLetter_t,
XalanUnicode::charLetter_r,
XalanUnicode::charLetter_i,
XalanUnicode::charLetter_n,
XalanUnicode::charLetter_g,
0
};
const XalanDOMChar XPathFunctionTable::s_boolean[] =
{
XalanUnicode::charLetter_b,
XalanUnicode::charLetter_o,
XalanUnicode::charLetter_o,
XalanUnicode::charLetter_l,
XalanUnicode::charLetter_e,
XalanUnicode::charLetter_a,
XalanUnicode::charLetter_n,
0
};
const XalanDOMChar XPathFunctionTable::s_ceiling[] =
{
XalanUnicode::charLetter_c,
XalanUnicode::charLetter_e,
XalanUnicode::charLetter_i,
XalanUnicode::charLetter_l,
XalanUnicode::charLetter_i,
XalanUnicode::charLetter_n,
XalanUnicode::charLetter_g,
0
};
const XalanDOMChar XPathFunctionTable::s_current[] =
{
XalanUnicode::charLetter_c,
XalanUnicode::charLetter_u,
XalanUnicode::charLetter_r,
XalanUnicode::charLetter_r,
XalanUnicode::charLetter_e,
XalanUnicode::charLetter_n,
XalanUnicode::charLetter_t,
0
};
const XalanDOMChar XPathFunctionTable::s_contains[] =
{
XalanUnicode::charLetter_c,
XalanUnicode::charLetter_o,
XalanUnicode::charLetter_n,
XalanUnicode::charLetter_t,
XalanUnicode::charLetter_a,
XalanUnicode::charLetter_i,
XalanUnicode::charLetter_n,
XalanUnicode::charLetter_s,
0
};
const XalanDOMChar XPathFunctionTable::s_document[] =
{
XalanUnicode::charLetter_d,
XalanUnicode::charLetter_o,
XalanUnicode::charLetter_c,
XalanUnicode::charLetter_u,
XalanUnicode::charLetter_m,
XalanUnicode::charLetter_e,
XalanUnicode::charLetter_n,
XalanUnicode::charLetter_t,
0
};
const XalanDOMChar XPathFunctionTable::s_position[] =
{
XalanUnicode::charLetter_p,
XalanUnicode::charLetter_o,
XalanUnicode::charLetter_s,
XalanUnicode::charLetter_i,
XalanUnicode::charLetter_t,
XalanUnicode::charLetter_i,
XalanUnicode::charLetter_o,
XalanUnicode::charLetter_n,
0
};
const XalanDOMChar XPathFunctionTable::s_substring[] =
{
XalanUnicode::charLetter_s,
XalanUnicode::charLetter_u,
XalanUnicode::charLetter_b,
XalanUnicode::charLetter_s,
XalanUnicode::charLetter_t,
XalanUnicode::charLetter_r,
XalanUnicode::charLetter_i,
XalanUnicode::charLetter_n,
XalanUnicode::charLetter_g,
0
};
const XalanDOMChar XPathFunctionTable::s_translate[] =
{
XalanUnicode::charLetter_t,
XalanUnicode::charLetter_r,
XalanUnicode::charLetter_a,
XalanUnicode::charLetter_n,
XalanUnicode::charLetter_s,
XalanUnicode::charLetter_l,
XalanUnicode::charLetter_a,
XalanUnicode::charLetter_t,
XalanUnicode::charLetter_e,
0
};
const XalanDOMChar XPathFunctionTable::s_localName[] =
{
XalanUnicode::charLetter_l,
XalanUnicode::charLetter_o,
XalanUnicode::charLetter_c,
XalanUnicode::charLetter_a,
XalanUnicode::charLetter_l,
XalanUnicode::charHyphenMinus,
XalanUnicode::charLetter_n,
XalanUnicode::charLetter_a,
XalanUnicode::charLetter_m,
XalanUnicode::charLetter_e,
0
};
const XalanDOMChar XPathFunctionTable::s_generateId[] =
{
XalanUnicode::charLetter_g,
XalanUnicode::charLetter_e,
XalanUnicode::charLetter_n,
XalanUnicode::charLetter_e,
XalanUnicode::charLetter_r,
XalanUnicode::charLetter_a,
XalanUnicode::charLetter_t,
XalanUnicode::charLetter_e,
XalanUnicode::charHyphenMinus,
XalanUnicode::charLetter_i,
XalanUnicode::charLetter_d,
0
};
const XalanDOMChar XPathFunctionTable::s_startsWith[] =
{
XalanUnicode::charLetter_s,
XalanUnicode::charLetter_t,
XalanUnicode::charLetter_a,
XalanUnicode::charLetter_r,
XalanUnicode::charLetter_t,
XalanUnicode::charLetter_s,
XalanUnicode::charHyphenMinus,
XalanUnicode::charLetter_w,
XalanUnicode::charLetter_i,
XalanUnicode::charLetter_t,
XalanUnicode::charLetter_h,
0
};
const XalanDOMChar XPathFunctionTable::s_formatNumber[] =
{
XalanUnicode::charLetter_f,
XalanUnicode::charLetter_o,
XalanUnicode::charLetter_r,
XalanUnicode::charLetter_m,
XalanUnicode::charLetter_a,
XalanUnicode::charLetter_t,
XalanUnicode::charHyphenMinus,
XalanUnicode::charLetter_n,
XalanUnicode::charLetter_u,
XalanUnicode::charLetter_m,
XalanUnicode::charLetter_b,
XalanUnicode::charLetter_e,
XalanUnicode::charLetter_r,
0
};
const XalanDOMChar XPathFunctionTable::s_namespaceUri[] =
{
XalanUnicode::charLetter_n,
XalanUnicode::charLetter_a,
XalanUnicode::charLetter_m,
XalanUnicode::charLetter_e,
XalanUnicode::charLetter_s,
XalanUnicode::charLetter_p,
XalanUnicode::charLetter_a,
XalanUnicode::charLetter_c,
XalanUnicode::charLetter_e,
XalanUnicode::charHyphenMinus,
XalanUnicode::charLetter_u,
XalanUnicode::charLetter_r,
XalanUnicode::charLetter_i,
0
};
const XalanDOMChar XPathFunctionTable::s_stringLength[] =
{
XalanUnicode::charLetter_s,
XalanUnicode::charLetter_t,
XalanUnicode::charLetter_r,
XalanUnicode::charLetter_i,
XalanUnicode::charLetter_n,
XalanUnicode::charLetter_g,
XalanUnicode::charHyphenMinus,
XalanUnicode::charLetter_l,
XalanUnicode::charLetter_e,
XalanUnicode::charLetter_n,
XalanUnicode::charLetter_g,
XalanUnicode::charLetter_t,
XalanUnicode::charLetter_h,
0
};
const XalanDOMChar XPathFunctionTable::s_normalizeSpace[] =
{
XalanUnicode::charLetter_n,
XalanUnicode::charLetter_o,
XalanUnicode::charLetter_r,
XalanUnicode::charLetter_m,
XalanUnicode::charLetter_a,
XalanUnicode::charLetter_l,
XalanUnicode::charLetter_i,
XalanUnicode::charLetter_z,
XalanUnicode::charLetter_e,
XalanUnicode::charHyphenMinus,
XalanUnicode::charLetter_s,
XalanUnicode::charLetter_p,
XalanUnicode::charLetter_a,
XalanUnicode::charLetter_c,
XalanUnicode::charLetter_e,
0
};
const XalanDOMChar XPathFunctionTable::s_substringAfter[] =
{
XalanUnicode::charLetter_s,
XalanUnicode::charLetter_u,
XalanUnicode::charLetter_b,
XalanUnicode::charLetter_s,
XalanUnicode::charLetter_t,
XalanUnicode::charLetter_r,
XalanUnicode::charLetter_i,
XalanUnicode::charLetter_n,
XalanUnicode::charLetter_g,
XalanUnicode::charHyphenMinus,
XalanUnicode::charLetter_a,
XalanUnicode::charLetter_f,
XalanUnicode::charLetter_t,
XalanUnicode::charLetter_e,
XalanUnicode::charLetter_r,
0
};
const XalanDOMChar XPathFunctionTable::s_systemProperty[] =
{
XalanUnicode::charLetter_s,
XalanUnicode::charLetter_y,
XalanUnicode::charLetter_s,
XalanUnicode::charLetter_t,
XalanUnicode::charLetter_e,
XalanUnicode::charLetter_m,
XalanUnicode::charHyphenMinus,
XalanUnicode::charLetter_p,
XalanUnicode::charLetter_r,
XalanUnicode::charLetter_o,
XalanUnicode::charLetter_p,
XalanUnicode::charLetter_e,
XalanUnicode::charLetter_r,
XalanUnicode::charLetter_t,
XalanUnicode::charLetter_y,
0
};
const XalanDOMChar XPathFunctionTable::s_substringBefore[] =
{
XalanUnicode::charLetter_s,
XalanUnicode::charLetter_u,
XalanUnicode::charLetter_b,
XalanUnicode::charLetter_s,
XalanUnicode::charLetter_t,
XalanUnicode::charLetter_r,
XalanUnicode::charLetter_i,
XalanUnicode::charLetter_n,
XalanUnicode::charLetter_g,
XalanUnicode::charHyphenMinus,
XalanUnicode::charLetter_b,
XalanUnicode::charLetter_e,
XalanUnicode::charLetter_f,
XalanUnicode::charLetter_o,
XalanUnicode::charLetter_r,
XalanUnicode::charLetter_e,
0
};
const XalanDOMChar XPathFunctionTable::s_elementAvailable[] =
{
XalanUnicode::charLetter_e,
XalanUnicode::charLetter_l,
XalanUnicode::charLetter_e,
XalanUnicode::charLetter_m,
XalanUnicode::charLetter_e,
XalanUnicode::charLetter_n,
XalanUnicode::charLetter_t,
XalanUnicode::charHyphenMinus,
XalanUnicode::charLetter_a,
XalanUnicode::charLetter_v,
XalanUnicode::charLetter_a,
XalanUnicode::charLetter_i,
XalanUnicode::charLetter_l,
XalanUnicode::charLetter_a,
XalanUnicode::charLetter_b,
XalanUnicode::charLetter_l,
XalanUnicode::charLetter_e,
0
};
const XalanDOMChar XPathFunctionTable::s_functionAvailable[] =
{
XalanUnicode::charLetter_f,
XalanUnicode::charLetter_u,
XalanUnicode::charLetter_n,
XalanUnicode::charLetter_c,
XalanUnicode::charLetter_t,
XalanUnicode::charLetter_i,
XalanUnicode::charLetter_o,
XalanUnicode::charLetter_n,
XalanUnicode::charHyphenMinus,
XalanUnicode::charLetter_a,
XalanUnicode::charLetter_v,
XalanUnicode::charLetter_a,
XalanUnicode::charLetter_i,
XalanUnicode::charLetter_l,
XalanUnicode::charLetter_a,
XalanUnicode::charLetter_b,
XalanUnicode::charLetter_l,
XalanUnicode::charLetter_e,
0
};
const XalanDOMChar XPathFunctionTable::s_unparsedEntityUri[] =
{
XalanUnicode::charLetter_u,
XalanUnicode::charLetter_n,
XalanUnicode::charLetter_p,
XalanUnicode::charLetter_a,
XalanUnicode::charLetter_r,
XalanUnicode::charLetter_s,
XalanUnicode::charLetter_e,
XalanUnicode::charLetter_d,
XalanUnicode::charHyphenMinus,
XalanUnicode::charLetter_e,
XalanUnicode::charLetter_n,
XalanUnicode::charLetter_t,
XalanUnicode::charLetter_i,
XalanUnicode::charLetter_t,
XalanUnicode::charLetter_y,
XalanUnicode::charHyphenMinus,
XalanUnicode::charLetter_u,
XalanUnicode::charLetter_r,
XalanUnicode::charLetter_i,
0
};
typedef XPathFunctionTable::SizeType SizeType;
typedef XPathFunctionTable::FunctionNameTableEntry FunctionNameTableEntry;
#define XFTBL_SIZE(str) ((sizeof(str) / sizeof(str[0]) - 1))
const FunctionNameTableEntry XPathFunctionTable::s_functionNames[] =
{
{
s_id,
XFTBL_SIZE(s_id)
},
{
s_key,
XFTBL_SIZE(s_key)
},
{
s_not,
XFTBL_SIZE(s_not)
},
{
s_sum,
XFTBL_SIZE(s_sum)
},
{
s_lang,
XFTBL_SIZE(s_lang)
},
{
s_last,
XFTBL_SIZE(s_last)
},
{
s_name,
XFTBL_SIZE(s_name)
},
{
s_true,
XFTBL_SIZE(s_true)
},
{
s_count,
XFTBL_SIZE(s_count)
},
{
s_false,
XFTBL_SIZE(s_false)
},
{
s_floor,
XFTBL_SIZE(s_floor)
},
{
s_round,
XFTBL_SIZE(s_round)
},
{
s_concat,
XFTBL_SIZE(s_concat)
},
{
s_number,
XFTBL_SIZE(s_number)
},
{
s_string,
XFTBL_SIZE(s_string)
},
{
s_boolean,
XFTBL_SIZE(s_boolean)
},
{
s_ceiling,
XFTBL_SIZE(s_ceiling)
},
{
s_current,
XFTBL_SIZE(s_current)
},
{
s_contains,
XFTBL_SIZE(s_contains)
},
{
s_document,
XFTBL_SIZE(s_document)
},
{
s_position,
XFTBL_SIZE(s_position)
},
{
s_substring,
XFTBL_SIZE(s_substring)
},
{
s_translate,
XFTBL_SIZE(s_translate)
},
{
s_localName,
XFTBL_SIZE(s_localName)
},
{
s_generateId,
XFTBL_SIZE(s_generateId)
},
{
s_startsWith,
XFTBL_SIZE(s_startsWith)
},
{
s_formatNumber,
XFTBL_SIZE(s_formatNumber)
},
{
s_namespaceUri,
XFTBL_SIZE(s_namespaceUri)
},
{
s_stringLength,
XFTBL_SIZE(s_stringLength)
},
{
s_normalizeSpace,
XFTBL_SIZE(s_normalizeSpace)
},
{
s_substringAfter,
XFTBL_SIZE(s_substringAfter)
},
{
s_systemProperty,
XFTBL_SIZE(s_systemProperty)
},
{
s_substringBefore,
XFTBL_SIZE(s_substringBefore)
},
{
s_elementAvailable,
XFTBL_SIZE(s_elementAvailable)
},
{
s_functionAvailable,
XFTBL_SIZE(s_functionAvailable)
},
{
s_unparsedEntityUri,
XFTBL_SIZE(s_unparsedEntityUri)
}
};
const FunctionNameTableEntry* const XPathFunctionTable::s_lastFunctionName =
&s_functionNames[sizeof(s_functionNames) / sizeof(s_functionNames[0]) - 1];
const SizeType XPathFunctionTable::s_functionNamesSize =
sizeof(s_functionNames) / sizeof(s_functionNames[0]);
XALAN_CPP_NAMESPACE_END