src/Pure/Concurrent/bash_sequential.ML
changeset 41001 591b6778d076
parent 39847 c1e9c6dfeff8
child 41002 cb6698d2dbaf
equal deleted inserted replaced
41000:889b7545a408 41001:591b6778d076
       
     1 (*  Title:      Pure/Concurrent/bash_sequential.ML
       
     2     Author:     Makarius
       
     3 
       
     4 Generic GNU bash processes (no provisions to propagate interrupts, but
       
     5 could work via the controlling tty).
       
     6 *)
       
     7 
       
     8 local
       
     9 
       
    10 fun read_file name =
       
    11   let val is = TextIO.openIn name
       
    12   in Exn.release (Exn.capture TextIO.inputAll is before TextIO.closeIn is) end;
       
    13 
       
    14 fun write_file name txt =
       
    15   let val os = TextIO.openOut name
       
    16   in Exn.release (Exn.capture TextIO.output (os, txt) before TextIO.closeOut os) end;
       
    17 
       
    18 in
       
    19 
       
    20 fun bash_output script =
       
    21   let
       
    22     val script_name = OS.FileSys.tmpName ();
       
    23     val _ = write_file script_name script;
       
    24 
       
    25     val output_name = OS.FileSys.tmpName ();
       
    26 
       
    27     val status =
       
    28       OS.Process.system ("exec \"$ISABELLE_HOME/lib/scripts/process\" no_group /dev/null" ^
       
    29         " script \"exec bash " ^ script_name ^ " > " ^ output_name ^ "\"");
       
    30     val rc =
       
    31       (case Posix.Process.fromStatus status of
       
    32         Posix.Process.W_EXITED => 0
       
    33       | Posix.Process.W_EXITSTATUS w => Word8.toInt w
       
    34       | Posix.Process.W_SIGNALED s => 256 + LargeWord.toInt (Posix.Signal.toWord s)
       
    35       | Posix.Process.W_STOPPED s => 512 + LargeWord.toInt (Posix.Signal.toWord s));
       
    36 
       
    37     val output = read_file output_name handle IO.Io _ => "";
       
    38     val _ = OS.FileSys.remove script_name handle OS.SysErr _ => ();
       
    39     val _ = OS.FileSys.remove output_name handle OS.SysErr _ => ();
       
    40   in (output, rc) end;
       
    41 
       
    42 end;
       
    43