src/Pure/General/file.ML
changeset 6640 d2e8342bf5c3
parent 6318 4a423e8a0b54
child 7129 7e0ec1b293c3
--- a/src/Pure/General/file.ML	Wed May 12 16:51:52 1999 +0200
+++ b/src/Pure/General/file.ML	Wed May 12 16:52:28 1999 +0200
@@ -9,7 +9,6 @@
 sig
   val sys_pack_fn: (Path.T -> string) ref
   val sys_unpack_fn: (string -> Path.T) ref
-  val use: Path.T -> unit
   val rm: Path.T -> unit
   val cd: Path.T -> unit
   val pwd: unit -> Path.T
@@ -23,6 +22,9 @@
   val info: Path.T -> info option
   val exists: Path.T -> bool
   val mkdir: Path.T -> unit
+  val source: Path.T -> (string, string list) Source.source * Position.T
+  val plain_use: Path.T -> unit
+  val symbol_use: Path.T -> unit
 end;
 
 structure File: FILE =
@@ -37,8 +39,6 @@
 fun sysify path = ! sys_pack_fn (Path.expand path);
 fun unsysify s = ! sys_unpack_fn s;
 
-
-val use = use o sysify;
 val rm = OS.FileSys.remove o sysify;
 
 
@@ -93,4 +93,34 @@
 fun mkdir path = (execute ("mkdir -p " ^ enclose "'" "'" (sysify path)); ());
 
 
+(* source *)
+
+fun source raw_path =
+  let val path = Path.expand raw_path
+  in (Source.of_string (read path), Position.line_name 1 (quote (Path.pack path))) end;
+
+
+(* symbol_use *)
+
+val plain_use = use o sysify;
+
+(* version of 'use' with input filtering *)
+
+val symbol_use =
+  if not needs_filtered_use then plain_use	(*ML system (wrongly!) accepts non-ASCII*)
+  else
+    fn path =>
+      let
+        val txt = read path;
+        val txt_out = Symbol.input txt;
+      in
+        if txt = txt_out then plain_use path
+        else
+          let val tmp_path = tmp_path path in
+            write tmp_path txt_out;
+            plain_use tmp_path handle exn => (rm tmp_path; raise exn);
+            rm tmp_path
+          end
+      end;
+
 end;