#ifndef lint
static char copyright[] =
-"$Id: tree.c,v 1.83 2000/06/12 22:22:08 mellon Exp $ Copyright (c) 1995-2000 The Internet Software Consortium. All rights reserved.\n";
+"$Id: tree.c,v 1.84 2000/07/06 10:00:53 mellon Exp $ Copyright (c) 1995-2000 The Internet Software Consortium. All rights reserved.\n";
#endif /* not lint */
#include "dhcpd.h"
else
*result = expr -> op == expr_not_equal;
}
+ if (!sleft && !sright)
+ *result = expr -> op == expr_equal;
#if defined (DEBUG_EXPRESSIONS)
log_debug ("bool: %sequal (%s, %s) = %s",
data_string_forget (&left, MDL);
if (sright)
data_string_forget (&right, MDL);
- return sleft && sright;
+ return (sleft && sright) || (!sleft && !sright);
case expr_and:
sleft = evaluate_boolean_expression (&bleft, packet, lease,
in_options, cfg_options,
scope,
expr -> data.and [0]);
- sright = evaluate_boolean_expression (&bright, packet, lease,
- in_options, cfg_options,
- scope,
- expr -> data.and [1]);
+ if (sleft && bleft)
+ sright = evaluate_boolean_expression
+ (&bright, packet, lease,
+ in_options, cfg_options,
+ scope, expr -> data.and [1]);
+ else
+ sright = bright = 0;
#if defined (DEBUG_EXPRESSIONS)
log_debug ("bool: and (%s, %s) = %s",
in_options, cfg_options,
scope,
expr -> data.or [0]);
- sright = evaluate_boolean_expression (&bright, packet, lease,
- in_options, cfg_options,
- scope,
- expr -> data.or [1]);
+ if (sleft && !bleft)
+ sright = evaluate_boolean_expression
+ (&bright, packet, lease,
+ in_options, cfg_options,
+ scope, expr -> data.or [1]);
+ else
+ sright = bright = 0;
#if defined (DEBUG_EXPRESSIONS)
log_debug ("bool: or (%s, %s) = %s",
sleft ? (bleft ? "true" : "false") : "NULL",
((sleft && sright)
? (bleft || bright ? "true" : "false") : "NULL"));
#endif
+ if (sleft && bleft) {
+ *result = 1;
+ return 1;
+ }
if (sleft && sright) {
*result = bleft || bright;
return 1;
} else
*result = 0;
#if defined (DEBUG_EXPRESSIONS)
- log_debug ("boolean: %s? = %s", expr -> variable,
+ log_debug ("boolean: %s? = %s", expr -> data.variable,
sleft ? "true" : "false");
#endif
return 1;
} else
sleft = 0;
#if defined (DEBUG_EXPRESSIONS)
- log_debug ("boolean: %s = %s", expr -> variable,
+ log_debug ("boolean: %s = %s", expr -> data.variable,
sleft ? (*result ? "true" : "false") : "NULL");
#endif
return sleft;
} else
s0 = 0;
#if defined (DEBUG_EXPRESSIONS)
- log_debug ("data: %s = %s", expr -> variable,
+ log_debug ("data: %s = %s", expr -> data.variable,
s0 ? print_hex_1 (result -> len,
result -> data, 50) : "NULL");
#endif
binding_value_dereference (&bv, MDL);
}
#if defined (DEBUG_EXPRESSIONS)
- log_debug ("data: %s = %s", expr -> funcall.name,
+ log_debug ("data: %s = %s", expr -> data.funcall.name,
s0 ? print_hex_1 (result -> len,
result -> data, 50) : "NULL");
#endif
#if defined (DEBUG_EXPRESSIONS)
log_info ("data: filename = \"%s\"",
- s0 ? result -> data : "NULL");
+ s0 ? (char *)(result -> data) : "NULL");
#endif
return s0;
#if defined (DEBUG_EXPRESSIONS)
log_info ("data: sname = \"%s\"",
- s0 ? result -> data : "NULL");
+ s0 ? (char *)(result -> data) : "NULL");
#endif
return s0;
} else
status = 0;
#if defined (DEBUG_EXPRESSIONS)
- log_debug ("numeric: %s = %s", expr -> variable,
+ log_debug ("numeric: %s = %s", expr -> data.variable,
status ? *result : 0);
#endif
return status;
binding_value_dereference (&bv, MDL);
}
#if defined (DEBUG_EXPRESSIONS)
- log_debug ("data: %s = %d", expr -> funcall.name,
+ log_debug ("data: %s = %d", expr -> data.funcall.name,
status ? *result : 0);
#endif
break;