dbertoni 2003/01/03 00:04:25
Modified: c/src/XPath XPath.cpp XPath.hpp XPathExpression.cpp
XPathExpression.hpp XPathProcessorImpl.cpp
XPathProcessorImpl.hpp
Log:
New code to "inline" more XPath functions.
Revision Changes Path
1.85 +560 -94 xml-xalan/c/src/XPath/XPath.cpp
Index: XPath.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XPath/XPath.cpp,v
retrieving revision 1.84
retrieving revision 1.85
diff -u -r1.84 -r1.85
--- XPath.cpp 2 Jan 2003 17:39:08 -0000 1.84
+++ XPath.cpp 3 Jan 2003 08:04:24 -0000 1.85
@@ -153,6 +153,8 @@
const PrefixResolver& prefixResolver,
XPathExecutionContext& executionContext) const
{
+ assert(context != 0);
+
// Push and pop the PrefixResolver...
XPathExecutionContext::PrefixResolverSetAndRestore
theResolverSetAndRestore(
executionContext,
@@ -175,6 +177,8 @@
XPathExecutionContext& executionContext,
bool& result) const
{
+ assert(context != 0);
+
// Push and pop the PrefixResolver...
XPathExecutionContext::PrefixResolverSetAndRestore
theResolverSetAndRestore(
executionContext,
@@ -197,6 +201,8 @@
XPathExecutionContext& executionContext,
double& result) const
{
+ assert(context != 0);
+
// Push and pop the PrefixResolver...
XPathExecutionContext::PrefixResolverSetAndRestore
theResolverSetAndRestore(
executionContext,
@@ -219,6 +225,8 @@
XPathExecutionContext& executionContext,
XalanDOMString& result) const
{
+ assert(context != 0);
+
// Push and pop the PrefixResolver...
XPathExecutionContext::PrefixResolverSetAndRestore
theResolverSetAndRestore(
executionContext,
@@ -242,6 +250,8 @@
FormatterListener& formatterListener,
MemberFunctionPtr function) const
{
+ assert(context != 0);
+
// Push and pop the PrefixResolver...
XPathExecutionContext::PrefixResolverSetAndRestore
theResolverSetAndRestore(
executionContext,
@@ -264,6 +274,9 @@
XPathExecutionContext& executionContext,
MutableNodeRefList& result) const
{
+ assert(context != 0);
+ assert(result.empty() == true);
+
// Push and pop the PrefixResolver...
XPathExecutionContext::PrefixResolverSetAndRestore
theResolverSetAndRestore(
executionContext,
@@ -367,10 +380,6 @@
return numberlit(opPos, executionContext);
break;
- case XPathExpression::eOP_ARGUMENT:
- return arg(context, opPos, executionContext);
- break;
-
case XPathExpression::eOP_EXTFUNCTION:
return runExtFunction(context, opPos, executionContext);
break;
@@ -384,17 +393,77 @@
break;
case XPathExpression::eOP_FUNCTION_POSITION:
- return functionPositionGeneric(context, executionContext);
+ return
executionContext.getXObjectFactory().createNumber(functionPosition(context,
executionContext));
break;
case XPathExpression::eOP_FUNCTION_LAST:
- return functionLastGeneric(executionContext);
+ return
executionContext.getXObjectFactory().createNumber(functionLast(executionContext));
break;
case XPathExpression::eOP_FUNCTION_COUNT:
- return functionCountGeneric(context, opPos, executionContext);
+ return
executionContext.getXObjectFactory().createNumber(functionCount(context, opPos,
executionContext));
+ break;
+
+ case XPathExpression::eOP_FUNCTION_NOT:
+ return
executionContext.getXObjectFactory().createBoolean(functionNot(context, opPos,
executionContext));
+ break;
+
+ case XPathExpression::eOP_FUNCTION_TRUE:
+ return executionContext.getXObjectFactory().createBoolean(true);
+ break;
+
+ case XPathExpression::eOP_FUNCTION_FALSE:
+ return
executionContext.getXObjectFactory().createBoolean(false);
break;
+ case XPathExpression::eOP_FUNCTION_BOOLEAN:
+ return
executionContext.getXObjectFactory().createBoolean(functionBoolean(context,
opPos, executionContext));
+ break;
+
+ case XPathExpression::eOP_FUNCTION_NAME_0:
+ return
executionContext.getXObjectFactory().createStringReference(functionName(context));
+ break;
+
+ case XPathExpression::eOP_FUNCTION_NAME_1:
+ return
executionContext.getXObjectFactory().createStringReference(functionName(context,
opPos, executionContext));
+ break;
+
+ case XPathExpression::eOP_FUNCTION_LOCALNAME_0:
+ return
executionContext.getXObjectFactory().createStringReference(functionLocalName(context));
+ break;
+
+ case XPathExpression::eOP_FUNCTION_LOCALNAME_1:
+ return
executionContext.getXObjectFactory().createStringReference(functionLocalName(context,
opPos, executionContext));
+ break;
+
+ case XPathExpression::eOP_FUNCTION_FLOOR:
+ return
executionContext.getXObjectFactory().createNumber(functionFloor(context, opPos,
executionContext));
+ break;
+
+ case XPathExpression::eOP_FUNCTION_CEILING:
+ return
executionContext.getXObjectFactory().createNumber(functionCeiling(context,
opPos, executionContext));
+ break;
+
+ case XPathExpression::eOP_FUNCTION_ROUND:
+ return
executionContext.getXObjectFactory().createNumber(functionRound(context, opPos,
executionContext));
+ break;
+
+ case XPathExpression::eOP_FUNCTION_NUMBER_0:
+ return
executionContext.getXObjectFactory().createNumber(functionNumber(context,
executionContext));
+ break;
+
+ case XPathExpression::eOP_FUNCTION_NUMBER_1:
+ return
executionContext.getXObjectFactory().createNumber(functionNumber(context,
opPos, executionContext));
+ break;
+
+// case XPathExpression::eOP_FUNCTION_STRING_0:
+// return functionString(context);
+// break;
+
+// case XPathExpression::eOP_FUNCTION_STRING_1:
+// return functionString(context, opPos, executionContext);
+// break;
+
default:
unknownOpCodeError(context, executionContext, opPos);
break;
@@ -475,11 +544,11 @@
break;
case XPathExpression::eOP_UNION:
- result = Union(context, opPos, executionContext)->boolean();
+ Union(context, opPos, executionContext, result);
break;
case XPathExpression::eOP_LITERAL:
- result = literal(opPos, executionContext)->boolean();
+ literal(opPos, result);
break;
case XPathExpression::eOP_VARIABLE:
@@ -487,15 +556,11 @@
break;
case XPathExpression::eOP_GROUP:
- result = group(context, opPos, executionContext)->boolean();
+ group(context, opPos, executionContext, result);
break;
case XPathExpression::eOP_NUMBERLIT:
- result = XObject::boolean(numberlit(opPos));
- break;
-
- case XPathExpression::eOP_ARGUMENT:
- result = arg(context, opPos, executionContext)->boolean();
+ numberlit(opPos, result);
break;
case XPathExpression::eOP_EXTFUNCTION:
@@ -507,7 +572,7 @@
break;
case XPathExpression::eOP_LOCATIONPATH:
- result = locationPath(context, opPos,
executionContext)->boolean();
+ locationPath(context, opPos, executionContext, result);
break;
case XPathExpression::eOP_FUNCTION_POSITION:
@@ -522,6 +587,58 @@
result = XObject::boolean(functionCount(context, opPos,
executionContext));
break;
+ case XPathExpression::eOP_FUNCTION_NOT:
+ result = functionNot(context, opPos, executionContext);
+ break;
+
+ case XPathExpression::eOP_FUNCTION_TRUE:
+ result = true;
+ break;
+
+ case XPathExpression::eOP_FUNCTION_FALSE:
+ result = false;
+ break;
+
+ case XPathExpression::eOP_FUNCTION_BOOLEAN:
+ result = functionBoolean(context, opPos, executionContext);
+ break;
+
+ case XPathExpression::eOP_FUNCTION_NAME_0:
+ result = XObject::boolean(functionName(context));
+ break;
+
+ case XPathExpression::eOP_FUNCTION_NAME_1:
+ result = XObject::boolean(functionName(context, opPos,
executionContext));
+ break;
+
+ case XPathExpression::eOP_FUNCTION_LOCALNAME_0:
+ result = XObject::boolean(functionLocalName(context));
+ break;
+
+ case XPathExpression::eOP_FUNCTION_LOCALNAME_1:
+ result = XObject::boolean(functionLocalName(context, opPos,
executionContext));
+ break;
+
+ case XPathExpression::eOP_FUNCTION_FLOOR:
+ result = XObject::boolean(functionFloor(context, opPos,
executionContext));
+ break;
+
+ case XPathExpression::eOP_FUNCTION_CEILING:
+ result = XObject::boolean(functionCeiling(context, opPos,
executionContext));
+ break;
+
+ case XPathExpression::eOP_FUNCTION_ROUND:
+ result = XObject::boolean(functionRound(context, opPos,
executionContext));
+ break;
+
+ case XPathExpression::eOP_FUNCTION_NUMBER_0:
+ result = XObject::boolean(functionNumber(context,
executionContext));
+ break;
+
+ case XPathExpression::eOP_FUNCTION_NUMBER_1:
+ result = XObject::boolean(functionNumber(context, opPos,
executionContext));
+ break;
+
default:
unknownOpCodeError(context, executionContext, opPos);
break;
@@ -600,11 +717,11 @@
break;
case XPathExpression::eOP_UNION:
- result = Union(context, opPos, executionContext)->num();
+ Union(context, opPos, executionContext, result);
break;
case XPathExpression::eOP_LITERAL:
- result = literal(opPos, executionContext)->num();
+ literal(opPos, result);
break;
case XPathExpression::eOP_VARIABLE:
@@ -612,17 +729,13 @@
break;
case XPathExpression::eOP_GROUP:
- result = group(context, opPos, executionContext)->num();
+ group(context, opPos, executionContext, result);
break;
case XPathExpression::eOP_NUMBERLIT:
result = numberlit(opPos);
break;
- case XPathExpression::eOP_ARGUMENT:
- result = arg(context, opPos, executionContext)->num();
- break;
-
case XPathExpression::eOP_EXTFUNCTION:
result = runExtFunction(context, opPos,
executionContext)->num();
break;
@@ -632,7 +745,7 @@
break;
case XPathExpression::eOP_LOCATIONPATH:
- result = locationPath(context, opPos, executionContext)->num();
+ locationPath(context, opPos, executionContext, result);
break;
case XPathExpression::eOP_FUNCTION_POSITION:
@@ -647,6 +760,58 @@
result = functionCount(context, opPos, executionContext);
break;
+ case XPathExpression::eOP_FUNCTION_NOT:
+ result = XObject::number(functionNot(context, opPos,
executionContext));
+ break;
+
+ case XPathExpression::eOP_FUNCTION_TRUE:
+ result = XObject::number(true);
+ break;
+
+ case XPathExpression::eOP_FUNCTION_FALSE:
+ result = XObject::number(false);
+ break;
+
+ case XPathExpression::eOP_FUNCTION_BOOLEAN:
+ result = XObject::number(functionBoolean(context, opPos,
executionContext));
+ break;
+
+ case XPathExpression::eOP_FUNCTION_NAME_0:
+ result = XObject::number(functionName(context));
+ break;
+
+ case XPathExpression::eOP_FUNCTION_NAME_1:
+ result = XObject::number(functionName(context, opPos,
executionContext));
+ break;
+
+ case XPathExpression::eOP_FUNCTION_LOCALNAME_0:
+ result = XObject::number(functionLocalName(context));
+ break;
+
+ case XPathExpression::eOP_FUNCTION_LOCALNAME_1:
+ result = XObject::number(functionLocalName(context, opPos,
executionContext));
+ break;
+
+ case XPathExpression::eOP_FUNCTION_FLOOR:
+ result = functionFloor(context, opPos, executionContext);
+ break;
+
+ case XPathExpression::eOP_FUNCTION_CEILING:
+ result = functionCeiling(context, opPos, executionContext);
+ break;
+
+ case XPathExpression::eOP_FUNCTION_ROUND:
+ result = functionRound(context, opPos, executionContext);
+ break;
+
+ case XPathExpression::eOP_FUNCTION_NUMBER_0:
+ result = functionNumber(context, executionContext);
+ break;
+
+ case XPathExpression::eOP_FUNCTION_NUMBER_1:
+ result = functionNumber(context, opPos, executionContext);
+ break;
+
default:
unknownOpCodeError(context, executionContext, opPos);
break;
@@ -725,7 +890,7 @@
break;
case XPathExpression::eOP_UNION:
- Union(context, opPos, executionContext)->str(result);
+ Union(context, opPos, executionContext, result);
break;
case XPathExpression::eOP_LITERAL:
@@ -737,17 +902,13 @@
break;
case XPathExpression::eOP_GROUP:
- group(context, opPos, executionContext)->str(result);
+ group(context, opPos, executionContext, result);
break;
case XPathExpression::eOP_NUMBERLIT:
numberlit(opPos, result);
break;
- case XPathExpression::eOP_ARGUMENT:
- arg(context, opPos, executionContext)->str(result);
- break;
-
case XPathExpression::eOP_EXTFUNCTION:
runExtFunction(context, opPos, executionContext)->str(result);
break;
@@ -757,7 +918,7 @@
break;
case XPathExpression::eOP_LOCATIONPATH:
- locationPath(context, opPos, executionContext)->str(result);
+ locationPath(context, opPos, executionContext, result);
break;
case XPathExpression::eOP_FUNCTION_POSITION:
@@ -772,6 +933,58 @@
XObject::string(functionCount(context, opPos,
executionContext), result);
break;
+ case XPathExpression::eOP_FUNCTION_NOT:
+ XObject::string(functionNot(context, opPos, executionContext),
result);
+ break;
+
+ case XPathExpression::eOP_FUNCTION_TRUE:
+ XObject::string(true, result);
+ break;
+
+ case XPathExpression::eOP_FUNCTION_FALSE:
+ XObject::string(false, result);
+ break;
+
+ case XPathExpression::eOP_FUNCTION_BOOLEAN:
+ XObject::string(functionBoolean(context, opPos,
executionContext), result);
+ break;
+
+ case XPathExpression::eOP_FUNCTION_NAME_0:
+ result.append(functionName(context));
+ break;
+
+ case XPathExpression::eOP_FUNCTION_NAME_1:
+ result.append(functionName(context, opPos, executionContext));
+ break;
+
+ case XPathExpression::eOP_FUNCTION_LOCALNAME_0:
+ result.append(functionLocalName(context));
+ break;
+
+ case XPathExpression::eOP_FUNCTION_LOCALNAME_1:
+ result.append(functionLocalName(context, opPos,
executionContext));
+ break;
+
+ case XPathExpression::eOP_FUNCTION_FLOOR:
+ XObject::string(functionFloor(context, opPos,
executionContext), result);
+ break;
+
+ case XPathExpression::eOP_FUNCTION_CEILING:
+ XObject::string(functionCeiling(context, opPos,
executionContext), result);
+ break;
+
+ case XPathExpression::eOP_FUNCTION_ROUND:
+ XObject::string(functionRound(context, opPos,
executionContext), result);
+ break;
+
+ case XPathExpression::eOP_FUNCTION_NUMBER_0:
+ XObject::string(functionNumber(context, executionContext),
result);
+ break;
+
+ case XPathExpression::eOP_FUNCTION_NUMBER_1:
+ XObject::string(functionNumber(context, opPos,
executionContext), result);
+ break;
+
default:
unknownOpCodeError(context, executionContext, opPos);
break;
@@ -780,6 +993,17 @@
+inline void
+stringToCharacters(
+ const XalanDOMString& str,
+ FormatterListener&
formatterListener,
+ XPath::MemberFunctionPtr function)
+{
+ (formatterListener.*function)(str.c_str(), str.length());
+}
+
+
+
void
XPath::executeMore(
XalanNode* context,
@@ -875,7 +1099,7 @@
break;
case XPathExpression::eOP_UNION:
- Union(context, opPos, executionContext)->str(formatterListener,
function);
+ Union(context, opPos, executionContext, formatterListener,
function);
break;
case XPathExpression::eOP_LITERAL:
@@ -887,17 +1111,13 @@
break;
case XPathExpression::eOP_GROUP:
- group(context, opPos, executionContext)->str(formatterListener,
function);
+ group(context, opPos, executionContext, formatterListener,
function);
break;
case XPathExpression::eOP_NUMBERLIT:
numberlit(opPos, formatterListener, function);
break;
- case XPathExpression::eOP_ARGUMENT:
- arg(context, opPos, executionContext)->str(formatterListener,
function);
- break;
-
case XPathExpression::eOP_EXTFUNCTION:
runExtFunction(context, opPos,
executionContext)->str(formatterListener, function);
break;
@@ -922,6 +1142,58 @@
XObject::string(functionCount(context, opPos,
executionContext), formatterListener, function);
break;
+ case XPathExpression::eOP_FUNCTION_NOT:
+ XObject::string(functionNot(context, opPos, executionContext),
formatterListener, function);
+ break;
+
+ case XPathExpression::eOP_FUNCTION_TRUE:
+ XObject::string(true, formatterListener, function);
+ break;
+
+ case XPathExpression::eOP_FUNCTION_FALSE:
+ XObject::string(false, formatterListener, function);
+ break;
+
+ case XPathExpression::eOP_FUNCTION_BOOLEAN:
+ XObject::string(functionBoolean(context, opPos,
executionContext), formatterListener, function);
+ break;
+
+ case XPathExpression::eOP_FUNCTION_NAME_0:
+ stringToCharacters(functionName(context), formatterListener,
function);
+ break;
+
+ case XPathExpression::eOP_FUNCTION_NAME_1:
+ stringToCharacters(functionName(context, opPos,
executionContext), formatterListener, function);
+ break;
+
+ case XPathExpression::eOP_FUNCTION_LOCALNAME_0:
+ stringToCharacters(functionLocalName(context),
formatterListener, function);
+ break;
+
+ case XPathExpression::eOP_FUNCTION_LOCALNAME_1:
+ stringToCharacters(functionLocalName(context, opPos,
executionContext), formatterListener, function);
+ break;
+
+ case XPathExpression::eOP_FUNCTION_FLOOR:
+ XObject::string(functionFloor(context, opPos,
executionContext), formatterListener, function);
+ break;
+
+ case XPathExpression::eOP_FUNCTION_CEILING:
+ XObject::string(functionCeiling(context, opPos,
executionContext), formatterListener, function);
+ break;
+
+ case XPathExpression::eOP_FUNCTION_ROUND:
+ XObject::string(functionRound(context, opPos,
executionContext), formatterListener, function);
+ break;
+
+ case XPathExpression::eOP_FUNCTION_NUMBER_0:
+ XObject::string(functionNumber(context, executionContext),
formatterListener, function);
+ break;
+
+ case XPathExpression::eOP_FUNCTION_NUMBER_1:
+ XObject::string(functionNumber(context, opPos,
executionContext), formatterListener, function);
+ break;
+
default:
unknownOpCodeError(context, executionContext, opPos);
break;
@@ -964,6 +1236,25 @@
case XPathExpression::eOP_FUNCTION_POSITION:
case XPathExpression::eOP_FUNCTION_LAST:
case XPathExpression::eOP_FUNCTION_COUNT:
+ case XPathExpression::eOP_FUNCTION_NOT:
+ case XPathExpression::eOP_FUNCTION_TRUE:
+ case XPathExpression::eOP_FUNCTION_FALSE:
+ case XPathExpression::eOP_FUNCTION_BOOLEAN:
+ case XPathExpression::eOP_FUNCTION_NAME_0:
+ case XPathExpression::eOP_FUNCTION_NAME_1:
+ case XPathExpression::eOP_FUNCTION_LOCALNAME_0:
+ case XPathExpression::eOP_FUNCTION_LOCALNAME_1:
+ case XPathExpression::eOP_FUNCTION_FLOOR:
+ case XPathExpression::eOP_FUNCTION_CEILING:
+ case XPathExpression::eOP_FUNCTION_ROUND:
+ case XPathExpression::eOP_FUNCTION_NUMBER_0:
+ case XPathExpression::eOP_FUNCTION_NUMBER_1:
+ case XPathExpression::eOP_FUNCTION_STRING_0:
+ case XPathExpression::eOP_FUNCTION_STRING_1:
+ case XPathExpression::eOP_FUNCTION_STRINGLENGTH_0:
+ case XPathExpression::eOP_FUNCTION_STRINGLENGTH_1:
+ case XPathExpression::eOP_FUNCTION_NAMESPACEURI_0:
+ case XPathExpression::eOP_FUNCTION_NAMESPACEURI_1:
notNodeSetError(context, executionContext);
break;
@@ -979,10 +1270,6 @@
group(context, opPos, executionContext, result);
break;
- case XPathExpression::eOP_ARGUMENT:
- theXObject = arg(context, opPos, executionContext, result);
- break;
-
case XPathExpression::eOP_EXTFUNCTION:
theXObject = runExtFunction(context, opPos, executionContext);
break;
@@ -1724,6 +2011,79 @@
XalanNode* context,
int opPos,
XPathExecutionContext& executionContext,
+ bool& result) const
+{
+ typedef XPathExecutionContext::BorrowReturnMutableNodeRefList
BorrowReturnMutableNodeRefList;
+
+ BorrowReturnMutableNodeRefList resultNodeList(executionContext);
+
+ Union(context, opPos, executionContext, *resultNodeList);
+
+ result = XObject::boolean(*resultNodeList);
+}
+
+
+
+void
+XPath::Union(
+ XalanNode* context,
+ int opPos,
+ XPathExecutionContext& executionContext,
+ double& result) const
+{
+ typedef XPathExecutionContext::BorrowReturnMutableNodeRefList
BorrowReturnMutableNodeRefList;
+
+ BorrowReturnMutableNodeRefList resultNodeList(executionContext);
+
+ Union(context, opPos, executionContext, *resultNodeList);
+
+ result = XObject::number(executionContext, *resultNodeList);
+}
+
+
+
+void
+XPath::Union(
+ XalanNode* context,
+ int opPos,
+ XPathExecutionContext& executionContext,
+ XalanDOMString& result) const
+{
+ typedef XPathExecutionContext::BorrowReturnMutableNodeRefList
BorrowReturnMutableNodeRefList;
+
+ BorrowReturnMutableNodeRefList resultNodeList(executionContext);
+
+ Union(context, opPos, executionContext, *resultNodeList);
+
+ XObject::string(*resultNodeList, result);
+}
+
+
+
+void
+XPath::Union(
+ XalanNode* context,
+ int opPos,
+ XPathExecutionContext& executionContext,
+ FormatterListener& formatterListener,
+ MemberFunctionPtr function) const
+{
+ typedef XPathExecutionContext::BorrowReturnMutableNodeRefList
BorrowReturnMutableNodeRefList;
+
+ BorrowReturnMutableNodeRefList resultNodeList(executionContext);
+
+ Union(context, opPos, executionContext, *resultNodeList);
+
+ XObject::string(*resultNodeList, formatterListener, function);
+}
+
+
+
+void
+XPath::Union(
+ XalanNode* context,
+ int opPos,
+ XPathExecutionContext& executionContext,
MutableNodeRefList& result) const
{
assert(result.empty() == true);
@@ -1783,6 +2143,36 @@
void
XPath::literal(
+ int opPos,
+ bool& theResult) const
+{
+ assert(m_expression.m_opMap.size() > unsigned(opPos + 2));
+ assert(m_expression.m_tokenQueue.size() >
unsigned(m_expression.m_opMap[opPos + 2]));
+
+ const XToken& theLiteral =
m_expression.m_tokenQueue[m_expression.m_opMap[opPos + 2]];
+
+ theResult = theLiteral.boolean();
+}
+
+
+
+void
+XPath::literal(
+ int opPos,
+ double& theResult) const
+{
+ assert(m_expression.m_opMap.size() > unsigned(opPos + 2));
+ assert(m_expression.m_tokenQueue.size() >
unsigned(m_expression.m_opMap[opPos + 2]));
+
+ const XToken& theLiteral =
m_expression.m_tokenQueue[m_expression.m_opMap[opPos + 2]];
+
+ theResult = theLiteral.num();
+}
+
+
+
+void
+XPath::literal(
int opPos,
XalanDOMString& theString) const
{
@@ -1863,6 +2253,21 @@
void
XPath::numberlit(
+ int opPos,
+ bool& theResult) const
+{
+ assert(m_expression.m_opMap.size() > unsigned(opPos + 3));
+ assert(m_expression.m_tokenQueue.size() >
unsigned(m_expression.m_opMap[opPos + 3]));
+
+ const XToken& theLiteral =
m_expression.m_tokenQueue[m_expression.m_opMap[opPos + 3]];
+
+ theResult = theLiteral.boolean();
+}
+
+
+
+void
+XPath::numberlit(
int opPos,
XalanDOMString& theString) const
{
@@ -1916,7 +2321,7 @@
XalanNode* context,
int opPos,
XPathExecutionContext& executionContext,
- double& theResult) const
+ bool& theResult) const
{
assert(context != 0);
@@ -1926,14 +2331,27 @@
locationPath(context, opPos, executionContext, *mnl.get());
- // $$$ ToDo: Reduce this to a call on XObject...
- XPathExecutionContext::GetAndReleaseCachedString
theGuard(executionContext);
+ theResult = XObject::boolean(*mnl.get());
+}
- XalanDOMString& theString = theGuard.get();
- XObject::string(*mnl.get(), theString);
- theResult = XObject::number(theString);
+void
+XPath::locationPath(
+ XalanNode* context,
+ int opPos,
+ XPathExecutionContext& executionContext,
+ double& theResult) const
+{
+ assert(context != 0);
+
+ typedef XPathExecutionContext::BorrowReturnMutableNodeRefList
BorrowReturnMutableNodeRefList;
+
+ BorrowReturnMutableNodeRefList mnl(executionContext);
+
+ locationPath(context, opPos, executionContext, *mnl.get());
+
+ theResult = XObject::number(executionContext, *mnl.get());
}
@@ -1985,6 +2403,8 @@
int opPos,
XPathExecutionContext& executionContext) const
{
+ assert(context != 0);
+
const int endExtFunc = opPos + m_expression.m_opMap[opPos + 1] -
1;
opPos += 2;
@@ -2021,6 +2441,8 @@
int opPos,
XPathExecutionContext& executionContext) const
{
+ assert(context != 0);
+
const int endFunc = opPos + m_expression.m_opMap[opPos + 1] - 1;
opPos += 2;
@@ -2107,82 +2529,122 @@
double
-XPath::functionPosition(
+XPath::functionCount(
XalanNode* context,
+ int opPos,
XPathExecutionContext& executionContext) const
{
- if (context == 0)
+ assert(context != 0);
+
+ typedef XPathExecutionContext::BorrowReturnMutableNodeRefList
BorrowReturnMutableNodeRefList;
+
+ BorrowReturnMutableNodeRefList result(executionContext);
+
+ const XObjectPtr nodesetResult(executeMore(context, opPos + 2,
executionContext, *result));
+
+ if (nodesetResult.null() == false)
{
- executionContext.error(
- "The position() function requires a non-null
context node!",
- context,
- m_locator);
+ return nodesetResult->nodeset().getLength();
+ }
+ else
+ {
+ return result->getLength();
}
- return executionContext.getContextNodeListPosition(*context);
+ return executionContext.getContextNodeListLength();
}
-const XObjectPtr
-XPath::functionPositionGeneric(
+const XalanDOMString&
+XPath::functionName(
XalanNode* context,
+ int opPos,
XPathExecutionContext& executionContext) const
{
- return
executionContext.getXObjectFactory().createNumber(functionPosition(context,
executionContext));
-}
+ assert(context != 0);
+ typedef XPathExecutionContext::BorrowReturnMutableNodeRefList
BorrowReturnMutableNodeRefList;
+ BorrowReturnMutableNodeRefList result(executionContext);
-double
-XPath::functionLast(XPathExecutionContext& executionContext) const
-{
- return executionContext.getContextNodeListLength();
-}
+ const XObjectPtr nodesetResult(executeMore(context, opPos + 2,
executionContext, *result));
+ const NodeRefListBase* const theNodeList = nodesetResult.null() ==
false ?
+ &nodesetResult->nodeset() : &*result;
+ assert(theNodeList != 0);
+ if (theNodeList->getLength() == 0)
+ {
+ return s_emptyString;
+ }
+ else
+ {
+ assert(theNodeList->item(0) != 0);
-const XObjectPtr
-XPath::functionLastGeneric(XPathExecutionContext& executionContext) const
-{
- return
executionContext.getXObjectFactory().createNumber(functionLast(executionContext));
+ return functionName(theNodeList->item(0));
+ }
}
-double
-XPath::functionCount(
- XalanNode* context,
- int opPos,
- XPathExecutionContext& executionContext) const
+const XalanDOMString&
+XPath::functionLocalName(XalanNode* context) const
{
- typedef XPathExecutionContext::BorrowReturnMutableNodeRefList
BorrowReturnMutableNodeRefList;
+ assert(context != 0);
- BorrowReturnMutableNodeRefList result(executionContext);
+ const XalanDOMString* theResult = &s_emptyString;
- const XObjectPtr nodesetResult(executeMore(context, opPos + 2,
executionContext, *result));
+ const XalanNode::NodeType theType = context->getNodeType();
- if (nodesetResult.null() == false)
+ if(theType == XalanNode::ELEMENT_NODE ||
+ theType == XalanNode::PROCESSING_INSTRUCTION_NODE)
{
- return nodesetResult->nodeset().getLength();
+ theResult = &DOMServices::getLocalNameOfNode(*context);
}
- else
+ else if (theType == XalanNode::ATTRIBUTE_NODE)
{
- return result->getLength();
+ const XalanDOMString& theLocalName =
DOMServices::getLocalNameOfNode(*context);
+
+ if (theLocalName != DOMServices::s_XMLNamespace)
+ {
+ theResult = &theLocalName;
+ }
}
- return executionContext.getContextNodeListLength();
+ return *theResult;
}
-const XObjectPtr
-XPath::functionCountGeneric(
+const XalanDOMString&
+XPath::functionLocalName(
XalanNode* context,
int opPos,
XPathExecutionContext& executionContext) const
{
- return
executionContext.getXObjectFactory().createNumber(functionCount(context, opPos,
executionContext));
+ assert(context != 0);
+
+ typedef XPathExecutionContext::BorrowReturnMutableNodeRefList
BorrowReturnMutableNodeRefList;
+
+ BorrowReturnMutableNodeRefList result(executionContext);
+
+ const XObjectPtr nodesetResult(executeMore(context, opPos + 2,
executionContext, *result));
+
+ const NodeRefListBase* const theNodeList = nodesetResult.null() ==
false ?
+ &nodesetResult->nodeset() : &*result;
+ assert(theNodeList != 0);
+
+ if (theNodeList->getLength() == 0)
+ {
+ return s_emptyString;
+ }
+ else
+ {
+ assert(theNodeList->item(0) != 0);
+
+ return functionLocalName(theNodeList->item(0));
+ }
}
@@ -2341,15 +2803,17 @@
queryResults.setDocumentOrder();
}
- else if (mnl->getReverseDocumentOrder()
== true)
- {
-
mnl->reverseAssign(queryResults);
- }
+// else if (mnl->getReverseDocumentOrder()
== true)
+// {
+// queryResults.swap(*mnl);
+//
+// queryResults.reverse();
+// }
else
{
assert(mnl->getDocumentOrder()
== true);
- queryResults = *mnl;
+ queryResults.swap(*mnl);
}
}
}
@@ -2363,13 +2827,15 @@
}
else if (subQueryResults->getReverseDocumentOrder() == true)
{
- subQueryResults->reverseAssign(queryResults);
+ queryResults.swap(*subQueryResults);
+
+ queryResults.reverse();
}
else
{
assert(subQueryResults->getDocumentOrder() == true);
- queryResults = *subQueryResults;
+ queryResults.swap(*subQueryResults);
}
}
}
@@ -2425,12 +2891,12 @@
assert(context != 0);
- int argLen = 0;
+ int argLen = 0;
- eMatchScore score = eMatchScoreNone;
+ eMatchScore score = eMatchScoreNone;
- const int startOpPos = opPos;
- const int stepType = currentExpression.getOpCodeMapValue(opPos);
+ const int startOpPos = opPos;
+ const int stepType =
currentExpression.getOpCodeMapValue(opPos);
switch(stepType)
{
1.39 +404 -89 xml-xalan/c/src/XPath/XPath.hpp
Index: XPath.hpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XPath/XPath.hpp,v
retrieving revision 1.38
retrieving revision 1.39
diff -u -r1.38 -r1.39
--- XPath.hpp 2 Jan 2003 17:47:35 -0000 1.38
+++ XPath.hpp 3 Jan 2003 08:04:24 -0000 1.39
@@ -212,7 +212,7 @@
/**
* Execute the XPath from the provided context.
*
- * @param context current source tree context node
+ * @param context current source tree context node, which must
not be 0
* @param prefixResolver prefix resolver to use
* @param executionContext current execution context
* @return smart-pointer to result XObject
@@ -226,7 +226,7 @@
/**
* Execute the XPath from the provided context.
*
- * @param context current source tree context node
+ * @param context current source tree context node, which must
not be 0
* @param prefixResolver prefix resolver to use
* @param executionContext current execution context
* @param result the boolean result
@@ -241,7 +241,7 @@
/**
* Execute the XPath from the provided context.
*
- * @param context current source tree context node
+ * @param context current source tree context node, which must
not be 0
* @param prefixResolver prefix resolver to use
* @param executionContext current execution context
* @param result the numeric result
@@ -257,7 +257,7 @@
* Execute the XPath from the provided context. The
* result is appended to the supplied string.
*
- * @param context current source tree context node
+ * @param context current source tree context node, which must
not be 0
* @param prefixResolver prefix resolver to use
* @param executionContext current execution context
* @param result the string result
@@ -274,7 +274,7 @@
/**
* Execute the XPath from the provided context.
*
- * @param context current source tree context node
+ * @param context current source tree context node, which must
not be 0
* @param prefixResolver prefix resolver to use
* @param executionContext current execution context
* @param formatterListener the FormatterListener instance to receive
the result
@@ -301,7 +301,7 @@
* will be empty, and the result will be in the XObject
* instance returned.
*
- * @param context current source tree context node
+ * @param context current source tree context node, which must
not be 0
* @param prefixResolver prefix resolver to use
* @param executionContext current execution context
* @param result the node-set result
@@ -317,7 +317,7 @@
/**
* Execute the XPath from the provided context.
*
- * @param context current source tree context node
+ * @param context current source tree context node, which must
not be 0
* @param prefixResolver prefix resolver to use
* @param contextNodeList node list for current context
* @param executionContext current execution context
@@ -341,7 +341,7 @@
/**
* Execute the XPath from the provided context.
*
- * @param context current source tree context node
+ * @param context current source tree context node, which must
not be 0
* @param prefixResolver prefix resolver to use
* @param contextNodeList node list for current context
* @param executionContext current execution context
@@ -366,7 +366,7 @@
/**
* Execute the XPath from the provided context.
*
- * @param context current source tree context node
+ * @param context current source tree context node, which must
not be 0
* @param prefixResolver prefix resolver to use
* @param contextNodeList node list for current context
* @param executionContext current execution context
@@ -392,7 +392,7 @@
* Execute the XPath from the provided context. The
* result is appended to the supplied string.
*
- * @param context current source tree context node
+ * @param context current source tree context node, which must
not be 0
* @param prefixResolver prefix resolver to use
* @param contextNodeList node list for current context
* @param executionContext current execution context
@@ -417,7 +417,7 @@
/**
* Execute the XPath from the provided context.
*
- * @param context current source tree context node
+ * @param context current source tree context node, which must
not be 0
* @param prefixResolver prefix resolver to use
* @param contextNodeList node list for current context
* @param executionContext current execution context
@@ -454,7 +454,7 @@
* will be empty, and the result will be in the XObject
* instance returned.
*
- * @param context current source tree context node
+ * @param context current source tree context node, which must
not be 0
* @param prefixResolver prefix resolver to use
* @param contextNodeList node list for current context
* @param executionContext current execution context
@@ -478,9 +478,10 @@
}
/**
- * Execute the XPath from the provided context. The
- * prefix resolver must already be set in the
- * execution context.
+ * Execute the XPath from the provided context.
+ *
+ * The prefix resolver and current node must already
+ * be set execution context, and must not be 0.
*
* @param executionContext current execution context
* @return smart-pointer to result XObject
@@ -488,15 +489,17 @@
const XObjectPtr
execute(XPathExecutionContext& executionContext) const
{
+ assert(executionContext.getCurrentNode() != 0);
assert(executionContext.getPrefixResolver() != 0);
return executeMore(executionContext.getCurrentNode(), 0,
executionContext);
}
/**
- * Execute the XPath from the provided context. The
- * prefix resolver must already be set in the
- * execution context.
+ * Execute the XPath from the provided context.
+ *
+ * The prefix resolver and current node must already
+ * be set execution context, and must not be 0.
*
* @param executionContext current execution context
* @param result the boolean result
@@ -506,14 +509,16 @@
XPathExecutionContext& executionContext,
bool& result) const
{
+ assert(executionContext.getCurrentNode() != 0);
assert(executionContext.getPrefixResolver() != 0);
executeMore(executionContext.getCurrentNode(), 0,
executionContext, result);
}
/**
- * Execute the XPath from the provided context. The
- * prefix resolver must already be set in the
+ * Execute the XPath from the provided context.
+ *
+ * The prefix resolver must already be set in the
* execution context.
*
* @param executionContext current execution context
@@ -524,16 +529,18 @@
XPathExecutionContext& executionContext,
double& result) const
{
+ assert(executionContext.getCurrentNode() != 0);
assert(executionContext.getPrefixResolver() != 0);
executeMore(executionContext.getCurrentNode(), 0,
executionContext, result);
}
/**
- * Execute the XPath from the provided context. The
- * prefix resolver must already be set in the
- * execution context. The result is appended to the
- * supplied string.
+ * Execute the XPath from the provided context. The
+ * result is appended to the supplied string.
+ *
+ * The prefix resolver and current node must already
+ * be set execution context, and must not be 0.
*
* @param executionContext current execution context
* @param result the string result
@@ -543,15 +550,17 @@
XPathExecutionContext& executionContext,
XalanDOMString& result) const
{
+ assert(executionContext.getCurrentNode() != 0);
assert(executionContext.getPrefixResolver() != 0);
executeMore(executionContext.getCurrentNode(), 0,
executionContext, result);
}
/**
- * Execute the XPath from the provided context. The
- * prefix resolver must already be set in the
- * execution context.
+ * Execute the XPath from the provided context.
+ *
+ * The prefix resolver and current node must already
+ * be set execution context, and must not be 0.
*
* @param executionContext current execution context
* @param formatterListener the FormatterListener instance to receive
the result
@@ -563,6 +572,7 @@
FormatterListener& formatterListener,
MemberFunctionPtr function) const
{
+ assert(executionContext.getCurrentNode() != 0);
assert(executionContext.getPrefixResolver() != 0);
executeMore(executionContext.getCurrentNode(), 0,
executionContext, formatterListener, function);
@@ -581,8 +591,8 @@
* will be empty, and the result will be in the XObject
* instance returned.
*
- * The prefix resolver must already be set in the
- * execution context.
+ * The prefix resolver and current node must already
+ * be set execution context, and must not be 0.
*
* @param executionContext current execution context
* @return the node-set result, if the result was not returned in the
parameter
@@ -592,6 +602,7 @@
XPathExecutionContext& executionContext,
MutableNodeRefList& result) const
{
+ assert(executionContext.getCurrentNode() != 0);
assert(executionContext.getPrefixResolver() != 0);
return executeMore(executionContext.getCurrentNode(), 0,
executionContext, result);
@@ -866,10 +877,7 @@
XalanNode* context,
int opPos,
XPathExecutionContext& executionContext,
- MutableNodeRefList& theResult) const
- {
- step(executionContext, context, opPos + 2, theResult);
- }
+ bool& theResult)
const;
/**
* Execute a location path.
@@ -877,7 +885,7 @@
* @param context current source tree context node
* @param opPos current position in the m_opMap array
* @param executionContext current execution context
- * @param theResult the result as a number
+ * @param theResult the result as a node list
*/
void
locationPath(
@@ -887,13 +895,12 @@
double& theResult)
const;
/**
- * Execute a location path. The result is appended to the
- * supplied string.
+ * Execute a location path.
*
* @param context current source tree context node
* @param opPos current position in the m_opMap array
* @param executionContext current execution context
- * @param theResult the string
+ * @param theResult the result as a node list
*/
void
locationPath(
@@ -920,6 +927,24 @@
MemberFunctionPtr function) const;
/**
+ * Execute a location path.
+ *
+ * @param context current source tree context node
+ * @param opPos current position in the m_opMap array
+ * @param executionContext current execution context
+ * @param theResult the result as a node list
+ */
+ void
+ locationPath(
+ XalanNode* context,
+ int opPos,
+ XPathExecutionContext& executionContext,
+ MutableNodeRefList& theResult) const
+ {
+ step(executionContext, context, opPos + 2, theResult);
+ }
+
+ /**
* Execute the XPath from the provided context.
*
* @param context current source tree context node
@@ -1317,6 +1342,68 @@
/**
* Computes the union of its operands which must be node-sets.
+ *
+ * @param context The current source tree context node.
+ * @param opPos The current position in the m_opMap array.
+ * @param executionContext current execution context
+ * @result the result of the union of node-set operands.
+ */
+ void
+ Union(
+ XalanNode* context,
+ int opPos,
+ XPathExecutionContext& executionContext,
+ bool& result) const;
+
+ /**
+ * Computes the union of its operands which must be node-sets.
+ *
+ * @param context The current source tree context node.
+ * @param opPos The current position in the m_opMap array.
+ * @param executionContext current execution context
+ * @result the result of the union of node-set operands.
+ */
+ void
+ Union(
+ XalanNode* context,
+ int opPos,
+ XPathExecutionContext& executionContext,
+ double& result) const;
+
+ /**
+ * Computes the union of its operands which must be node-sets.
+ *
+ * @param context The current source tree context node.
+ * @param opPos The current position in the m_opMap array.
+ * @param executionContext current execution context
+ * @result the result of the union of node-set operands.
+ */
+ void
+ Union(
+ XalanNode* context,
+ int opPos,
+ XPathExecutionContext& executionContext,
+ XalanDOMString& result) const;
+
+ /**
+ * Computes the union of its operands which must be node-sets.
+ *
+ * @param context The current source tree context node.
+ * @param opPos The current position in the m_opMap array.
+ * @param executionContext current execution context
+ * @param formatterListener the FormatterListener instance to receive
the result
+ * @param function A pointer to the member function of
FormatterListener to call
+ */
+ void
+ Union(
+ XalanNode* context,
+ int opPos,
+ XPathExecutionContext& executionContext,
+ FormatterListener& formatterListener,
+ MemberFunctionPtr function) const;
+
+ /**
+ * Computes the union of its operands which must be node-sets.
* @param context The current source tree context node.
* @param opPos The current position in the m_opMap array.
* @param executionContext current execution context
@@ -1341,6 +1428,28 @@
XPathExecutionContext& executionContext) const;
/**
+ * Get a literal value as a boolean.
+ *
+ * @param opPos The current position in the m_opMap array.
+ * @param theResult The value.
+ */
+ void
+ literal(
+ int opPos,
+ bool& theResult) const;
+
+ /**
+ * Get a literal value as a number.
+ *
+ * @param opPos The current position in the m_opMap array.
+ * @param theResult The value.
+ */
+ void
+ literal(
+ int opPos,
+ double& theResult) const;
+
+ /**
* Get a literal value. The value is appended to the
* supplied string.
*
@@ -1403,6 +1512,77 @@
XalanNode* context,
int opPos,
XPathExecutionContext& executionContext,
+ bool& theResult) const
+ {
+ executeMore(context, opPos + 2, executionContext, theResult);
+ }
+
+ /**
+ * Execute an expression as a group.
+ * @param context The current source tree context node.
+ * @param opPos The current position in the m_opMap array.
+ * @param executionContext current execution context
+ * @param theResult The result of the execution
+ */
+ void
+ group(
+ XalanNode* context,
+ int opPos,
+ XPathExecutionContext& executionContext,
+ double& theResult) const
+ {
+ executeMore(context, opPos + 2, executionContext, theResult);
+ }
+
+ /**
+ * Execute an expression as a group.
+ * @param context The current source tree context node.
+ * @param opPos The current position in the m_opMap array.
+ * @param executionContext current execution context
+ * @param theResult The result of the execution
+ */
+ void
+ group(
+ XalanNode* context,
+ int opPos,
+ XPathExecutionContext& executionContext,
+ XalanDOMString& theResult) const
+ {
+ executeMore(context, opPos + 2, executionContext, theResult);
+ }
+
+ /**
+ * Execute an expression as a group.
+ *
+ * @param context The current source tree context node.
+ * @param opPos The current position in the m_opMap array.
+ * @param executionContext current execution context
+ * @param formatterListener the FormatterListener instance to receive
the result
+ * @param function A pointer to the member function of
FormatterListener to call
+ */
+ void
+ group(
+ XalanNode* context,
+ int opPos,
+ XPathExecutionContext& executionContext,
+ FormatterListener& formatterListener,
+ MemberFunctionPtr function) const
+ {
+ executeMore(context, opPos + 2, executionContext,
formatterListener, function);
+ }
+
+ /**
+ * Execute an expression as a group.
+ * @param context The current source tree context node.
+ * @param opPos The current position in the m_opMap array.
+ * @param executionContext current execution context
+ * @param theResult The result of the execution
+ */
+ void
+ group(
+ XalanNode* context,
+ int opPos,
+ XPathExecutionContext& executionContext,
MutableNodeRefList& theResult) const
{
executeMore(context, opPos + 2, executionContext, theResult);
@@ -1427,6 +1607,17 @@
XPathExecutionContext& executionContext) const;
/**
+ * Get a literal value as a boolean.
+ *
+ * @param opPos The current position in the m_opMap array.
+ * @param theResult The string.
+ */
+ void
+ numberlit(
+ int opPos,
+ bool& theResult) const;
+
+ /**
* Get a literal value. The value is appended to the
* supplied string.
*
@@ -1452,41 +1643,6 @@
MemberFunctionPtr function) const;
/**
- * Execute a function argument.
- *
- * @param context The current source tree context node.
- * @param opPos The current position in the m_opMap array.
- * @param executionContext current execution context
- * @return the result of the argument expression.
- */
- const XObjectPtr
- arg(
- XalanNode* context,
- int opPos,
- XPathExecutionContext& executionContext) const
- {
- return executeMore(context, opPos + 2, executionContext);
- }
-
- /**
- * Execute a function argument.
- * @param context The current source tree context node.
- * @param opPos The current position in the m_opMap array.
- * @param executionContext current execution context
- * @param the result of the argument expression.
- * @result the result of the argument expression.
- */
- const XObjectPtr
- arg(
- XalanNode* context,
- int opPos,
- XPathExecutionContext& executionContext,
- MutableNodeRefList& result) const
- {
- return executeMore(context, opPos + 2, executionContext,
result);
- }
-
- /**
* Setup for and run an extension function.
* @param context The current source tree context node.
* @param opPos The current position in the m_opMap array.
@@ -1559,68 +1715,227 @@
/**
* Handle the built-in function "position".
*
- * @param context The current source tree context node.
+ * @param context The current source tree context node, which must not
be 0.
* @param executionContext current execution context
* @return the result of the function.
*/
double
functionPosition(
XalanNode* context,
- XPathExecutionContext& executionContext) const;
+ XPathExecutionContext& executionContext) const
+ {
+ assert(context != 0);
+
+ return executionContext.getContextNodeListPosition(*context);
+ }
/**
- * Handle the built-in function "position".
+ * Handle the built-in function "last".
+ *
+ * @param executionContext current execution context
+ * @return the result of the function.
+ */
+ double
+ functionLast(XPathExecutionContext& executionContext) const
+ {
+ return executionContext.getContextNodeListLength();
+ }
+
+ /**
+ * Handle the built-in function "count".
*
* @param context The current source tree context node.
+ * @param opPos The current position in the m_opMap array.
* @param executionContext current execution context
* @return the result of the function.
*/
- const XObjectPtr
- functionPositionGeneric(
+ double
+ functionCount(
XalanNode* context,
+ int opPos,
XPathExecutionContext& executionContext) const;
/**
- * Handle the built-in function "last".
+ * Handle the built-in function "not".
*
+ * @param context The current source tree context node, which must not
be 0.
+ * @param opPos The current position in the m_opMap array.
* @param executionContext current execution context
* @return the result of the function.
*/
- double
- functionLast(XPathExecutionContext& executionContext) const;
+ bool
+ functionNot(
+ XalanNode* context,
+ int opPos,
+ XPathExecutionContext& executionContext) const
+ {
+ assert(context != 0);
+
+ return !functionBoolean(context, opPos, executionContext);
+ }
/**
- * Handle the built-in function "last".
+ * Handle the built-in function "boolean".
*
+ * @param context The current source tree context node, which must not
be 0.
+ * @param opPos The current position in the m_opMap array.
* @param executionContext current execution context
* @return the result of the function.
*/
- const XObjectPtr
- functionLastGeneric(XPathExecutionContext& executionContext) const;
+ bool
+ functionBoolean(
+ XalanNode* context,
+ int opPos,
+ XPathExecutionContext& executionContext) const
+ {
+ assert(context != 0);
+
+ bool result;
+
+ executeMore(context, opPos + 2, executionContext, result);
+
+ return result;
+ }
/**
- * Handle the built-in function "count".
+ * Handle the built-in function "name".
*
+ * @param context The current source tree context node, which must not
be 0.
+ * @return the result of the function.
+ */
+ const XalanDOMString&
+ functionName(XalanNode* context) const
+ {
+ assert(context != 0);
+
+ return DOMServices::getNameOfNode(*context);
+ }
+
+ /**
+ * Handle the built-in function "name".
+ *
+ * @param context The current source tree context node, which must not
be 0.
+ * @param opPos The current position in the m_opMap array.
* @param executionContext current execution context
* @return the result of the function.
*/
- double
- functionCount(
+ const XalanDOMString&
+ functionName(
XalanNode* context,
int opPos,
XPathExecutionContext& executionContext) const;
/**
- * Handle the built-in function "count".
+ * Handle the built-in function "local-name".
+ *
+ * @param context The current source tree context node, which must not
be 0.
+ * @return the result of the function.
+ */
+ const XalanDOMString&
+ functionLocalName(XalanNode* context) const;
+
+ /**
+ * Handle the built-in function "local-name".
*
+ * @param context The current source tree context node, which must not
be 0.
+ * @param opPos The current position in the m_opMap array.
* @param executionContext current execution context
* @return the result of the function.
*/
- const XObjectPtr
- functionCountGeneric(
+ const XalanDOMString&
+ functionLocalName(
XalanNode* context,
int opPos,
XPathExecutionContext& executionContext) const;
+
+ /**
+ * Handle the built-in function "number".
+ *
+ * @param context The current source tree context node, which must not
be 0.
+ * @param executionContext current execution context
+ * @return the result of the function.
+ */
+ double
+ functionNumber(
+ XalanNode* context,
+ XPathExecutionContext& executionContext) const
+ {
+ assert(context != 0);
+
+ return XObject::number(executionContext, *context);
+ }
+
+ /**
+ * Handle the built-in function "number".
+ *
+ * @param context The current source tree context node, which must not
be 0.
+ * @param opPos The current position in the m_opMap array.
+ * @param executionContext current execution context
+ * @return the result of the function.
+ */
+ double
+ functionNumber(
+ XalanNode* context,
+ int opPos,
+ XPathExecutionContext& executionContext) const
+ {
+ double result;
+
+ executeMore(context, opPos + 2, executionContext, result);
+
+ return result;
+ }
+
+ /**
+ * Handle the built-in function "floor".
+ *
+ * @param context The current source tree context node, which must not
be 0.
+ * @param opPos The current position in the m_opMap array.
+ * @param executionContext current execution context
+ * @return the result of the function.
+ */
+ double
+ functionFloor(
+ XalanNode* context,
+ int opPos,
+ XPathExecutionContext& executionContext) const
+ {
+ return DoubleSupport::floor(functionNumber(context, opPos,
executionContext));
+ }
+
+ /**
+ * Handle the built-in function "ceiling".
+ *
+ * @param context The current source tree context node, which must not
be 0.
+ * @param opPos The current position in the m_opMap array.
+ * @param executionContext current execution context
+ * @return the result of the function.
+ */
+ double
+ functionCeiling(
+ XalanNode* context,
+ int opPos,
+ XPathExecutionContext& executionContext) const
+ {
+ return DoubleSupport::ceiling(functionNumber(context, opPos,
executionContext));
+ }
+
+ /**
+ * Handle the built-in function "round".
+ *
+ * @param context The current source tree context node, which must not
be 0.
+ * @param opPos The current position in the m_opMap array.
+ * @param executionContext current execution context
+ * @return the result of the function.
+ */
+ double
+ functionRound(
+ XalanNode* context,
+ int opPos,
+ XPathExecutionContext& executionContext) const
+ {
+ return DoubleSupport::round(functionNumber(context, opPos,
executionContext));
+ }
/**
* Get a numeric operand for an expression.
1.43 +19 -0 xml-xalan/c/src/XPath/XPathExpression.cpp
Index: XPathExpression.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XPath/XPathExpression.cpp,v
retrieving revision 1.42
retrieving revision 1.43
diff -u -r1.42 -r1.43
--- XPathExpression.cpp 2 Jan 2003 17:39:09 -0000 1.42
+++ XPathExpression.cpp 3 Jan 2003 08:04:24 -0000 1.43
@@ -172,6 +172,25 @@
XPathExpression::s_opCodeMapLengthIndex + 1,
XPathExpression::s_opCodeMapLengthIndex + 1,
XPathExpression::s_opCodeMapLengthIndex + 1,
+ XPathExpression::s_opCodeMapLengthIndex + 1,
+ XPathExpression::s_opCodeMapLengthIndex + 1,
+ XPathExpression::s_opCodeMapLengthIndex + 1,
+ XPathExpression::s_opCodeMapLengthIndex + 1,
+ XPathExpression::s_opCodeMapLengthIndex + 1,
+ XPathExpression::s_opCodeMapLengthIndex + 1,
+ XPathExpression::s_opCodeMapLengthIndex + 1,
+ XPathExpression::s_opCodeMapLengthIndex + 1,
+ XPathExpression::s_opCodeMapLengthIndex + 1,
+ XPathExpression::s_opCodeMapLengthIndex + 1,
+ XPathExpression::s_opCodeMapLengthIndex + 1,
+ XPathExpression::s_opCodeMapLengthIndex + 1,
+ XPathExpression::s_opCodeMapLengthIndex + 1,
+ XPathExpression::s_opCodeMapLengthIndex + 1,
+ XPathExpression::s_opCodeMapLengthIndex + 1,
+ XPathExpression::s_opCodeMapLengthIndex + 1,
+ XPathExpression::s_opCodeMapLengthIndex + 1,
+ XPathExpression::s_opCodeMapLengthIndex + 1,
+ XPathExpression::s_opCodeMapLengthIndex + 1,
XPathExpression::s_opCodeMapLengthIndex + 1
};
1.33 +21 -48 xml-xalan/c/src/XPath/XPathExpression.hpp
Index: XPathExpression.hpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XPath/XPathExpression.hpp,v
retrieving revision 1.32
retrieving revision 1.33
diff -u -r1.32 -r1.33
--- XPathExpression.hpp 2 Jan 2003 17:39:09 -0000 1.32
+++ XPathExpression.hpp 3 Jan 2003 08:04:24 -0000 1.33
@@ -578,58 +578,31 @@
eOP_PREDICATE_WITH_POSITION = 55,
/**
- * [OP_FUNCTION_POSITION]
- * [length]
- * [FUNC_ID]
- * [arg count]
- * {OP_ARGUMENT}*
- * [ENDOP]
- *
- * returns:
- * XNodeSet
- * XNumber
- * XString
- * XBoolean
- * XRTree
- * XObject
+ * These are values for intrinsic functions which
+ * have been compiled directly into the op map.
*/
eOP_FUNCTION_POSITION = 56,
-
- /**
- * [OP_FUNCTION_POSITION]
- * [length]
- * [FUNC_ID]
- * [arg count]
- * {OP_ARGUMENT}*
- * [ENDOP]
- *
- * returns:
- * XNodeSet
- * XNumber
- * XString
- * XBoolean
- * XRTree
- * XObject
- */
eOP_FUNCTION_LAST = 57,
-
- /**
- * [OP_FUNCTION_POSITION]
- * [length]
- * [FUNC_ID]
- * [arg count]
- * {OP_ARGUMENT}*
- * [ENDOP]
- *
- * returns:
- * XNodeSet
- * XNumber
- * XString
- * XBoolean
- * XRTree
- * XObject
- */
eOP_FUNCTION_COUNT = 58,
+ eOP_FUNCTION_NOT = 59,
+ eOP_FUNCTION_TRUE = 60,
+ eOP_FUNCTION_FALSE = 61,
+ eOP_FUNCTION_BOOLEAN = 62,
+ eOP_FUNCTION_NAME_0 = 63,
+ eOP_FUNCTION_NAME_1 = 64,
+ eOP_FUNCTION_LOCALNAME_0 = 65,
+ eOP_FUNCTION_LOCALNAME_1 = 66,
+ eOP_FUNCTION_FLOOR = 67,
+ eOP_FUNCTION_CEILING = 68,
+ eOP_FUNCTION_ROUND = 69,
+ eOP_FUNCTION_NUMBER_0 = 70,
+ eOP_FUNCTION_NUMBER_1 = 71,
+ eOP_FUNCTION_STRING_0 = 72,
+ eOP_FUNCTION_STRING_1 = 73,
+ eOP_FUNCTION_STRINGLENGTH_0 = 74,
+ eOP_FUNCTION_STRINGLENGTH_1 = 75,
+ eOP_FUNCTION_NAMESPACEURI_0 = 76,
+ eOP_FUNCTION_NAMESPACEURI_1 = 77,
// Always add _before_ this one and update
// s_opCodeLengthArray.
1.67 +390 -50 xml-xalan/c/src/XPath/XPathProcessorImpl.cpp
Index: XPathProcessorImpl.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XPath/XPathProcessorImpl.cpp,v
retrieving revision 1.66
retrieving revision 1.67
diff -u -r1.66 -r1.67
--- XPathProcessorImpl.cpp 2 Jan 2003 17:39:09 -0000 1.66
+++ XPathProcessorImpl.cpp 3 Jan 2003 08:04:24 -0000 1.67
@@ -883,9 +883,7 @@
void
-XPathProcessorImpl::error(
- const XalanDOMString& msg,
- XalanNode* /* sourceNode
*/) const
+XPathProcessorImpl::error(const XalanDOMString& msg) const
{
const XPathConstructionContext::GetAndReleaseCachedString
theGuard(*m_constructionContext);
@@ -919,33 +917,7 @@
thePrintWriter.print(theCurrentPattern);
- thePrintWriter.print("'");
-
- if (m_locator != 0)
- {
- const XalanDOMChar* const theSystemID =
- m_locator->getSystemId();
-
- thePrintWriter.print("(");
-
- if (theSystemID == 0)
- {
- thePrintWriter.print("Unknown URI");
- }
- else
- {
- thePrintWriter.print(theSystemID);
- }
-
- thePrintWriter.print(", ");
-
thePrintWriter.print(m_locator->getLineNumber());
- thePrintWriter.print(", ");
-
thePrintWriter.print(m_locator->getColumnNumber());
-
- thePrintWriter.print(")");
- }
-
- thePrintWriter.println();
+ thePrintWriter.println("'");
}
// Back up one token, since we've consumed one...
@@ -982,11 +954,9 @@
void
-XPathProcessorImpl::error(
- const char* msg,
- XalanNode* sourceNode) const
+XPathProcessorImpl::error(const char* msg) const
{
- error(TranscodeFromLocalCodePage(msg), sourceNode);
+ error(TranscodeFromLocalCodePage(msg));
}
@@ -1535,10 +1505,6 @@
{
assert(m_expression != 0);
- const int opPos = m_expression->opCodeMapLength();
-
- m_expression->appendOpCode(XPathExpression::eOP_ARGUMENT);
-
if (m_requireLiterals == false ||
isCurrentLiteral() == true)
{
@@ -1548,9 +1514,6 @@
{
error(TranscodeFromLocalCodePage("A literal argument is
required."));
}
-
- m_expression->updateOpCodeLength(XPathExpression::eOP_ARGUMENT,
- opPos);
}
@@ -1657,6 +1620,58 @@
FunctionCount();
break;
+ case XPathExpression::eOP_FUNCTION_NOT:
+ FunctionNot();
+ break;
+
+ case XPathExpression::eOP_FUNCTION_TRUE:
+ FunctionTrue();
+ break;
+
+ case XPathExpression::eOP_FUNCTION_FALSE:
+ FunctionFalse();
+ break;
+
+ case XPathExpression::eOP_FUNCTION_BOOLEAN:
+ FunctionBoolean();
+ break;
+
+ case XPathExpression::eOP_FUNCTION_NAME_0:
+ FunctionName(opPos);
+ break;
+
+ case XPathExpression::eOP_FUNCTION_LOCALNAME_0:
+ FunctionLocalName(opPos);
+ break;
+
+ case XPathExpression::eOP_FUNCTION_NUMBER_0:
+ FunctionNumber(opPos);
+ break;
+
+ case XPathExpression::eOP_FUNCTION_FLOOR:
+ FunctionFloor();
+ break;
+
+ case XPathExpression::eOP_FUNCTION_CEILING:
+ FunctionCeiling();
+ break;
+
+ case XPathExpression::eOP_FUNCTION_ROUND:
+ FunctionRound();
+ break;
+
+ case XPathExpression::eOP_FUNCTION_STRING_0:
+ FunctionString(opPos);
+ break;
+
+ case XPathExpression::eOP_FUNCTION_STRINGLENGTH_0:
+ FunctionStringLength(opPos);
+ break;
+
+ case XPathExpression::eOP_FUNCTION_NAMESPACEURI_0:
+ FunctionNamespaceURI(opPos);
+ break;
+
default:
{
// The position must be at least zero, since
@@ -1775,6 +1790,313 @@
void
+XPathProcessorImpl::FunctionNot()
+{
+ m_expression->appendOpCode(XPathExpression::eOP_FUNCTION_NOT);
+
+ // Consume the name...
+ nextToken();
+
+ // Get the arguments, and the argument count...
+ const int argCount = FunctionCallArguments();
+
+ if (argCount != 1)
+ {
+ error("The not() function takes one arguments");
+ }
+}
+
+
+
+void
+XPathProcessorImpl::FunctionTrue()
+{
+ m_expression->appendOpCode(XPathExpression::eOP_FUNCTION_TRUE);
+
+ // Consume the name...
+ nextToken();
+
+ // Get the arguments, and the argument count...
+ const int argCount = FunctionCallArguments();
+
+ if (argCount != 0)
+ {
+ error("The true() function does not accept any arguments");
+ }
+}
+
+
+
+void
+XPathProcessorImpl::FunctionFalse()
+{
+ m_expression->appendOpCode(XPathExpression::eOP_FUNCTION_FALSE);
+
+ // Consume the name...
+ nextToken();
+
+ // Get the arguments, and the argument count...
+ const int argCount = FunctionCallArguments();
+
+ if (argCount != 0)
+ {
+ error("The false() function does not accept any arguments");
+ }
+}
+
+
+
+void
+XPathProcessorImpl::FunctionBoolean()
+{
+ m_expression->appendOpCode(XPathExpression::eOP_FUNCTION_BOOLEAN);
+
+ // Consume the name...
+ nextToken();
+
+ // Get the arguments, and the argument count...
+ const int argCount = FunctionCallArguments();
+
+ if (argCount != 1)
+ {
+ error("The boolean() function takes one arguments");
+ }
+}
+
+
+
+void
+XPathProcessorImpl::FunctionName(int opPos)
+{
+ m_expression->appendOpCode(XPathExpression::eOP_FUNCTION_NAME_0);
+
+ // Consume the name...
+ nextToken();
+
+ // Get the arguments, and the argument count...
+ const int argCount = FunctionCallArguments();
+
+ if (argCount != 0)
+ {
+ if (argCount == 1)
+ {
+ m_expression->replaceOpCode(
+ opPos,
+ XPathExpression::eOP_FUNCTION_NAME_0,
+ XPathExpression::eOP_FUNCTION_NAME_1);
+ }
+ else
+ {
+ error("The name() function takes zero or one
argument(s)");
+ }
+ }
+}
+
+
+
+void
+XPathProcessorImpl::FunctionLocalName(int opPos)
+{
+ m_expression->appendOpCode(XPathExpression::eOP_FUNCTION_LOCALNAME_0);
+
+ // Consume the name...
+ nextToken();
+
+ // Get the arguments, and the argument count...
+ const int argCount = FunctionCallArguments();
+
+ if (argCount != 0)
+ {
+ if (argCount == 1)
+ {
+ m_expression->replaceOpCode(
+ opPos,
+ XPathExpression::eOP_FUNCTION_LOCALNAME_0,
+ XPathExpression::eOP_FUNCTION_LOCALNAME_1);
+ }
+ else
+ {
+ error("The locale-name() function takes zero or one
argument(s)");
+ }
+ }
+}
+
+
+
+void
+XPathProcessorImpl::FunctionNumber(int opPos)
+{
+ m_expression->appendOpCode(XPathExpression::eOP_FUNCTION_NUMBER_0);
+
+ // Consume the name...
+ nextToken();
+
+ // Get the arguments, and the argument count...
+ const int argCount = FunctionCallArguments();
+
+ if (argCount != 0)
+ {
+ if (argCount == 1)
+ {
+ m_expression->replaceOpCode(
+ opPos,
+ XPathExpression::eOP_FUNCTION_NUMBER_0,
+ XPathExpression::eOP_FUNCTION_NUMBER_1);
+ }
+ else
+ {
+ error("The number() function takes zero or one
argument(s)");
+ }
+ }
+}
+
+
+
+void
+XPathProcessorImpl::FunctionFloor()
+{
+ m_expression->appendOpCode(XPathExpression::eOP_FUNCTION_FLOOR);
+
+ // Consume the name...
+ nextToken();
+
+ // Get the arguments, and the argument count...
+ const int argCount = FunctionCallArguments();
+
+ if (argCount != 1)
+ {
+ error("The floor() function accepts one argument");
+ }
+}
+
+
+
+void
+XPathProcessorImpl::FunctionCeiling()
+{
+ m_expression->appendOpCode(XPathExpression::eOP_FUNCTION_CEILING);
+
+ // Consume the name...
+ nextToken();
+
+ // Get the arguments, and the argument count...
+ const int argCount = FunctionCallArguments();
+
+ if (argCount != 1)
+ {
+ error("The ceiling() function accepts one argument");
+ }
+}
+
+
+
+void
+XPathProcessorImpl::FunctionRound()
+{
+ m_expression->appendOpCode(XPathExpression::eOP_FUNCTION_ROUND);
+
+ // Consume the name...
+ nextToken();
+
+ // Get the arguments, and the argument count...
+ const int argCount = FunctionCallArguments();
+
+ if (argCount != 1)
+ {
+ error("The round() function accepts one argument");
+ }
+}
+
+
+
+void
+XPathProcessorImpl::FunctionString(int opPos)
+{
+ m_expression->appendOpCode(XPathExpression::eOP_FUNCTION_STRING_0);
+
+ // Consume the name...
+ nextToken();
+
+ // Get the arguments, and the argument count...
+ const int argCount = FunctionCallArguments();
+
+ if (argCount != 0)
+ {
+ if (argCount == 1)
+ {
+ m_expression->replaceOpCode(
+ opPos,
+ XPathExpression::eOP_FUNCTION_STRING_0,
+ XPathExpression::eOP_FUNCTION_STRING_1);
+ }
+ else
+ {
+ error("The string() function takes zero or one
argument(s)");
+ }
+ }
+}
+
+
+
+void
+XPathProcessorImpl::FunctionStringLength(int opPos)
+{
+
m_expression->appendOpCode(XPathExpression::eOP_FUNCTION_STRINGLENGTH_0);
+
+ // Consume the name...
+ nextToken();
+
+ // Get the arguments, and the argument count...
+ const int argCount = FunctionCallArguments();
+
+ if (argCount != 0)
+ {
+ if (argCount == 1)
+ {
+ m_expression->replaceOpCode(
+ opPos,
+ XPathExpression::eOP_FUNCTION_STRINGLENGTH_0,
+ XPathExpression::eOP_FUNCTION_STRINGLENGTH_1);
+ }
+ else
+ {
+ error("The string-length() function takes zero or one
argument(s)");
+ }
+ }
+}
+
+
+
+void
+XPathProcessorImpl::FunctionNamespaceURI(int opPos)
+{
+
m_expression->appendOpCode(XPathExpression::eOP_FUNCTION_NAMESPACEURI_0);
+
+ // Consume the name...
+ nextToken();
+
+ // Get the arguments, and the argument count...
+ const int argCount = FunctionCallArguments();
+
+ if (argCount != 0)
+ {
+ if (argCount == 1)
+ {
+ m_expression->replaceOpCode(
+ opPos,
+ XPathExpression::eOP_FUNCTION_NAMESPACEURI_0,
+ XPathExpression::eOP_FUNCTION_NAMESPACEURI_1);
+ }
+ else
+ {
+ error("The namespace-uri() function takes zero or one
argument(s)");
+ }
+ }
+}
+
+
+
+void
XPathProcessorImpl::LocationPath()
{
const int opPos = m_expression->opCodeMapLength();
@@ -1783,20 +2105,23 @@
if(tokenIs(XalanUnicode::charSolidus) == true)
{
- const int newOpPos = m_expression->opCodeMapLength();
+ nextToken();
- // Tell how long the step is without the predicate
- const XPathExpression::OpCodeMapValueVectorType
theArgs(1, 4);
+ const int newOpPos = m_expression->opCodeMapLength();
- m_expression->appendOpCode(XPathExpression::eFROM_ROOT,
- theArgs);
+// if (tokenIs(XalanUnicode::charSolidus) == false)
+ {
+ // Tell how long the step is without the predicate
+ const XPathExpression::OpCodeMapValueVectorType
theArgs(1, 4);
- m_expression->appendOpCode(XPathExpression::eNODETYPE_ROOT);
+ m_expression->appendOpCode(XPathExpression::eFROM_ROOT,
+
theArgs);
- // Tell how long the entire step is.
- m_expression->updateOpCodeLength(newOpPos);
+
m_expression->appendOpCode(XPathExpression::eNODETYPE_ROOT);
- nextToken();
+ // Tell how long the entire step is.
+ m_expression->updateOpCodeLength(newOpPos);
+ }
}
if(length(m_token) != 0)
@@ -1856,6 +2181,11 @@
{
nextToken();
+ if(tokenIs(XalanUnicode::charLeftSquareBracket) == true)
+ {
+ error("'..[predicate]' or '.[predicate]' is illegal
syntax. Use 'self::node()[predicate]' instead.");
+ }
+
// Tell how long the step is without the predicate
const XPathExpression::OpCodeMapValueVectorType
theArgs(1, 4);
@@ -2984,12 +3314,22 @@
const XPathProcessorImpl::TableEntry XPathProcessorImpl::s_functionTable[] =
{
+ { XPathFunctionTable::s_not, XPathExpression::eOP_FUNCTION_NOT },
{ XPathProcessorImpl::s_lastString, XPathExpression::eOP_FUNCTION_LAST
},
+ { XPathFunctionTable::s_name, XPathExpression::eOP_FUNCTION_NAME_0 },
{ XPathProcessorImpl::s_nodeString, XPathExpression::eNODETYPE_NODE },
{ XPathProcessorImpl::s_textString, XPathExpression::eNODETYPE_TEXT },
+ { XPathFunctionTable::s_true, XPathExpression::eOP_FUNCTION_TRUE },
{ XPathFunctionTable::s_count, XPathExpression::eOP_FUNCTION_COUNT },
+ { XPathFunctionTable::s_false, XPathExpression::eOP_FUNCTION_FALSE },
+ { XPathFunctionTable::s_floor, XPathExpression::eOP_FUNCTION_FLOOR },
+ { XPathFunctionTable::s_round, XPathExpression::eOP_FUNCTION_ROUND },
+ { XPathFunctionTable::s_number, XPathExpression::eOP_FUNCTION_NUMBER_0
},
+ { XPathFunctionTable::s_boolean, XPathExpression::eOP_FUNCTION_BOOLEAN
},
+ { XPathFunctionTable::s_ceiling, XPathExpression::eOP_FUNCTION_CEILING
},
{ XPathProcessorImpl::s_commentString,
XPathExpression::eNODETYPE_COMMENT },
{ XPathProcessorImpl::s_positionString,
XPathExpression::eOP_FUNCTION_POSITION },
+ { XPathFunctionTable::s_localName,
XPathExpression::eOP_FUNCTION_LOCALNAME_0 },
{ XPathProcessorImpl::s_piString, XPathExpression::eNODETYPE_PI },
};
1.30 +42 -7 xml-xalan/c/src/XPath/XPathProcessorImpl.hpp
Index: XPathProcessorImpl.hpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XPath/XPathProcessorImpl.hpp,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -r1.29 -r1.30
--- XPathProcessorImpl.hpp 2 Jan 2003 17:39:09 -0000 1.29
+++ XPathProcessorImpl.hpp 3 Jan 2003 08:04:24 -0000 1.30
@@ -303,7 +303,7 @@
lookbehind(
char c,
int n) const;
-
+
/**
* look behind the current token in order to
* see if there is a useable token.
@@ -377,17 +377,13 @@
* Throw an exception using the provided message text.
*/
void
- error(
- const XalanDOMString& msg,
- XalanNode* sourceNode = 0)
const;
+ error(const XalanDOMString& msg) const;
/**
* Throw an exception using the provided message text.
*/
void
- error(
- const char* msg,
- XalanNode* sourceNode = 0) const;
+ error(const char* msg) const;
/**
* Given a string, return the corresponding token.
@@ -590,6 +586,45 @@
void
FunctionCount();
+
+ void
+ FunctionNot();
+
+ void
+ FunctionTrue();
+
+ void
+ FunctionFalse();
+
+ void
+ FunctionBoolean();
+
+ void
+ FunctionName(int opPos);
+
+ void
+ FunctionLocalName(int opPos);
+
+ void
+ FunctionNumber(int opPos);
+
+ void
+ FunctionFloor();
+
+ void
+ FunctionCeiling();
+
+ void
+ FunctionRound();
+
+ void
+ FunctionString(int opPos);
+
+ void
+ FunctionStringLength(int opPos);
+
+ void
+ FunctionNamespaceURI(int opPos);
/**
*
--------------------------------------------------------------------------------
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]