summaryrefslogtreecommitdiffstats
path: root/src/lib/eval/evaluate.cc
diff options
context:
space:
mode:
authorFrancis Dupont <fdupont@isc.org>2015-11-04 02:07:32 +0100
committerFrancis Dupont <fdupont@isc.org>2015-11-04 02:07:32 +0100
commit1937ffb98686c15382a64826f91577b9fb0445ad (patch)
tree78fabd5bd27fbf3b2fd2e5fd1ee1125440d0481c /src/lib/eval/evaluate.cc
parent[4116] Define EvalNotBoolError (diff)
downloadkea-1937ffb98686c15382a64826f91577b9fb0445ad.tar.xz
kea-1937ffb98686c15382a64826f91577b9fb0445ad.zip
[4094] Added evaluate function
Diffstat (limited to 'src/lib/eval/evaluate.cc')
-rw-r--r--src/lib/eval/evaluate.cc41
1 files changed, 41 insertions, 0 deletions
diff --git a/src/lib/eval/evaluate.cc b/src/lib/eval/evaluate.cc
new file mode 100644
index 0000000000..593a8c9541
--- /dev/null
+++ b/src/lib/eval/evaluate.cc
@@ -0,0 +1,41 @@
+// Copyright (C) 2015 Internet Systems Consortium, Inc. ("ISC")
+//
+// Permission to use, copy, modify, and/or distribute this software for any
+// purpose with or without fee is hereby granted, provided that the above
+// copyright notice and this permission notice appear in all copies.
+//
+// THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
+// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+// AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
+// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+// LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+// OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+// PERFORMANCE OF THIS SOFTWARE.
+
+#include <eval/evaluate.h>
+
+namespace isc {
+namespace dhcp {
+
+bool evaluate(const Expression& expr, const Pkt& pkt) {
+ ValueStack values;
+ for (Expression::const_iterator it = expr.begin();
+ it != expr.end(); ++it) {
+ (*it)->evaluate(pkt, values);
+ }
+ if (values.size() != 1) {
+ isc_throw(EvalBadStack, "Incorrect stack order. Expected exactly "
+ "1 value at the end of evaluatuion, got " << values.size());
+ }
+ if (values.top() == "false") {
+ return (false);
+ } else if (values.top() == "true") {
+ return (true);
+ } else {
+ isc_throw(EvalNotBoolError, "Incorrect evaluation type. Expected "
+ "\"false\" or \"true\", got \"" << values.top() << "\"");
+ }
+}
+
+}; // end of isc::dhcp namespace
+}; // end of isc namespace