summaryrefslogtreecommitdiff
path: root/ocaml-binary-annot/ocamlbuild/configuration.ml
diff options
context:
space:
mode:
Diffstat (limited to 'ocaml-binary-annot/ocamlbuild/configuration.ml')
-rw-r--r--ocaml-binary-annot/ocamlbuild/configuration.ml70
1 files changed, 70 insertions, 0 deletions
diff --git a/ocaml-binary-annot/ocamlbuild/configuration.ml b/ocaml-binary-annot/ocamlbuild/configuration.ml
new file mode 100644
index 0000000000..7a4f2f4fbd
--- /dev/null
+++ b/ocaml-binary-annot/ocamlbuild/configuration.ml
@@ -0,0 +1,70 @@
+(***********************************************************************)
+(* ocamlbuild *)
+(* *)
+(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *)
+(* *)
+(* Copyright 2007 Institut National de Recherche en Informatique et *)
+(* en Automatique. All rights reserved. This file is distributed *)
+(* under the terms of the Q Public License version 1.0. *)
+(* *)
+(***********************************************************************)
+
+
+(* Original author: Nicolas Pouillard *)
+open My_std
+open Log
+open Lexers
+
+type t = Lexers.conf
+
+let acknowledge_config config =
+ List.iter
+ (fun (_, config) -> List.iter Param_tags.acknowledge config.plus_tags)
+ config
+
+let cache = Hashtbl.create 107
+let (configs, add_config) =
+ let configs = ref [] in
+ (fun () -> !configs),
+ (fun config ->
+ acknowledge_config config;
+ configs := config :: !configs;
+ Hashtbl.clear cache)
+
+let parse_string s =
+ let conf = Lexers.conf_lines None 1 (Printf.sprintf "string: %S" s) (Lexing.from_string s) in
+ add_config conf
+
+let parse_file ?dir file =
+ try
+ with_input_file file begin fun ic ->
+ let conf = Lexers.conf_lines dir 1 (Printf.sprintf "file: %S" file) (Lexing.from_channel ic) in
+ add_config conf
+ end
+ with Lexers.Error msg -> raise (Lexers.Error (file ^ ": " ^ msg))
+
+let key_match = Glob.eval
+
+let apply_config s (config : t) init =
+ List.fold_left begin fun tags (key, v) ->
+ if key_match key s then
+ List.fold_right Tags.add v.plus_tags (List.fold_right Tags.remove v.minus_tags tags)
+ else tags
+ end init config
+
+let apply_configs s = List.fold_right (apply_config s) (configs ()) Tags.empty
+
+let tags_of_filename s =
+ try Hashtbl.find cache s
+ with Not_found ->
+ let res = apply_configs s in
+ let () = Hashtbl.replace cache s res in
+ res
+
+let has_tag tag = Tags.mem tag (tags_of_filename "")
+
+let tag_file file tags =
+ if tags <> [] then parse_string (Printf.sprintf "%S: %s" file (String.concat ", " tags));;
+
+let tag_any tags =
+ if tags <> [] then parse_string (Printf.sprintf "true: %s" (String.concat ", " tags));;