package client.net.sf.saxon.ce.functions;
import client.net.sf.saxon.ce.expr.XPathContext;
import client.net.sf.saxon.ce.om.Item;
import client.net.sf.saxon.ce.regex.ARegularExpression;
import client.net.sf.saxon.ce.trans.XPathException;
import client.net.sf.saxon.ce.value.AtomicValue;
import client.net.sf.saxon.ce.value.BooleanValue;
import client.net.sf.saxon.ce.value.StringValue;
/**
* This class implements the matches() function for regular expression matching
*/
public class Matches extends SystemFunction {
public Matches newInstance() {
return new Matches();
}
/**
* Evaluate the matches() function to give a Boolean value.
* @param c The dynamic evaluation context
* @return the result as a BooleanValue, or null to indicate the empty sequence
* @throws XPathException on an error
*/
public Item evaluateItem(XPathContext c) throws XPathException {
AtomicValue sv0 = (AtomicValue)argument[0].evaluateItem(c);
if (sv0==null) {
sv0 = StringValue.EMPTY_STRING;
}
AtomicValue pat = (AtomicValue)argument[1].evaluateItem(c);
if (pat==null) return null;
CharSequence flags;
if (argument.length==2) {
flags = "";
} else {
AtomicValue sv2 = (AtomicValue)argument[2].evaluateItem(c);
if (sv2==null) return null;
flags = sv2.getStringValueCS();
}
try {
ARegularExpression re = new ARegularExpression(pat.getStringValueCS(), flags.toString(), "XP20", null);
return BooleanValue.get(re.containsMatch(sv0.getStringValue()));
} catch (XPathException err) {
XPathException de = new XPathException(err);
de.maybeSetErrorCode("FORX0002");
de.setXPathContext(c);
throw de;
}
}
}
// This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
// If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
// This Source Code Form is “Incompatible With Secondary Licenses”, as defined by the Mozilla Public License, v. 2.0.