X-Git-Url: http://git.annexia.org/?p=whenjobs.git;a=blobdiff_plain;f=lib%2Fwhenexpr.ml;h=2cb686346532c0420f479082fff8aa02e45210ee;hp=f24e9eda72fecebe348eea6df24b453656c15692;hb=0c9faf57f9239b0fe1c0b46353d222bb4cf5cd74;hpb=108dd86b36e82df2a2029dbd12700f9c83e501c1 diff --git a/lib/whenexpr.ml b/lib/whenexpr.ml index f24e9ed..2cb6863 100644 --- a/lib/whenexpr.ml +++ b/lib/whenexpr.ml @@ -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 @@ -82,6 +83,23 @@ type shell_script = { sh_script : string; } +type preinfo = { + pi_job_name : string; + pi_serial : Big_int.big_int; +} + +type result = { + res_job_name : string; + res_serial : Big_int.big_int; + res_code : int; + res_tmpdir : string; + res_output : string; + res_start_time : float; +} + +type pre = preinfo -> bool +type post = result -> unit + type variable = | T_unit | T_bool of bool @@ -112,6 +130,8 @@ type job_cond = type job = { job_loc : Loc.t; job_name : string; + job_pre : pre option; + job_post : post option; job_cond : job_cond; job_script : shell_script; } @@ -202,6 +222,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 +297,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 +334,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 +442,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 @@ -605,3 +635,22 @@ let next_periodexpr = let t0 = Date.make 1970 1 1 in let t' = Date.add t0 (Date.Period.month months) in Date.to_unixfloat t' + +let check_valid_variable_name name = + (* Don't permit certain names. *) + if name = "JOBSERIAL" then + failwith "JOBSERIAL variable cannot be set"; + + let len = String.length name in + if len = 0 then + failwith "variable name is an empty string"; + if name.[0] <> '_' && not (isalpha name.[0]) then + failwith "variable name must start with alphabetic character or underscore"; + + let rec loop i = + if i >= len then () + else if name.[i] <> '_' && not (isalnum name.[i]) then + failwith "variable name contains non-alphanumeric non-underscore character" + else loop (i+1) + in + loop 1