Add 'len <expr>' operator.
authorRichard W.M. Jones <rjones@redhat.com>
Thu, 23 Feb 2012 14:56:05 +0000 (14:56 +0000)
committerRichard W.M. Jones <rjones@redhat.com>
Thu, 23 Feb 2012 14:56:05 +0000 (14:56 +0000)
lib/whenexpr.ml
lib/whenexpr.mli
tools/whenjobs.pod

index f24e9ed..8ccde2c 100644 (file)
@@ -47,6 +47,7 @@ type whenexpr =
   | Expr_mul of whenexpr * whenexpr
   | Expr_div of whenexpr * whenexpr
   | Expr_mod of whenexpr * whenexpr
+  | Expr_len of whenexpr
   | Expr_changes of string
   | Expr_increases of string
   | Expr_decreases of string
@@ -202,6 +203,9 @@ and expr_of_iexpr _loc = function
   | IExpr_app ("mod", exprs) ->
     two_params _loc "+" exprs (fun e1 e2 -> Expr_mod (e1, e2))
 
+  | IExpr_app (("len"|"length"|"size"), exprs) ->
+    one_param _loc "len" exprs (fun e1 -> Expr_len e1)
+
   | IExpr_app (("change"|"changes"|"changed"), [IExpr_var v]) ->
     Expr_changes v
 
@@ -274,6 +278,7 @@ let rec string_of_whenexpr = function
     sprintf "%s / %s" (string_of_whenexpr e1) (string_of_whenexpr e2)
   | Expr_mod (e1, e2) ->
     sprintf "%s mod %s" (string_of_whenexpr e1) (string_of_whenexpr e2)
+  | Expr_len e -> sprintf "len %s" (string_of_whenexpr e)
   | Expr_changes v -> sprintf "changes %s" v
   | Expr_increases v -> sprintf "increases %s" v
   | Expr_decreases v -> sprintf "decreases %s" v
@@ -310,7 +315,8 @@ let rec dependencies_of_whenexpr = function
   | Expr_div (e1, e2)
   | Expr_mod (e1, e2) ->
     dependencies_of_whenexpr e1 @ dependencies_of_whenexpr e2
-  | Expr_not e ->
+  | Expr_not e
+  | Expr_len e ->
     dependencies_of_whenexpr e
   | Expr_changes v
   | Expr_increases v
@@ -417,6 +423,11 @@ let rec eval_whenexpr variables prev_variables onload = function
     and e2 = eval_whenexpr variables prev_variables onload e2 in
     mod_values e1 e2
 
+  | Expr_len e ->
+    let e = eval_whenexpr variables prev_variables onload e in
+    let e = string_of_variable e in
+    T_int (big_int_of_int (String.length e))
+
   | Expr_changes v ->
     let prev_value, curr_value = get_prev_curr_value variables prev_variables v in
     if compare_values prev_value curr_value <> 0 then
index c0c6fb2..12ba584 100644 (file)
@@ -39,6 +39,7 @@ type whenexpr =
   | Expr_mul of whenexpr * whenexpr     (** arithmetic multiplication *)
   | Expr_div of whenexpr * whenexpr     (** arithmetic division *)
   | Expr_mod of whenexpr * whenexpr     (** arithmetic modulo *)
+  | Expr_len of whenexpr                (** length *)
   | Expr_changes of string              (** changes var *)
   | Expr_increases of string            (** increases var *)
   | Expr_decreases of string            (** decreases var *)
index 5a9ac72..ad60c0d 100644 (file)
@@ -357,6 +357,10 @@ result is subtraction, multiplication, division or modulo.
 Other types give an error.  Note that I<mod> really is an infix
 operator.
 
+=item B<len> I<expr>
+
+If I<expr> is a string, this returns the length of the string.
+
 =item I<variable>
 
 The value of the named variable.