src/Pure/System/options.ML
changeset 48698 2585042b1a30
parent 48456 d8ff14f44a40
child 51942 527e39becafc
--- a/src/Pure/System/options.ML	Mon Aug 06 17:54:05 2012 +0200
+++ b/src/Pure/System/options.ML	Mon Aug 06 21:11:42 2012 +0200
@@ -14,6 +14,10 @@
   val string: T -> string -> string
   val declare: {name: string, typ: string, value: string} -> T -> T
   val decode: XML.body -> T
+  val default: unit -> T
+  val set_default: T -> unit
+  val reset_default: unit -> unit
+  val load_default: unit -> unit
 end;
 
 structure Options: OPTIONS =
@@ -72,5 +76,31 @@
   fold (declare o (fn (name, typ, value) => {name = name, typ = typ, value = value}))
     (let open XML.Decode in list (triple string string string) end body) empty;
 
+
+
+(** global default **)
+
+val global_default = Synchronized.var "Options.default" (NONE: T option);
+
+fun default () =
+  (case Synchronized.value global_default of
+    SOME options => options
+  | NONE => error "No global default options");
+
+fun set_default options = Synchronized.change global_default (K (SOME options));
+fun reset_default () = Synchronized.change global_default (K NONE);
+
+fun load_default () =
+  (case getenv "ISABELLE_PROCESS_OPTIONS" of
+    "" => ()
+  | name =>
+      let val path = Path.explode name in
+        (case try File.read path of
+          SOME s => (set_default (decode (YXML.parse_body s)); ignore (try File.rm path))
+        | NONE => ())
+      end);
+
+val _ = load_default ();
+
 end;