src/Pure/ML-Systems/bash.ML
author wenzelm
Wed, 22 Sep 2010 00:45:42 +0200
changeset 39583 c1e9c6dfeff8
parent 39576 48baf61cb888
permissions -rw-r--r--
more robust lib/scripts/process, with explicit script/no_script mode; added general Isabelle_System.Managed_Process, with bash_output as application; tuned;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
35010
d6e492cea6e4 renamed system/system_out to bash/bash_output -- to emphasized that this is really GNU bash, not some undefined POSIX sh;
wenzelm
parents: 29564
diff changeset
     1
(*  Title:      Pure/ML-Systems/bash.ML
26220
d34b68c21f9a common setup for system_out/system;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
d34b68c21f9a common setup for system_out/system;
wenzelm
parents:
diff changeset
     3
35010
d6e492cea6e4 renamed system/system_out to bash/bash_output -- to emphasized that this is really GNU bash, not some undefined POSIX sh;
wenzelm
parents: 29564
diff changeset
     4
Generic GNU bash processes (no provisions to propagate interrupts, but
d6e492cea6e4 renamed system/system_out to bash/bash_output -- to emphasized that this is really GNU bash, not some undefined POSIX sh;
wenzelm
parents: 29564
diff changeset
     5
could work via the controlling tty).
26220
d34b68c21f9a common setup for system_out/system;
wenzelm
parents:
diff changeset
     6
*)
d34b68c21f9a common setup for system_out/system;
wenzelm
parents:
diff changeset
     7
d34b68c21f9a common setup for system_out/system;
wenzelm
parents:
diff changeset
     8
local
d34b68c21f9a common setup for system_out/system;
wenzelm
parents:
diff changeset
     9
d34b68c21f9a common setup for system_out/system;
wenzelm
parents:
diff changeset
    10
fun read_file name =
d34b68c21f9a common setup for system_out/system;
wenzelm
parents:
diff changeset
    11
  let val is = TextIO.openIn name
26504
6e87c0a60104 before close: Exn.capture/release;
wenzelm
parents: 26220
diff changeset
    12
  in Exn.release (Exn.capture TextIO.inputAll is before TextIO.closeIn is) end;
26220
d34b68c21f9a common setup for system_out/system;
wenzelm
parents:
diff changeset
    13
d34b68c21f9a common setup for system_out/system;
wenzelm
parents:
diff changeset
    14
fun write_file name txt =
d34b68c21f9a common setup for system_out/system;
wenzelm
parents:
diff changeset
    15
  let val os = TextIO.openOut name
26504
6e87c0a60104 before close: Exn.capture/release;
wenzelm
parents: 26220
diff changeset
    16
  in Exn.release (Exn.capture TextIO.output (os, txt) before TextIO.closeOut os) end;
26220
d34b68c21f9a common setup for system_out/system;
wenzelm
parents:
diff changeset
    17
d34b68c21f9a common setup for system_out/system;
wenzelm
parents:
diff changeset
    18
in
d34b68c21f9a common setup for system_out/system;
wenzelm
parents:
diff changeset
    19
35010
d6e492cea6e4 renamed system/system_out to bash/bash_output -- to emphasized that this is really GNU bash, not some undefined POSIX sh;
wenzelm
parents: 29564
diff changeset
    20
fun bash_output script =
26220
d34b68c21f9a common setup for system_out/system;
wenzelm
parents:
diff changeset
    21
  let
d34b68c21f9a common setup for system_out/system;
wenzelm
parents:
diff changeset
    22
    val script_name = OS.FileSys.tmpName ();
d34b68c21f9a common setup for system_out/system;
wenzelm
parents:
diff changeset
    23
    val _ = write_file script_name script;
d34b68c21f9a common setup for system_out/system;
wenzelm
parents:
diff changeset
    24
d34b68c21f9a common setup for system_out/system;
wenzelm
parents:
diff changeset
    25
    val output_name = OS.FileSys.tmpName ();
d34b68c21f9a common setup for system_out/system;
wenzelm
parents:
diff changeset
    26
d34b68c21f9a common setup for system_out/system;
wenzelm
parents:
diff changeset
    27
    val status =
39583
c1e9c6dfeff8 more robust lib/scripts/process, with explicit script/no_script mode;
wenzelm
parents: 39576
diff changeset
    28
      OS.Process.system ("exec \"$ISABELLE_HOME/lib/scripts/process\" no_group /dev/null" ^
c1e9c6dfeff8 more robust lib/scripts/process, with explicit script/no_script mode;
wenzelm
parents: 39576
diff changeset
    29
        " script \"exec bash " ^ script_name ^ " > " ^ output_name ^ "\"");
26220
d34b68c21f9a common setup for system_out/system;
wenzelm
parents:
diff changeset
    30
    val rc =
d34b68c21f9a common setup for system_out/system;
wenzelm
parents:
diff changeset
    31
      (case Posix.Process.fromStatus status of
d34b68c21f9a common setup for system_out/system;
wenzelm
parents:
diff changeset
    32
        Posix.Process.W_EXITED => 0
d34b68c21f9a common setup for system_out/system;
wenzelm
parents:
diff changeset
    33
      | Posix.Process.W_EXITSTATUS w => Word8.toInt w
d34b68c21f9a common setup for system_out/system;
wenzelm
parents:
diff changeset
    34
      | Posix.Process.W_SIGNALED s => 256 + LargeWord.toInt (Posix.Signal.toWord s)
d34b68c21f9a common setup for system_out/system;
wenzelm
parents:
diff changeset
    35
      | Posix.Process.W_STOPPED s => 512 + LargeWord.toInt (Posix.Signal.toWord s));
d34b68c21f9a common setup for system_out/system;
wenzelm
parents:
diff changeset
    36
d34b68c21f9a common setup for system_out/system;
wenzelm
parents:
diff changeset
    37
    val output = read_file output_name handle IO.Io _ => "";
d34b68c21f9a common setup for system_out/system;
wenzelm
parents:
diff changeset
    38
    val _ = OS.FileSys.remove script_name handle OS.SysErr _ => ();
d34b68c21f9a common setup for system_out/system;
wenzelm
parents:
diff changeset
    39
    val _ = OS.FileSys.remove output_name handle OS.SysErr _ => ();
d34b68c21f9a common setup for system_out/system;
wenzelm
parents:
diff changeset
    40
  in (output, rc) end;
d34b68c21f9a common setup for system_out/system;
wenzelm
parents:
diff changeset
    41
d34b68c21f9a common setup for system_out/system;
wenzelm
parents:
diff changeset
    42
end;
d34b68c21f9a common setup for system_out/system;
wenzelm
parents:
diff changeset
    43