diff --git a/mozilla/extensions/transformiix/source/xpath/AttributeExpr.cpp b/mozilla/extensions/transformiix/source/xpath/AttributeExpr.cpp index a975c479adb..013aca7a038 100644 --- a/mozilla/extensions/transformiix/source/xpath/AttributeExpr.cpp +++ b/mozilla/extensions/transformiix/source/xpath/AttributeExpr.cpp @@ -21,28 +21,29 @@ * Keith Visco, kvisco@ziplink.net * -- original author. * - * $Id: AttributeExpr.cpp,v 1.2 2001-01-12 20:06:30 axel%pike.org Exp $ + * $Id: AttributeExpr.cpp,v 1.3 2001-01-22 09:36:12 kvisco%ziplink.net Exp $ */ #include "Expr.h" -/** - * This class represents a ElementExpr as defined by the XSL - * Working Draft - * @author Keith Visco - * @version $Revision: 1.2 $ $Date: 2001-01-12 20:06:30 $ -**/ +/* + This class represents a Attribute Expression as defined by the XPath + 1.0 Recommendation +*/ + +const String AttributeExpr::WILD_CARD = "*"; //- Constructors -/ AttributeExpr::AttributeExpr() { - this->isWild = MB_FALSE; + this->isNameWild = MB_FALSE; + this->isNamespaceWild = MB_FALSE; } //-- AttributeExpr AttributeExpr::AttributeExpr(String& name) { - //-- copy name - this->name = name; - this->isWild = MB_FALSE; + this->isNameWild = MB_FALSE; + this->isNamespaceWild = MB_FALSE; + setName(name); } //-- AttributeExpr /** @@ -68,13 +69,17 @@ ExprResult* AttributeExpr::evaluate(Node* context, ContextState* cs) { if ( !context ) return nodeSet; NamedNodeMap* atts = context->getAttributes(); if ( atts ) { - for (UInt32 i = 0; i < atts->getLength(); i++ ) { - Attr* attr = (Attr*)atts->item(i); - if ( isWild ) nodeSet->add(attr); - else { - String attName = attr->getName(); - if ( name.isEqual(attName) ){ + UInt32 i = 0; + if ( isNameWild && isNamespaceWild ) { + for ( ; i < atts->getLength(); i++ ) + nodeSet->add(atts->item(i)); + } + else { + for ( ; i < atts->getLength(); i++ ) { + Node* attr = atts->item(i); + if (matches(attr, context, cs)) { nodeSet->add(attr); + if (!isNameWild) break; } } } @@ -101,12 +106,30 @@ const String& AttributeExpr::getName() { } //-- getName void AttributeExpr::setName(const String& name) { - this->name.clear(); - this->name.append(name); + + if (name.isEqual(WILD_CARD)) { + this->isNameWild = MB_TRUE; + this->isNamespaceWild = MB_TRUE; + return; + } + + int idx = name.indexOf(':'); + if ( idx >= 0 ) + name.subString(0,idx, this->prefix); + else + idx = -1; + + name.subString(idx+1, this->name); + + //-- set flags + this->isNamespaceWild = MB_FALSE; + this->isNameWild = this->name.isEqual(WILD_CARD); + } //-- setName void AttributeExpr::setWild(MBool isWild) { - this->isWild = isWild; + this->isNameWild = isWild; + this->isNamespaceWild = isWild; } //-- setWild //-----------------------------/ //- Methods from NodeExpr.cpp -/ @@ -125,9 +148,33 @@ short AttributeExpr::getType() { * the given context **/ MBool AttributeExpr::matches(Node* node, Node* context, ContextState* cs) { - if ( (node) && (node->getNodeType() == Node::ATTRIBUTE_NODE) ) { - if ( isWild ) return MB_TRUE; - const String nodeName = ((Attr*)node)->getName(); + + if ( (!node) || (node->getNodeType() != Node::ATTRIBUTE_NODE) ) + return MB_FALSE; + + if ( isNameWild && isNamespaceWild ) return MB_TRUE; + + const String nodeName = ((Attr*)node)->getName(); + int idx = nodeName.indexOf(':'); + if (idx >= 0) { + String prefixForNode; + nodeName.subString(0,idx,prefixForNode); + String localName; + nodeName.subString(idx+1, localName); + if (isNamespaceWild) return localName.isEqual(this->name); + String nsForNode; + Node* parent = cs->getParentNode(node); + if (parent) XMLDOMUtils::getNameSpace(prefixForNode, (Element*)parent, nsForNode); + String nsForTest; + cs->getNameSpaceURIFromPrefix(this->prefix,nsForTest); + if (!nsForTest.isEqual(nsForNode)) return MB_FALSE; + return localName.isEqual(this->name); + } + else { + if (isNamespaceWild) return nodeName.isEqual(this->name); + String nsForTest; + cs->getNameSpaceURIFromPrefix(this->prefix, nsForTest); + if (nsForTest.length() > 0) return MB_FALSE; return nodeName.isEqual(this->name); } return MB_FALSE; @@ -144,7 +191,11 @@ MBool AttributeExpr::matches(Node* node, Node* context, ContextState* cs) { **/ void AttributeExpr::toString(String& dest) { dest.append('@'); - if (isWild) dest.append('*'); - else dest.append(this->name); + if (isNameWild && isNamespaceWild) dest.append('*'); + else { + dest.append(this->prefix); + dest.append(':'); + dest.append(this->name); + } } //-- toString diff --git a/mozilla/extensions/transformiix/source/xpath/BooleanFunctionCall.cpp b/mozilla/extensions/transformiix/source/xpath/BooleanFunctionCall.cpp index 1304b575b7d..7ff92d805fe 100644 --- a/mozilla/extensions/transformiix/source/xpath/BooleanFunctionCall.cpp +++ b/mozilla/extensions/transformiix/source/xpath/BooleanFunctionCall.cpp @@ -24,7 +24,7 @@ * Marina Mechtcheriakova, mmarina@mindspring.com * -- added lang() implementation * - * $Id: BooleanFunctionCall.cpp,v 1.5 2000-06-11 11:41:34 Peter.VanderBeken%pandora.be Exp $ + * $Id: BooleanFunctionCall.cpp,v 1.6 2001-01-22 09:36:13 kvisco%ziplink.net Exp $ */ #include "FunctionLib.h" @@ -32,7 +32,7 @@ /** * Creates a default BooleanFunctionCall, which always evaluates to False * @author Keith Visco - * @version $Revision: 1.5 $ $Date: 2000-06-11 11:41:34 $ + * @version $Revision: 1.6 $ $Date: 2001-01-22 09:36:13 $ **/ BooleanFunctionCall::BooleanFunctionCall() : FunctionCall(XPathNames::FALSE_FN) { this->type = TX_FALSE; @@ -72,7 +72,7 @@ BooleanFunctionCall::BooleanFunctionCall(short type) : FunctionCall() **/ ExprResult* BooleanFunctionCall::evaluate(Node* context, ContextState* cs) { - BooleanResult* result = new BooleanResult(); + MBool result = MB_FALSE; ListIterator* iter = params.iterator(); int argc = params.getLength(); Expr* param = 0; @@ -84,7 +84,7 @@ ExprResult* BooleanFunctionCall::evaluate(Node* context, ContextState* cs) { if ( requireParams(1,1,cs) ) { param = (Expr*)iter->next(); ExprResult* exprResult = param->evaluate(context, cs); - result->setValue(exprResult->booleanValue()); + result = exprResult->booleanValue(); delete exprResult; } break; @@ -95,25 +95,24 @@ ExprResult* BooleanFunctionCall::evaluate(Node* context, ContextState* cs) { lang = ((Element*)context)->getAttribute(LANG_ATTR); arg1.toUpperCase(); // case-insensitive comparison lang.toUpperCase(); - result->setValue((MBool)(lang.indexOf(arg1) == 0)); + result = (MBool)(lang.indexOf(arg1) == 0); } break; case TX_NOT : if ( requireParams(1,1,cs) ) { param = (Expr*)iter->next(); ExprResult* exprResult = param->evaluate(context, cs); - result->setValue(!exprResult->booleanValue()); + result = (MBool)(!exprResult->booleanValue()); delete exprResult; } break; case TX_TRUE : - result->setValue(MB_TRUE); + result = MB_TRUE; break; default: - result->setValue(MB_FALSE); break; } delete iter; - return result; + return new BooleanResult(result); } //-- evaluate diff --git a/mozilla/extensions/transformiix/source/xpath/BooleanResult.cpp b/mozilla/extensions/transformiix/source/xpath/BooleanResult.cpp index 989bca87047..487eb246242 100644 --- a/mozilla/extensions/transformiix/source/xpath/BooleanResult.cpp +++ b/mozilla/extensions/transformiix/source/xpath/BooleanResult.cpp @@ -21,14 +21,12 @@ * Keith Visco, kvisco@ziplink.net * -- original author. * - * $Id: BooleanResult.cpp,v 1.5 2000-06-11 11:41:38 Peter.VanderBeken%pandora.be Exp $ + * $Id: BooleanResult.cpp,v 1.6 2001-01-22 09:36:14 kvisco%ziplink.net Exp $ */ -/** +/* * Boolean Expression result - * @author Keith Visco - * @version $Revision: 1.5 $ $Date: 2000-06-11 11:41:38 $ -**/ +*/ #include "ExprResult.h" @@ -59,22 +57,6 @@ MBool BooleanResult::getValue() const { return this->value; } //-- getValue -/** - * Sets the value of this BooleanResult - * @param boolean the MBool to use for this BooleanResult's value -**/ -void BooleanResult::setValue(MBool boolean) { - this->value = boolean; -} //-- setValue - -/** - * Sets the value of this BooleanResult - * @param boolResult the BooleanResult to use for setting this BooleanResult's value -**/ -void BooleanResult::setValue(const BooleanResult& boolResult) { - this->value = boolResult.getValue(); -} //-- setValue - /* * Virtual Methods from ExprResult */ diff --git a/mozilla/extensions/transformiix/source/xpath/ElementExpr.cpp b/mozilla/extensions/transformiix/source/xpath/ElementExpr.cpp index ad9ab6c4b69..0c9fb5864c8 100644 --- a/mozilla/extensions/transformiix/source/xpath/ElementExpr.cpp +++ b/mozilla/extensions/transformiix/source/xpath/ElementExpr.cpp @@ -21,7 +21,7 @@ * Keith Visco, kvisco@ziplink.net * -- original author. * - * $Id: ElementExpr.cpp,v 1.3 2001-01-12 20:06:31 axel%pike.org Exp $ + * $Id: ElementExpr.cpp,v 1.4 2001-01-22 09:36:14 kvisco%ziplink.net Exp $ */ #include "Expr.h" @@ -41,21 +41,7 @@ ElementExpr::ElementExpr() { } //-- ElementExpr ElementExpr::ElementExpr(String& name) { - //-- copy name - int idx = name.indexOf(':'); - if ( idx >= 0 ) - name.subString(0,idx, this->prefix); - else - idx = -1; - name.subString(idx+1, this->name); - - //-- set flags - this->isNamespaceWild = (this->prefix.length() == 0); - - //-- I know...this should be done is WildCardExpr or someplace - //-- else but I need a fix for now. - this->isNameWild = this->name.isEqual(WILD_CARD); - + setName(name); } //-- ElementExpr /** @@ -97,6 +83,7 @@ ExprResult* ElementExpr::evaluate(Node* context, ContextState* cs) { * ContextState then Negative Infinity is returned. **/ double ElementExpr::getDefaultPriority(Node* node, Node* context, ContextState* cs) { + if (isNameWild) return -0.5; return 0.0; } //-- getDefaultPriority @@ -109,8 +96,16 @@ const String& ElementExpr::getName() { } //-- getName void ElementExpr::setName(const String& name) { - this->name.clear(); - this->name.append(name); + int idx = name.indexOf(':'); + if ( idx >= 0 ) + name.subString(0,idx, this->prefix); + else + idx = -1; + name.subString(idx+1, this->name); + + //-- set flags + this->isNameWild = this->name.isEqual(WILD_CARD); + this->isNamespaceWild = (isNameWild && (this->prefix.length() == 0)); } //-- setName @@ -131,38 +126,39 @@ short ElementExpr::getType() { * the given context **/ MBool ElementExpr::matches(Node* node, Node* context, ContextState* cs) { - if ( node) { - if ( node->getNodeType() == Node::ELEMENT_NODE ) { - const String nodeName = node->getNodeName(); - int idx = nodeName.indexOf(':'); + if ((!node) || (node->getNodeType() != Node::ELEMENT_NODE )) + return MB_FALSE; - if (!isNamespaceWild) { - //-- compare namespaces - String nsURI; - cs->getNameSpaceURIFromPrefix(this->prefix, nsURI); + if (isNamespaceWild && isNameWild) return MB_TRUE; - String nsURI2; - String prefix2; - if (idx > 0) nodeName.subString(0, idx, prefix2); - cs->getNameSpaceURIFromPrefix(prefix2, nsURI2); + const String nodeName = node->getNodeName(); - if (!nsURI.isEqual(nsURI2)) return MB_FALSE; + int idx = nodeName.indexOf(':'); - } + if (!isNamespaceWild) { + //-- compare namespaces + String nsURI; + // use context to get namespace for testing against + cs->getNameSpaceURIFromPrefix(this->prefix, nsURI); - if (this->isNameWild) return MB_TRUE; + String nsURI2; + String prefix2; + if (idx > 0) nodeName.subString(0, idx, prefix2); + // use source tree to aquire namespace for node + XMLDOMUtils::getNameSpace(prefix2, (Element*) node, nsURI2); - //-- compare local names - if (idx < 0) return nodeName.isEqual(this->name); - else { - String local; - nodeName.subString(idx+1, local); - return local.isEqual(this->name); - } - } + if (!nsURI.isEqual(nsURI2)) return MB_FALSE; + } + + if (this->isNameWild) return MB_TRUE; + //-- compare local names + if (idx < 0) return nodeName.isEqual(this->name); + else { + String local; + nodeName.subString(idx+1, local); + return local.isEqual(this->name); } - return MB_FALSE; } //-- matches diff --git a/mozilla/extensions/transformiix/source/xpath/Expr.h b/mozilla/extensions/transformiix/source/xpath/Expr.h index ec1129e8782..525c8bcdaa2 100644 --- a/mozilla/extensions/transformiix/source/xpath/Expr.h +++ b/mozilla/extensions/transformiix/source/xpath/Expr.h @@ -25,7 +25,7 @@ * - changed constant short declarations in many of the classes * with enumerations, commented with //--LF * - * $Id: Expr.h,v 1.8 2000-11-07 10:49:06 kvisco%ziplink.net Exp $ + * $Id: Expr.h,v 1.9 2001-01-22 09:36:14 kvisco%ziplink.net Exp $ */ @@ -41,11 +41,12 @@ #include "MITREObject.h" #include "primitives.h" #include "NamespaceResolver.h" +#include "XMLDOMUtils.h" /* XPath class definitions. Much of this code was ported from XSL:P. - @version $Revision: 1.8 $ $Date: 2000-11-07 10:49:06 $ + @version $Revision: 1.9 $ $Date: 2001-01-22 09:36:14 $ */ #ifndef TRANSFRMX_EXPR_H @@ -489,8 +490,13 @@ public: private: + static const String WILD_CARD; + + String prefix; String name; - MBool isWild; + MBool isNameWild; + MBool isNamespaceWild; + }; //-- AttributeExpr @@ -773,61 +779,6 @@ public: }; //-- TextExpr -/** - * This class represents a WildCardExpr as defined by the XSL - * Working Draft -**/ -class WildCardExpr : public NodeExpr { - -public: - - //------------------/ - //- Public Methods -/ - //------------------/ - - /** - * Evaluates this Expr based on the given context node and processor state - * @param context the context node for evaluation of this Expr - * @param ps the ContextState containing the stack information needed - * for evaluation - * @return the result of the evaluation - **/ - virtual ExprResult* evaluate(Node* context, ContextState* cs); - - /** - * Returns the default priority of this Pattern based on the given Node, - * context Node, and ContextState. - * If this pattern does not match the given Node under the current context Node and - * ContextState then Negative Infinity is returned. - **/ - virtual double getDefaultPriority(Node* node, Node* context, ContextState* cs); - - /** - * Returns the type of this NodeExpr - * @return the type of this NodeExpr - **/ - virtual short getType(); - - /** - * Determines whether this NodeExpr matches the given node within - * the given context - **/ - virtual MBool matches(Node* node, Node* context, ContextState* cs); - - - /** - * Returns the String representation of this NodeExpr. - * @param dest the String to use when creating the String - * representation. The String representation will be appended to - * any data in the destination String, to allow cascading calls to - * other #toString() methods for Expressions. - * @return the String representation of this NodeExpr. - **/ - virtual void toString(String& dest); - -}; //-- WildCardExpr - - /** * Represents an ordered list of Predicates, * for use with Step and Filter Expressions @@ -1088,7 +1039,7 @@ public: private: - NumberResult numberResult; + double _value; }; /** diff --git a/mozilla/extensions/transformiix/source/xpath/ExprLexer.cpp b/mozilla/extensions/transformiix/source/xpath/ExprLexer.cpp index 8202753f15b..ea4bc9a6a8e 100644 --- a/mozilla/extensions/transformiix/source/xpath/ExprLexer.cpp +++ b/mozilla/extensions/transformiix/source/xpath/ExprLexer.cpp @@ -29,13 +29,13 @@ * -- Fixed bug in parse method so that we make sure we check for * axis identifier wild cards, such as ancestor::* * - * $Id: ExprLexer.cpp,v 1.10 2001-01-12 20:06:31 axel%pike.org Exp $ + * $Id: ExprLexer.cpp,v 1.11 2001-01-22 09:36:15 kvisco%ziplink.net Exp $ */ /** * Lexical analyzer for XPath expressions * @author Keith Visco - * @version $Revision: 1.10 $ $Date: 2001-01-12 20:06:31 $ + * @version $Revision: 1.11 $ $Date: 2001-01-22 09:36:15 $ **/ #include "ExprLexer.h" @@ -367,9 +367,6 @@ MBool ExprLexer::matchDelimiter(UNICODE_CHAR ch) { case VERT_BAR: tokenType = Token::UNION_OP; break; - case ASTERIX: - tokenType = Token::WILD_CARD; - break; case AT_SIGN: tokenType = Token::AT_SIGN; break; @@ -669,7 +666,8 @@ void ExprLexer::parse(const String& pattern) { case Token::NULL_TOKEN: case Token::L_PAREN: case Token::L_BRACKET: - matchDelimiter(ch); + tokenBuffer.append(ch); + //matchDelimiter(ch); break; default: if ( isOperatorToken(prevToken) ) { diff --git a/mozilla/extensions/transformiix/source/xpath/ExprLexer.h b/mozilla/extensions/transformiix/source/xpath/ExprLexer.h index e4dffa00a0f..f27db56a3d8 100644 --- a/mozilla/extensions/transformiix/source/xpath/ExprLexer.h +++ b/mozilla/extensions/transformiix/source/xpath/ExprLexer.h @@ -25,7 +25,7 @@ * -- changed constant short declarations in Token and ExprLexer to * enumerations, commented with //--LF * - * $Id: ExprLexer.h,v 1.4 2001-01-12 20:06:32 axel%pike.org Exp $ + * $Id: ExprLexer.h,v 1.5 2001-01-22 09:36:16 kvisco%ziplink.net Exp $ */ @@ -44,7 +44,7 @@ * This class was ported from XSL:P, an open source Java based * XSLT processor, written by yours truly. * @author Keith Visco - * @version $Revision: 1.4 $ $Date: 2001-01-12 20:06:32 $ + * @version $Revision: 1.5 $ $Date: 2001-01-22 09:36:16 $ **/ class Token { @@ -69,7 +69,6 @@ public: R_BRACKET, COMMA, FUNCTION_NAME, - WILD_CARD, AT_SIGN, VAR_REFERENCE, PARENT_NODE, diff --git a/mozilla/extensions/transformiix/source/xpath/ExprParser.cpp b/mozilla/extensions/transformiix/source/xpath/ExprParser.cpp index 604165621f8..de3d746a2ad 100644 --- a/mozilla/extensions/transformiix/source/xpath/ExprParser.cpp +++ b/mozilla/extensions/transformiix/source/xpath/ExprParser.cpp @@ -30,7 +30,7 @@ * -- fixed bug in ::parsePredicates, * made sure we continue looking for more predicates. * - * $Id: ExprParser.cpp,v 1.7 2001-01-12 20:06:32 axel%pike.org Exp $ + * $Id: ExprParser.cpp,v 1.8 2001-01-22 09:36:16 kvisco%ziplink.net Exp $ */ /** @@ -38,7 +38,7 @@ * This class is used to parse XSL Expressions * @author Keith Visco * @see ExprLexer - * @version $Revision: 1.7 $ $Date: 2001-01-12 20:06:32 $ + * @version $Revision: 1.8 $ $Date: 2001-01-22 09:36:16 $ **/ #include "ExprParser.h" @@ -516,65 +516,84 @@ LocationStep* ExprParser::createLocationStep(ExprLexer& lexer) { //-- get Axis Identifier, if present Token* tok = lexer.peek(); - MBool setDefaultAxis = MB_TRUE; - if ( tok->type == Token::AXIS_IDENTIFIER ) { - //-- eat token - lexer.nextToken(); - setDefaultAxis = MB_FALSE; - - //-- should switch to a hash here for speed if necessary - if ( ANCESTOR_AXIS.isEqual(tok->value) ) - axisIdentifier = LocationStep::ANCESTOR_AXIS; - else if ( ANCESTOR_OR_SELF_AXIS.isEqual(tok->value) ) - axisIdentifier = LocationStep::ANCESTOR_OR_SELF_AXIS; - else if ( ATTRIBUTE_AXIS.isEqual(tok->value) ) - axisIdentifier = LocationStep::ATTRIBUTE_AXIS; - else if ( CHILD_AXIS.isEqual(tok->value) ) - axisIdentifier = LocationStep::CHILD_AXIS; - else if ( DESCENDANT_AXIS.isEqual(tok->value) ) - axisIdentifier = LocationStep::DESCENDANT_AXIS; - else if ( DESCENDANT_OR_SELF_AXIS.isEqual(tok->value) ) - axisIdentifier = LocationStep::DESCENDANT_OR_SELF_AXIS; - else if ( FOLLOWING_AXIS.isEqual(tok->value) ) - axisIdentifier = LocationStep::FOLLOWING_AXIS; - else if ( FOLLOWING_SIBLING_AXIS.isEqual(tok->value) ) - axisIdentifier = LocationStep::FOLLOWING_SIBLING_AXIS; - else if ( NAMESPACE_AXIS.isEqual(tok->value) ) - axisIdentifier = LocationStep::NAMESPACE_AXIS; - else if ( PARENT_AXIS.isEqual(tok->value) ) - axisIdentifier = LocationStep::PARENT_AXIS; - else if ( PRECEDING_AXIS.isEqual(tok->value) ) - axisIdentifier = LocationStep::PRECEDING_AXIS; - else if ( PRECEDING_SIBLING_AXIS.isEqual(tok->value) ) - axisIdentifier = LocationStep::PRECEDING_SIBLING_AXIS; - else if ( SELF_AXIS.isEqual(tok->value) ) - axisIdentifier = LocationStep::SELF_AXIS; - //-- child axis is default - else { - //-- handle error gracefully, simply ignore invalid axis and - //-- use default. Add error message when message observer - //-- is implemented - setDefaultAxis = MB_TRUE; + switch (tok->type) { + case Token::AXIS_IDENTIFIER: + { + //-- eat token + lexer.nextToken(); + //-- should switch to a hash here for speed if necessary + if ( ANCESTOR_AXIS.isEqual(tok->value) ) + axisIdentifier = LocationStep::ANCESTOR_AXIS; + else if ( ANCESTOR_OR_SELF_AXIS.isEqual(tok->value) ) + axisIdentifier = LocationStep::ANCESTOR_OR_SELF_AXIS; + else if ( ATTRIBUTE_AXIS.isEqual(tok->value) ) + axisIdentifier = LocationStep::ATTRIBUTE_AXIS; + else if ( CHILD_AXIS.isEqual(tok->value) ) + axisIdentifier = LocationStep::CHILD_AXIS; + else if ( DESCENDANT_AXIS.isEqual(tok->value) ) + axisIdentifier = LocationStep::DESCENDANT_AXIS; + else if ( DESCENDANT_OR_SELF_AXIS.isEqual(tok->value) ) + axisIdentifier = LocationStep::DESCENDANT_OR_SELF_AXIS; + else if ( FOLLOWING_AXIS.isEqual(tok->value) ) + axisIdentifier = LocationStep::FOLLOWING_AXIS; + else if ( FOLLOWING_SIBLING_AXIS.isEqual(tok->value) ) + axisIdentifier = LocationStep::FOLLOWING_SIBLING_AXIS; + else if ( NAMESPACE_AXIS.isEqual(tok->value) ) + axisIdentifier = LocationStep::NAMESPACE_AXIS; + else if ( PARENT_AXIS.isEqual(tok->value) ) + axisIdentifier = LocationStep::PARENT_AXIS; + else if ( PRECEDING_AXIS.isEqual(tok->value) ) + axisIdentifier = LocationStep::PRECEDING_AXIS; + else if ( PRECEDING_SIBLING_AXIS.isEqual(tok->value) ) + axisIdentifier = LocationStep::PRECEDING_SIBLING_AXIS; + else if ( SELF_AXIS.isEqual(tok->value) ) + axisIdentifier = LocationStep::SELF_AXIS; + //-- child axis is default + else if (!CHILD_AXIS.isEqual(tok->value)) { + //-- handle error gracefully, simply ignore invalid axis and + //-- use default. Add error message when message observer + //-- is implemented + } + break; } - + case Token::AT_SIGN: + //-- eat token + lexer.nextToken(); + axisIdentifier = LocationStep::ATTRIBUTE_AXIS; + break; + default: + break; + } + + lstep->setAxisIdentifier(axisIdentifier); + + + NodeExpr* nodeExpr = 0; + + tok = lexer.peek(); + if (!tok) { + ///XXXXX We need to create an ErrorExpr or something to + ///XXXXX handle errors + } + // NameTest + else if (tok->type == Token::CNAME) { + //-- handle NameTest + //-- eat token + lexer.nextToken(); + if (axisIdentifier == LocationStep::ATTRIBUTE_AXIS) + nodeExpr = new AttributeExpr(tok->value); + else + nodeExpr = new ElementExpr(tok->value); + + } + // NodeType + else { + NodeExpr* nodeExpr = createNodeExpr(lexer); } - //-- parse NodeExpr - NodeExpr* nodeExpr = createNodeExpr(lexer); lstep->setNodeExpr(nodeExpr); - //-- set default axis identifiers - if ((setDefaultAxis) && (nodeExpr)) { - switch ( nodeExpr->getType() ) { - case NodeExpr::ATTRIBUTE_EXPR: - axisIdentifier = LocationStep::ATTRIBUTE_AXIS; - break; - default: - axisIdentifier = LocationStep::CHILD_AXIS; - } - } - lstep->setAxisIdentifier(axisIdentifier); //-- handle predicates @@ -589,6 +608,10 @@ LocationStep* ExprParser::createLocationStep(ExprLexer& lexer) { return lstep; } //-- createLocationPath +/** + * This method only handles comment(), text(), processing-instructing() and node() + * +**/ NodeExpr* ExprParser::createNodeExpr(ExprLexer& lexer) { //cout << "creating NodeExpr: "<type ) { - case Token::CNAME : - nodeExpr = new ElementExpr(tok->value); - break; - case Token::WILD_CARD: - nodeExpr = new WildCardExpr(); - break; case Token::COMMENT: nodeExpr = new BasicNodeExpr(NodeExpr::COMMENT_EXPR); errMsg = parseParameters(¶ms, lexer); @@ -635,24 +652,8 @@ NodeExpr* ExprParser::createNodeExpr(ExprLexer& lexer) { //-- ignore errMsg for now delete errMsg; break; - case Token::AT_SIGN: - tok = lexer.nextToken(); - if ( !tok ) { - //-- handle error - } - else if (tok->type == Token::CNAME) { - nodeExpr = new AttributeExpr(tok->value); - } - else if ( tok->type == Token::WILD_CARD ) { - AttributeExpr* attExpr = new AttributeExpr(); - attExpr->setWild(MB_TRUE); - nodeExpr = attExpr; - } - else { - //-- handle error - } - break; default: + //XXXX ignore error for now break; } return nodeExpr; @@ -795,7 +796,6 @@ MBool ExprParser::isNodeTypeToken(Token* token) { switch ( token->type ) { case Token::AT_SIGN: case Token::CNAME: - case Token::WILD_CARD: case Token::COMMENT: case Token::NODE : case Token::PI : diff --git a/mozilla/extensions/transformiix/source/xpath/ExprResult.h b/mozilla/extensions/transformiix/source/xpath/ExprResult.h index 45b8cfe1c78..1e2bc2788d3 100644 --- a/mozilla/extensions/transformiix/source/xpath/ExprResult.h +++ b/mozilla/extensions/transformiix/source/xpath/ExprResult.h @@ -23,15 +23,15 @@ * Larry Fitzpatrick, OpenText, lef@opentext.com * -- changed constant short result types to enum * - * $Id: ExprResult.h,v 1.7 2001-01-12 20:06:33 axel%pike.org Exp $ + * $Id: ExprResult.h,v 1.8 2001-01-22 09:36:17 kvisco%ziplink.net Exp $ */ -#include "MITREObject.h" +#include "TxObject.h" #include "dom.h" #include "primitives.h" -#ifndef MITREXSL_EXPRRESULT_H -#define MITREXSL_EXPRRESULT_H +#ifndef TRANSFRMX_EXPRRESULT_H +#define TRANSFRMX_EXPRRESULT_H /* @@ -41,11 +41,9 @@ * BooleanResult, ExprResult, NumberResult, StringResult *
* Note: for NodeSet, see NodeSet.h
- * @author Keith Visco - * @version $Revision: 1.7 $ $Date: 2001-01-12 20:06:33 $ */ -class ExprResult : public MITREObject { +class ExprResult : public TxObject { public: @@ -96,10 +94,6 @@ public: MBool getValue() const; - void setValue(MBool boolean); - - void setValue(const BooleanResult& boolResult); - virtual short getResultType(); virtual void stringValue(String& str); virtual MBool booleanValue(); @@ -118,11 +112,6 @@ public: NumberResult(const NumberResult& nbrResult); double getValue() const; - - void setValue(double dbl); - - void setValue(const NumberResult& nbrResult); - MBool isNaN() const; virtual short getResultType(); @@ -146,7 +135,6 @@ public: StringResult(const StringResult& strResult); String& getValue(); - void setValue(const String& str); virtual short getResultType(); virtual void stringValue(String& str); diff --git a/mozilla/extensions/transformiix/source/xpath/LocationStep.cpp b/mozilla/extensions/transformiix/source/xpath/LocationStep.cpp index 68f537fe3a0..5ae6034a9e2 100644 --- a/mozilla/extensions/transformiix/source/xpath/LocationStep.cpp +++ b/mozilla/extensions/transformiix/source/xpath/LocationStep.cpp @@ -21,12 +21,12 @@ * Keith Visco, kvisco@ziplink.net * -- original author. * - * $Id: LocationStep.cpp,v 1.3 2001-01-12 20:06:34 axel%pike.org Exp $ + * $Id: LocationStep.cpp,v 1.4 2001-01-22 09:36:17 kvisco%ziplink.net Exp $ */ /* Implementation of an XPath LocationStep - @version $Revision: 1.3 $ $Date: 2001-01-12 20:06:34 $ + @version $Revision: 1.4 $ $Date: 2001-01-22 09:36:17 $ */ #include "Expr.h" @@ -281,6 +281,9 @@ void LocationStep::toString(String& str) { case ANCESTOR_OR_SELF_AXIS : str.append("ancestor-or-self::"); break; + case ATTRIBUTE_AXIS: + str.append("attribute::"); + break; case DESCENDANT_AXIS: str.append("descendant::"); break; diff --git a/mozilla/extensions/transformiix/source/xpath/Makefile b/mozilla/extensions/transformiix/source/xpath/Makefile index d142351af5d..cfaf4fb7b08 100644 --- a/mozilla/extensions/transformiix/source/xpath/Makefile +++ b/mozilla/extensions/transformiix/source/xpath/Makefile @@ -42,7 +42,6 @@ XPATH_OBJS = AdditiveExpr.o \ TextExpr.o \ UnionExpr.o \ VariableRefExpr.o \ - WildCardExpr.o \ XPathNames.o FUNCTION_CALL_OBJS = \ diff --git a/mozilla/extensions/transformiix/source/xpath/NumberExpr.cpp b/mozilla/extensions/transformiix/source/xpath/NumberExpr.cpp index b73905bdf32..8c36695df78 100644 --- a/mozilla/extensions/transformiix/source/xpath/NumberExpr.cpp +++ b/mozilla/extensions/transformiix/source/xpath/NumberExpr.cpp @@ -21,7 +21,7 @@ * Keith Visco, kvisco@ziplink.net * -- original author. * - * $Id: NumberExpr.cpp,v 1.1 2000-04-06 07:45:34 kvisco%ziplink.net Exp $ + * $Id: NumberExpr.cpp,v 1.2 2001-01-22 09:36:18 kvisco%ziplink.net Exp $ */ #include "Expr.h" @@ -31,11 +31,11 @@ //--------------/ NumberExpr::NumberExpr() { - numberResult.setValue(0.0); + _value = 0.0; } //-- NumberExpr NumberExpr::NumberExpr(double dbl) { - numberResult.setValue(dbl); + _value = dbl; } //-- NumberExpr NumberExpr::~NumberExpr() { @@ -49,7 +49,7 @@ NumberExpr::~NumberExpr() { * @return the result of the evaluation **/ ExprResult* NumberExpr::evaluate(Node* context, ContextState* cs) { - return new NumberResult(numberResult); + return new NumberResult(_value); } //-- evaluate /** @@ -61,6 +61,10 @@ ExprResult* NumberExpr::evaluate(Node* context, ContextState* cs) { * @return the String representation of this Expr. **/ void NumberExpr::toString(String& str) { - numberResult.stringValue(str); + int intVal = (int)_value; + if (intVal == _value) { //-- no fraction + Integer::toString(intVal, str); + } + else Double::toString(_value, str); } //-- toString diff --git a/mozilla/extensions/transformiix/source/xpath/NumberFunctionCall.cpp b/mozilla/extensions/transformiix/source/xpath/NumberFunctionCall.cpp index f003e5359e1..cc001387c41 100644 --- a/mozilla/extensions/transformiix/source/xpath/NumberFunctionCall.cpp +++ b/mozilla/extensions/transformiix/source/xpath/NumberFunctionCall.cpp @@ -25,7 +25,7 @@ * Nisheeth Ranjan, nisheeth@netscape.com * -- implemented rint function, which was not available on Windows. * - * $Id: NumberFunctionCall.cpp,v 1.10 2001-01-12 20:06:36 axel%pike.org Exp $ + * $Id: NumberFunctionCall.cpp,v 1.11 2001-01-22 09:36:18 kvisco%ziplink.net Exp $ */ /* @@ -89,7 +89,7 @@ static double rint(double r) * @return the result of the evaluation **/ ExprResult* NumberFunctionCall::evaluate(Node* context, ContextState* cs) { - NumberResult* result = new NumberResult(); + NumberResult* result = 0; ListIterator* iter = params.iterator(); int argc = params.getLength(); Expr* param = 0; @@ -99,20 +99,20 @@ ExprResult* NumberFunctionCall::evaluate(Node* context, ContextState* cs) { case CEILING : if ( requireParams(1, 1, cs) ) { double dbl = evaluateToNumber((Expr*)iter->next(), context, cs); - result->setValue(ceil(dbl)); + result = new NumberResult(ceil(dbl)); } else { - result->setValue(0.0); - } - break; - + result = new NumberResult(0.0); + } + break; + case FLOOR : if ( requireParams(1, 1, cs) ) { double dbl = evaluateToNumber((Expr*)iter->next(), context, cs); - result->setValue(floor(dbl)); + result = new NumberResult(floor(dbl)); } else { - result->setValue(0.0); + result = new NumberResult(0.0); } break; @@ -123,15 +123,14 @@ ExprResult* NumberFunctionCall::evaluate(Node* context, ContextState* cs) { if ((dbl>0.0) && (res == dbl-0.5)) { // fix for native round function from math library (rint()) which does not // match the XPath spec for positive half values - result->setValue(res+1.0); - } - else { - result->setValue(res); + result = new NumberResult(res+1.0); } + else + result = new NumberResult(res); break; } - else result->setValue(0.0); - break; + else result = new NumberResult(0.0); + break; case SUM : double numResult; @@ -159,7 +158,7 @@ ExprResult* NumberFunctionCall::evaluate(Node* context, ContextState* cs) { if (iter->hasNext()) { param = (Expr*) iter->next(); ExprResult* exprResult = param->evaluate(context, cs); - result->setValue(exprResult->numberValue()); + result = new NumberResult(exprResult->numberValue()); delete exprResult; } else { @@ -167,16 +166,16 @@ ExprResult* NumberFunctionCall::evaluate(Node* context, ContextState* cs) { XMLDOMUtils::getNodeValue(context, &resultStr); if ( cs->isStripSpaceAllowed(context) && XMLUtils::shouldStripTextnode(resultStr)) { - result->setValue(Double::NaN); + result = new NumberResult(Double::NaN); } else { Double dbl(resultStr); - result->setValue(dbl.doubleValue()); + result = new NumberResult(dbl.doubleValue()); } } } else { - result->setValue(Double::NaN); + result = new NumberResult(Double::NaN); } break; } diff --git a/mozilla/extensions/transformiix/source/xpath/NumberResult.cpp b/mozilla/extensions/transformiix/source/xpath/NumberResult.cpp index efa5268bc60..5f99b9e1e33 100644 --- a/mozilla/extensions/transformiix/source/xpath/NumberResult.cpp +++ b/mozilla/extensions/transformiix/source/xpath/NumberResult.cpp @@ -21,14 +21,14 @@ * Keith Visco, kvisco@ziplink.net * -- original author. * - * $Id: NumberResult.cpp,v 1.5 2000-06-11 12:23:11 Peter.VanderBeken%pandora.be Exp $ + * $Id: NumberResult.cpp,v 1.6 2001-01-22 09:36:18 kvisco%ziplink.net Exp $ */ /** * NumberResult * Represents the a number as the result of evaluating an Expr * @author Keith Visco - * @version $Revision: 1.5 $ $Date: 2000-06-11 12:23:11 $ + * @version $Revision: 1.6 $ $Date: 2001-01-22 09:36:18 $ **/ #include "ExprResult.h" @@ -66,21 +66,6 @@ double NumberResult::getValue() const { MBool NumberResult::isNaN() const { return Double::isNaN(value); } //-- isNaN -/** - * Sets the value of this NumberResult - * @param dbl the double to use for this NumberResult's value -**/ -void NumberResult::setValue(double dbl) { - this->value = dbl; -} //-- setValue - -/** - * Sets the value of this NumberResult - * @param nbrResult the NumberResult to use for setting this NumberResult's value -**/ -void NumberResult::setValue(const NumberResult& nbrResult) { - this->value = nbrResult.getValue(); -} //-- setValue /* * Virtual Methods from ExprResult diff --git a/mozilla/extensions/transformiix/source/xpath/Parser.cpp b/mozilla/extensions/transformiix/source/xpath/Parser.cpp index 51916339d04..d82183a697f 100644 --- a/mozilla/extensions/transformiix/source/xpath/Parser.cpp +++ b/mozilla/extensions/transformiix/source/xpath/Parser.cpp @@ -21,12 +21,12 @@ * Keith Visco, kvisco@ziplink.net * -- original author. * - * $Id: Parser.cpp,v 1.4 2000-07-23 07:25:29 kvisco%ziplink.net Exp $ + * $Id: Parser.cpp,v 1.5 2001-01-22 09:36:19 kvisco%ziplink.net Exp $ */ /** * Test App for Expressions - * @version $Revision: 1.4 $ $Date: 2000-07-23 07:25:29 $ + * @version $Revision: 1.5 $ $Date: 2001-01-22 09:36:19 $ **/ #include @@ -52,7 +52,7 @@ void main(int argc, char** argv) { //String pattern("*[1]foo|*[1]/bar|*[1]/baz"); //-- Current Test - String pattern("(4+5)-(9+9)"); + String pattern("*[test()='foo']"); cout <<"Lexically Analyzing: "<Keith Visco - * @version $Revision: 1.5 $ $Date: 2000-06-11 12:29:35 $ + * @version $Revision: 1.6 $ $Date: 2001-01-22 09:36:19 $ **/ #include "ExprResult.h" @@ -64,15 +64,6 @@ String& StringResult::getValue() { return this->value; } //-- getValue -/** - * Sets the value of this StringResult - * @param str the String to use for this StringResult's value -**/ -void StringResult::setValue(const String& str){ - // copy str - this->value = str; -} //-- setValue - /* * Virtual Methods from ExprResult */