sboag 99/12/12 23:56:48
Modified: src/org/apache/xalan/xpath XPathProcessorImpl.java
Log:
Fixed order of evaluation for relational and equality operators.
Revision Changes Path
1.11 +36 -18
xml-xalan/src/org/apache/xalan/xpath/XPathProcessorImpl.java
Index: XPathProcessorImpl.java
===================================================================
RCS file:
/home/cvs/xml-xalan/src/org/apache/xalan/xpath/XPathProcessorImpl.java,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- XPathProcessorImpl.java 1999/12/03 08:43:12 1.10
+++ XPathProcessorImpl.java 1999/12/13 07:56:47 1.11
@@ -1403,7 +1403,7 @@
throws org.xml.sax.SAXException
{
int opPos = m_xpath.m_opMap[m_xpath.MAPINDEX_LENGTH];
- EqualityExpr();
+ EqualityExpr(-1);
if((null != m_token) && tokenIs("and"))
{
nextToken();
@@ -1422,29 +1422,38 @@
| EqualityExpr '=' RelationalExpr
*
--------------------------------------------------------------------------------
*/
- protected void EqualityExpr()
+ protected int EqualityExpr(int addPos)
throws org.xml.sax.SAXException
{
int opPos = m_xpath.m_opMap[m_xpath.MAPINDEX_LENGTH];
- RelationalExpr();
+ if(-1 == addPos)
+ addPos = opPos;
+ RelationalExpr(-1);
if(null != m_token)
{
if(tokenIs('!') && lookahead('=', 1))
{
nextToken();
nextToken();
- insertOp(opPos, 2, m_xpath.OP_NOTEQUALS);
- EqualityExpr();
- m_xpath.m_opMap[opPos + m_xpath.MAPINDEX_LENGTH] =
m_xpath.m_opMap[m_xpath.MAPINDEX_LENGTH] - opPos;
+ insertOp(addPos, 2, m_xpath.OP_NOTEQUALS);
+ int opPlusLeftHandLen = m_xpath.m_opMap[m_xpath.MAPINDEX_LENGTH] -
addPos;
+ addPos = EqualityExpr(addPos);
+ m_xpath.m_opMap[addPos + m_xpath.MAPINDEX_LENGTH]
+ = m_xpath.m_opMap[addPos+opPlusLeftHandLen+1] + opPlusLeftHandLen;
+ addPos+=2;
}
else if(tokenIs('='))
{
nextToken();
- insertOp(opPos, 2, m_xpath.OP_EQUALS);
- EqualityExpr();
- m_xpath.m_opMap[opPos + m_xpath.MAPINDEX_LENGTH] =
m_xpath.m_opMap[m_xpath.MAPINDEX_LENGTH] - opPos;
+ insertOp(addPos, 2, m_xpath.OP_EQUALS);
+ int opPlusLeftHandLen = m_xpath.m_opMap[m_xpath.MAPINDEX_LENGTH] -
addPos;
+ addPos = EqualityExpr(addPos);
+ m_xpath.m_opMap[addPos + m_xpath.MAPINDEX_LENGTH]
+ = m_xpath.m_opMap[addPos+opPlusLeftHandLen+1] + opPlusLeftHandLen;
+ addPos+=2;
}
}
+ return addPos;
}
/**
@@ -1459,10 +1468,12 @@
| RelationalExpr '>=' AdditiveExpr
*
--------------------------------------------------------------------------------
*/
- protected void RelationalExpr()
+ protected int RelationalExpr(int addPos)
throws org.xml.sax.SAXException
{
int opPos = m_xpath.m_opMap[m_xpath.MAPINDEX_LENGTH];
+ if(-1 == addPos)
+ addPos = opPos;
AdditiveExpr(-1);
if(null != m_token)
{
@@ -1472,14 +1483,17 @@
if(tokenIs('='))
{
nextToken();
- insertOp(opPos, 2, m_xpath.OP_LTE);
+ insertOp(addPos, 2, m_xpath.OP_LTE);
}
else
{
- insertOp(opPos, 2, m_xpath.OP_LT);
+ insertOp(addPos, 2, m_xpath.OP_LT);
}
- RelationalExpr();
- m_xpath.m_opMap[opPos + m_xpath.MAPINDEX_LENGTH] =
m_xpath.m_opMap[m_xpath.MAPINDEX_LENGTH] - opPos;
+ int opPlusLeftHandLen = m_xpath.m_opMap[m_xpath.MAPINDEX_LENGTH] -
addPos;
+ addPos = RelationalExpr(addPos);
+ m_xpath.m_opMap[addPos + m_xpath.MAPINDEX_LENGTH]
+ = m_xpath.m_opMap[addPos+opPlusLeftHandLen+1] + opPlusLeftHandLen;
+ addPos+=2;
}
else if(tokenIs('>'))
{
@@ -1487,16 +1501,20 @@
if(tokenIs('='))
{
nextToken();
- insertOp(opPos, 2, m_xpath.OP_GTE);
+ insertOp(addPos, 2, m_xpath.OP_GTE);
}
else
{
- insertOp(opPos, 2, m_xpath.OP_GT);
+ insertOp(addPos, 2, m_xpath.OP_GT);
}
- RelationalExpr();
- m_xpath.m_opMap[opPos + m_xpath.MAPINDEX_LENGTH] =
m_xpath.m_opMap[m_xpath.MAPINDEX_LENGTH] - opPos;
+ int opPlusLeftHandLen = m_xpath.m_opMap[m_xpath.MAPINDEX_LENGTH] -
addPos;
+ addPos = RelationalExpr(addPos);
+ m_xpath.m_opMap[addPos + m_xpath.MAPINDEX_LENGTH]
+ = m_xpath.m_opMap[addPos+opPlusLeftHandLen+1] + opPlusLeftHandLen;
+ addPos+=2;
}
}
+ return addPos;
}
/**