src/Pure/General/file_stream.ML
author wenzelm
Fri, 24 Jun 2022 23:31:28 +0200
changeset 75615 4494cd69f97f
child 78716 97dfba4405e3
permissions -rw-r--r--
clarified modules;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
75615
4494cd69f97f clarified modules;
wenzelm
parents:
diff changeset
     1
(*  Title:      Pure/General/file_stream.ML
4494cd69f97f clarified modules;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
4494cd69f97f clarified modules;
wenzelm
parents:
diff changeset
     3
4494cd69f97f clarified modules;
wenzelm
parents:
diff changeset
     4
File-system stream operations.
4494cd69f97f clarified modules;
wenzelm
parents:
diff changeset
     5
*)
4494cd69f97f clarified modules;
wenzelm
parents:
diff changeset
     6
4494cd69f97f clarified modules;
wenzelm
parents:
diff changeset
     7
signature FILE_STREAM =
4494cd69f97f clarified modules;
wenzelm
parents:
diff changeset
     8
sig
4494cd69f97f clarified modules;
wenzelm
parents:
diff changeset
     9
  val open_dir: (OS.FileSys.dirstream -> 'a) -> Path.T -> 'a
4494cd69f97f clarified modules;
wenzelm
parents:
diff changeset
    10
  val open_input: (BinIO.instream -> 'a) -> Path.T -> 'a
4494cd69f97f clarified modules;
wenzelm
parents:
diff changeset
    11
  val open_output: (BinIO.outstream -> 'a) -> Path.T -> 'a
4494cd69f97f clarified modules;
wenzelm
parents:
diff changeset
    12
  val open_append: (BinIO.outstream -> 'a) -> Path.T -> 'a
4494cd69f97f clarified modules;
wenzelm
parents:
diff changeset
    13
  val input: BinIO.instream -> string
4494cd69f97f clarified modules;
wenzelm
parents:
diff changeset
    14
  val input_size: int -> BinIO.instream -> string
4494cd69f97f clarified modules;
wenzelm
parents:
diff changeset
    15
  val input_all: BinIO.instream -> string
4494cd69f97f clarified modules;
wenzelm
parents:
diff changeset
    16
  val output: BinIO.outstream -> string -> unit
4494cd69f97f clarified modules;
wenzelm
parents:
diff changeset
    17
  val outputs: BinIO.outstream -> string list -> unit
4494cd69f97f clarified modules;
wenzelm
parents:
diff changeset
    18
end;
4494cd69f97f clarified modules;
wenzelm
parents:
diff changeset
    19
4494cd69f97f clarified modules;
wenzelm
parents:
diff changeset
    20
structure File_Stream: FILE_STREAM =
4494cd69f97f clarified modules;
wenzelm
parents:
diff changeset
    21
struct
4494cd69f97f clarified modules;
wenzelm
parents:
diff changeset
    22
4494cd69f97f clarified modules;
wenzelm
parents:
diff changeset
    23
(* open streams *)
4494cd69f97f clarified modules;
wenzelm
parents:
diff changeset
    24
4494cd69f97f clarified modules;
wenzelm
parents:
diff changeset
    25
local
4494cd69f97f clarified modules;
wenzelm
parents:
diff changeset
    26
4494cd69f97f clarified modules;
wenzelm
parents:
diff changeset
    27
val platform_path = ML_System.platform_path o Path.implode o Path.expand;
4494cd69f97f clarified modules;
wenzelm
parents:
diff changeset
    28
4494cd69f97f clarified modules;
wenzelm
parents:
diff changeset
    29
fun with_file open_file close_file f =
4494cd69f97f clarified modules;
wenzelm
parents:
diff changeset
    30
  Thread_Attributes.uninterruptible (fn restore_attributes => fn path =>
4494cd69f97f clarified modules;
wenzelm
parents:
diff changeset
    31
    let
4494cd69f97f clarified modules;
wenzelm
parents:
diff changeset
    32
      val file = open_file path;
4494cd69f97f clarified modules;
wenzelm
parents:
diff changeset
    33
      val result = Exn.capture (restore_attributes f) file;
4494cd69f97f clarified modules;
wenzelm
parents:
diff changeset
    34
    in close_file file; Exn.release result end);
4494cd69f97f clarified modules;
wenzelm
parents:
diff changeset
    35
4494cd69f97f clarified modules;
wenzelm
parents:
diff changeset
    36
in
4494cd69f97f clarified modules;
wenzelm
parents:
diff changeset
    37
4494cd69f97f clarified modules;
wenzelm
parents:
diff changeset
    38
fun open_dir f = with_file OS.FileSys.openDir OS.FileSys.closeDir f o platform_path;
4494cd69f97f clarified modules;
wenzelm
parents:
diff changeset
    39
fun open_input f = with_file BinIO.openIn BinIO.closeIn f o platform_path;
4494cd69f97f clarified modules;
wenzelm
parents:
diff changeset
    40
fun open_output f = with_file BinIO.openOut BinIO.closeOut f o platform_path;
4494cd69f97f clarified modules;
wenzelm
parents:
diff changeset
    41
fun open_append f = with_file BinIO.openAppend BinIO.closeOut f o platform_path;
4494cd69f97f clarified modules;
wenzelm
parents:
diff changeset
    42
4494cd69f97f clarified modules;
wenzelm
parents:
diff changeset
    43
end;
4494cd69f97f clarified modules;
wenzelm
parents:
diff changeset
    44
4494cd69f97f clarified modules;
wenzelm
parents:
diff changeset
    45
4494cd69f97f clarified modules;
wenzelm
parents:
diff changeset
    46
(* input *)
4494cd69f97f clarified modules;
wenzelm
parents:
diff changeset
    47
4494cd69f97f clarified modules;
wenzelm
parents:
diff changeset
    48
val input = Byte.bytesToString o BinIO.input;
4494cd69f97f clarified modules;
wenzelm
parents:
diff changeset
    49
fun input_size n stream = Byte.bytesToString (BinIO.inputN (stream, n));
4494cd69f97f clarified modules;
wenzelm
parents:
diff changeset
    50
val input_all = Byte.bytesToString o BinIO.inputAll;
4494cd69f97f clarified modules;
wenzelm
parents:
diff changeset
    51
4494cd69f97f clarified modules;
wenzelm
parents:
diff changeset
    52
4494cd69f97f clarified modules;
wenzelm
parents:
diff changeset
    53
(* output *)
4494cd69f97f clarified modules;
wenzelm
parents:
diff changeset
    54
4494cd69f97f clarified modules;
wenzelm
parents:
diff changeset
    55
fun output file txt = BinIO.output (file, Byte.stringToBytes txt);
4494cd69f97f clarified modules;
wenzelm
parents:
diff changeset
    56
val outputs = List.app o output;
4494cd69f97f clarified modules;
wenzelm
parents:
diff changeset
    57
4494cd69f97f clarified modules;
wenzelm
parents:
diff changeset
    58
end;