dbertoni 01/06/06 14:51:26
Modified: c/src/XPath XPathProcessorImpl.cpp XPathProcessorImpl.hpp
Log:
Arguments to id() and key() in match patterns must be literals.
Revision Changes Path
1.40 +49 -14 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.39
retrieving revision 1.40
diff -u -r1.39 -r1.40
--- XPathProcessorImpl.cpp 2001/05/18 19:05:39 1.39
+++ XPathProcessorImpl.cpp 2001/06/06 21:51:24 1.40
@@ -86,7 +86,8 @@
m_xpath(0),
m_expression(0),
m_prefixResolver(0),
- m_envSupport(0)
+ m_envSupport(0),
+ m_requireLiterals(false)
{
}
@@ -105,6 +106,8 @@
const PrefixResolver& prefixResolver,
const XPathEnvSupport& envSupport)
{
+ m_requireLiterals = false;
+
m_xpath = &pathObj;
m_expression = &m_xpath->getExpression();
@@ -1640,7 +1643,15 @@
m_expression->appendOpCode(XPathExpression::eOP_ARGUMENT);
- Expr();
+ if (m_requireLiterals == false ||
+ isCurrentLiteral() == true)
+ {
+ Expr();
+ }
+ else
+ {
+ error(TranscodeFromLocalCodePage("A literal argument is
required!"));
+ }
m_expression->updateOpCodeLength(XPathExpression::eOP_ARGUMENT,
opPos);
@@ -1721,8 +1732,6 @@
TranscodeFromLocalCodePage("()"));
}
- // $$$ ToDo: I believe that this is XSLT functionality. We
- // need to figure out how to do the extensions for this stuff.
const int funcTok = getFunctionToken(m_token);
switch(funcTok)
@@ -2163,18 +2172,10 @@
{
assert(m_xpath != 0);
assert(m_expression != 0);
-
- const int last = length(m_token) - 1;
-
- assert(last > 0);
-
- const XalanDOMChar c0 = m_tokenChar;
- const XalanDOMChar cX = charAt(m_token, last);
- if((c0 == XalanUnicode::charQuoteMark && cX ==
XalanUnicode::charQuoteMark) ||
- (c0 == XalanUnicode::charApostrophe && cX ==
XalanUnicode::charApostrophe))
+ if(isCurrentLiteral() == true)
{
- const XalanDOMString theArgument = substring(m_token, 1,
last);
+ const XalanDOMString theArgument = substring(m_token, 1,
length(m_token) - 1);
m_expression->pushArgumentOnOpCodeMap(theArgument);
@@ -2305,7 +2306,11 @@
void
XPathProcessorImpl::IdKeyPattern()
{
+ m_requireLiterals = true;
+
FunctionCall();
+
+ m_requireLiterals = false;
}
@@ -2439,6 +2444,36 @@
}
return fResult;
+}
+
+
+
+bool
+XPathProcessorImpl::isCurrentLiteral() const
+{
+ const int last = length(m_token) - 1;
+
+ if (last <= 0)
+ {
+ return false;
+ }
+ else
+ {
+ assert(last > 0);
+
+ const XalanDOMChar c0 = m_tokenChar;
+ const XalanDOMChar cX = charAt(m_token, last);
+
+ if((c0 == XalanUnicode::charQuoteMark && cX ==
XalanUnicode::charQuoteMark) ||
+ (c0 == XalanUnicode::charApostrophe && cX ==
XalanUnicode::charApostrophe))
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
}
1.14 +6 -1 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.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- XPathProcessorImpl.hpp 2000/11/02 01:46:02 1.13
+++ XPathProcessorImpl.hpp 2001/06/06 21:51:24 1.14
@@ -359,7 +359,7 @@
getTokenRelative(int theOffset) const;
/**
- * Retrieve the next token from the command and
+ * Retrieve the previous token from the command and
* store it in m_token string.
*/
void
@@ -386,6 +386,9 @@
void
consumeExpected(char expected);
+ bool
+ isCurrentLiteral() const;
+
/**
* Warn the user of an problem.
*/
@@ -830,6 +833,8 @@
const PrefixResolver* m_prefixResolver;
const XPathEnvSupport* m_envSupport;
+
+ bool
m_requireLiterals;
enum eDummy
{
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]