Implement inequality operator (use: != or <>)
authorRichard W.M. Jones <rjones@redhat.com>
Sat, 30 Jun 2012 14:06:18 +0000 (15:06 +0100)
committerRichard W.M. Jones <rjones@redhat.com>
Sat, 30 Jun 2012 14:06:18 +0000 (15:06 +0100)
lib/whenexpr.ml
lib/whenexpr.mli
tests/parsing/t020_simple.ml
tools/whenjobs.pod

index c2ffa33..1301e5e 100644 (file)
@@ -41,6 +41,7 @@ type whenexpr =
   | Expr_eq of whenexpr * whenexpr
   | Expr_ge of whenexpr * whenexpr
   | Expr_gt of whenexpr * whenexpr
+  | Expr_ne of whenexpr * whenexpr
   | Expr_not of whenexpr
   | Expr_add of whenexpr * whenexpr
   | Expr_sub of whenexpr * whenexpr
@@ -212,6 +213,9 @@ and expr_of_iexpr _loc = function
   | IExpr_app (">", exprs) ->
     two_params _loc ">" exprs (fun e1 e2 -> Expr_gt (e1, e2))
 
+  | IExpr_app (("!="|"<>"), exprs) ->
+    two_params _loc "<>" exprs (fun e1 e2 -> Expr_ne (e1, e2))
+
   | IExpr_app ("!", exprs) ->
     one_param _loc "!" exprs (fun e1 -> Expr_not e1)
 
@@ -294,6 +298,8 @@ let rec string_of_whenexpr = function
     sprintf "%s >= %s" (string_of_whenexpr e1) (string_of_whenexpr e2)
   | Expr_gt (e1, e2) ->
     sprintf "%s > %s" (string_of_whenexpr e1) (string_of_whenexpr e2)
+  | Expr_ne (e1, e2) ->
+    sprintf "%s <> %s" (string_of_whenexpr e1) (string_of_whenexpr e2)
   | Expr_not e -> sprintf "! %s" (string_of_whenexpr e)
   | Expr_add (e1, e2) ->
     sprintf "%s + %s" (string_of_whenexpr e1) (string_of_whenexpr e2)
@@ -336,6 +342,7 @@ let rec dependencies_of_whenexpr = function
   | Expr_eq (e1, e2)
   | Expr_ge (e1, e2)
   | Expr_gt (e1, e2)
+  | Expr_ne (e1, e2)
   | Expr_add (e1, e2)
   | Expr_sub (e1, e2)
   | Expr_mul (e1, e2)
@@ -419,6 +426,14 @@ let rec eval_whenexpr variables prev_variables onload = function
     else
       T_bool false
 
+  | Expr_ne (e1, e2) ->
+    let e1 = eval_whenexpr variables prev_variables onload e1
+    and e2 = eval_whenexpr variables prev_variables onload e2 in
+    if compare_values e1 e2 <> 0 then
+      T_bool true
+    else
+      T_bool false
+
   | Expr_not e ->
     if not (eval_whenexpr_as_bool variables prev_variables onload e) then
       T_bool true
index 7310387..c84f091 100644 (file)
@@ -33,6 +33,7 @@ type whenexpr =
   | Expr_eq of whenexpr * whenexpr      (** == *)
   | Expr_ge of whenexpr * whenexpr      (** >= *)
   | Expr_gt of whenexpr * whenexpr      (** > *)
+  | Expr_ne of whenexpr * whenexpr      (** != *)
   | Expr_not of whenexpr                (** boolean not *)
   | Expr_add of whenexpr * whenexpr     (** arithmetic addition or string cat *)
   | Expr_sub of whenexpr * whenexpr     (** arithmetic subtraction *)
index f7f0778..19ad3f9 100644 (file)
@@ -59,3 +59,13 @@ when false == true :
 <<
   # nothing
 >>
+
+when true != true :
+<<
+  # nothing
+>>
+
+when true <> (false || true) :
+<<
+  # nothing
+>>
index df17e69..77b26bc 100644 (file)
@@ -447,6 +447,12 @@ If the sub-expressions are numeric, then numeric comparison is done.
 If either sub-expression is non-numeric, then both expressions are
 converted (if necessary) to strings and string comparison is done.
 
+=item I<expr> B<E<lt>E<gt>> I<expr>
+
+=item I<expr> B<!=> I<expr>
+
+Either form can be used to test the two expressions for inequality.
+
 =item B<!> I<expr>
 
 Boolean negative of I<expr>.