]> git.ipfire.org Git - thirdparty/dhcp.git/commitdiff
Add != operator.
authorTed Lemon <source@isc.org>
Wed, 3 Nov 1999 16:10:46 +0000 (16:10 +0000)
committerTed Lemon <source@isc.org>
Wed, 3 Nov 1999 16:10:46 +0000 (16:10 +0000)
common/parse.c
common/tree.c
includes/dhctoken.h
includes/tree.h

index 07ee711dde7e919767677e303999c50743abedab..6329fb88587c775b71b8fd1ff2377d82ec5615e3 100644 (file)
@@ -22,7 +22,7 @@
 
 #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"
@@ -1540,6 +1540,7 @@ int parse_if_statement (result, cfile, lose)
  * 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
@@ -2389,6 +2390,21 @@ int parse_expression (expr, cfile, lose, context, plhs, binop)
 
        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;
index e842b1a101981bdccc0e08d1f1817602ba40e071..ca4af5d3988a84fdf93845c0e99ab8a8491bf8bd 100644 (file)
@@ -22,7 +22,7 @@
 
 #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"
@@ -405,6 +405,7 @@ int evaluate_boolean_expression (result, packet, lease, in_options,
                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,
@@ -416,19 +417,23 @@ int evaluate_boolean_expression (result, packet, lease, in_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,
@@ -1386,6 +1391,7 @@ int evaluate_data_expression (result, packet, lease,
 
              case expr_check:
              case expr_equal:
+             case expr_not_equal:
              case expr_and:
              case expr_or:
              case expr_not:
@@ -1429,6 +1435,7 @@ int evaluate_numeric_expression (result, packet, lease,
        switch (expr -> op) {
              case expr_check:
              case expr_equal:
+             case expr_not_equal:
              case expr_and:
              case expr_or:
              case expr_not:
@@ -1670,6 +1677,7 @@ void expression_dereference (eptr, name)
        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:
@@ -1851,6 +1859,7 @@ int is_boolean_expression (expr)
        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 ||
@@ -1936,6 +1945,7 @@ static int op_val (op)
                return 100;
 
              case expr_equal:
+             case expr_not_equal:
                return 3;
 
              case expr_and:
@@ -1996,6 +2006,7 @@ enum expression_context op_context (op)
                return context_any;
 
              case expr_equal:
+             case expr_not_equal:
                return context_data;
 
              case expr_and:
@@ -2032,6 +2043,10 @@ int write_expression (file, expr, col, indent)
                                                 "\"", (char *)0);
                break;
 
+             case expr_not_equal:
+               s = "!=";
+               goto binary;
+
              case expr_equal:
                s = "=";
              binary:
index 507d14c57bfa3a459cc13c4e3fb574c0e5256c55..2988a6173413bf8e11ee291644ca55b5dbf6da9c 100644 (file)
@@ -31,6 +31,7 @@ enum dhcp_token {
        LPAREN = '(',
        RPAREN = ')',
        EQUAL = '=',
+       BANG = '!',
 
        HOST = 256,
        FIRST_TOKEN = HOST,
index 51da51d012abbed7dc71ddd034e99af860f25228..416248a0f56ae04d33a33cbb41a3f4e0b3d699ba 100644 (file)
@@ -93,7 +93,8 @@ enum expr_op {
        expr_dns_update,
        expr_static,
        expr_updated_dns_rr,
-       expr_dns_delete
+       expr_dns_delete,
+       expr_not_equal
 };
 
 struct expression {