#ifndef lint
static char copyright[] =
-"$Id: parse.c,v 1.52 1999/10/21 03:08:38 mellon Exp $ Copyright (c) 1995, 1996, 1997, 1998, 1999 The Internet Software Consortium. All rights reserved.\n";
+"$Id: parse.c,v 1.53 1999/11/03 16:10:40 mellon Exp $ Copyright (c) 1995, 1996, 1997, 1998, 1999 The Internet Software Consortium. All rights reserved.\n";
#endif /* not lint */
#include "dhcpd.h"
* boolean_expression :== CHECK STRING |
* NOT boolean-expression |
* data-expression EQUAL data-expression |
+ * data-expression BANG EQUAL data-expression |
* boolean-expression AND boolean-expression |
* boolean-expression OR boolean-expression
* EXISTS OPTION-NAME
token = peek_token (&val, cfile);
switch (token) {
+ case BANG:
+ token = next_token (&val, cfile);
+ token = peek_token (&val, cfile);
+ if (token != EQUAL) {
+ parse_warn (cfile, "! in boolean context without =");
+ *lose = 1;
+ skip_to_semi (cfile);
+ if (lhs)
+ expression_dereference (&lhs,
+ "parse_expression");
+ return 0;
+ }
+ next_op = expr_not_equal;
+ break;
+
case EQUAL:
next_op = expr_equal;
break;
#ifndef lint
static char copyright[] =
-"$Id: tree.c,v 1.63 1999/10/21 02:35:40 mellon Exp $ Copyright (c) 1995, 1996, 1997, 1998 The Internet Software Consortium. All rights reserved.\n";
+"$Id: tree.c,v 1.64 1999/11/03 16:10:41 mellon Exp $ Copyright (c) 1995, 1996, 1997, 1998 The Internet Software Consortium. All rights reserved.\n";
#endif /* not lint */
#include "dhcpd.h"
return 1;
case expr_equal:
+ case expr_not_equal:
memset (&left, 0, sizeof left);
sleft = evaluate_data_expression (&left, packet, lease,
in_options, cfg_options,
if (sleft && sright) {
if (left.len == right.len &&
!memcmp (left.data, right.data, left.len))
- *result = 1;
+ *result = expr -> op == expr_equal;
else
- *result = 0;
+ *result = expr -> op == expr_not_equal;
}
#if defined (DEBUG_EXPRESSIONS)
- log_debug ("bool: equal (%s, %s) = %s",
- sleft ? print_hex_1 (left.len, left.data, 30) : "NULL",
- sright ? print_hex_2 (right.len,
- right.data, 30) : "NULL",
- ((sleft && sright)
- ? (*result ? "true" : "false")
- : "NULL"));
+ log_debug ("bool: %sequal (%s, %s) = %s",
+ expr -> op == expr_not_equal ? "not" : "",
+ (sleft
+ ? print_hex_1 (left.len, left.data, 30)
+ : "NULL"),
+ (sright
+ ? print_hex_2 (right.len, right.data, 30)
+ : "NULL"),
+ ((sleft && sright)
+ ? (*result ? "true" : "false")
+ : "NULL"));
#endif
if (sleft)
data_string_forget (&left,
case expr_check:
case expr_equal:
+ case expr_not_equal:
case expr_and:
case expr_or:
case expr_not:
switch (expr -> op) {
case expr_check:
case expr_equal:
+ case expr_not_equal:
case expr_and:
case expr_or:
case expr_not:
switch (expr -> op) {
/* All the binary operators can be handled the same way. */
case expr_equal:
+ case expr_not_equal:
case expr_concat:
case expr_and:
case expr_or:
return (expr -> op == expr_check ||
expr -> op == expr_exists ||
expr -> op == expr_equal ||
+ expr -> op == expr_not_equal ||
expr -> op == expr_and ||
expr -> op == expr_or ||
expr -> op == expr_dns_update ||
return 100;
case expr_equal:
+ case expr_not_equal:
return 3;
case expr_and:
return context_any;
case expr_equal:
+ case expr_not_equal:
return context_data;
case expr_and:
"\"", (char *)0);
break;
+ case expr_not_equal:
+ s = "!=";
+ goto binary;
+
case expr_equal:
s = "=";
binary: