# HG changeset patch # User wenzelm # Date 1219944597 -7200 # Node ID e4b569b53e104c6832a574637ccd74195373db0e # Parent 4d05f04cc671e0f2358943fde4f428a0459044bf explicit output stream, typically a named pipe; diff -r 4d05f04cc671 -r e4b569b53e10 src/Pure/Tools/isabelle_process.ML --- a/src/Pure/Tools/isabelle_process.ML Thu Aug 28 19:29:56 2008 +0200 +++ b/src/Pure/Tools/isabelle_process.ML Thu Aug 28 19:29:57 2008 +0200 @@ -24,7 +24,7 @@ sig val isabelle_processN: string val xmlN: string - val init: unit -> unit + val init: string -> unit end; structure IsabelleProcess: ISABELLE_PROCESS = @@ -70,10 +70,13 @@ else message_pos ts | get_pos _ = NONE; +fun output out_stream s = NAMED_CRITICAL "IO" (fn () => + (TextIO.output (out_stream, s); TextIO.output (out_stream, "\n"); TextIO.flushOut out_stream)); + in -fun message _ _ "" = () - | message ch class body = +fun message _ _ _ "" = () + | message out_stream ch class body = let val (txt, pos) = let val ts = YXML.parse_body body @@ -81,37 +84,44 @@ val props = Position.properties_of (Position.thread_data ()) |> Position.default_properties pos; - in Output.writeln_default (special ch ^ message_props props ^ txt ^ special_end) end; + in output out_stream (special ch ^ message_props props ^ txt ^ special_end) end; -fun init_message () = +fun init_message out_stream = let val pid = (Markup.pidN, string_of_pid (Posix.ProcEnv.getpid ())); val session = (Markup.sessionN, List.last (Session.id ()) handle List.Empty => "unknown"); val text = message_text Markup.initN [XML.Text (Session.welcome ())]; - in Output.writeln_default (special "H" ^ message_props [pid, session] ^ text ^ special_end) end; + in output out_stream (special "H" ^ message_props [pid, session] ^ text ^ special_end) end; end; (* channels *) -fun setup_channels () = - (Output.writeln_fn := message "A" Markup.writelnN; - Output.priority_fn := message "B" Markup.priorityN; - Output.tracing_fn := message "C" Markup.tracingN; - Output.warning_fn := message "D" Markup.warningN; - Output.error_fn := message "E" Markup.errorN; - Output.debug_fn := message "F" Markup.debugN; - Output.prompt_fn := message "G" Markup.promptN; - Output.status_fn := message "I" Markup.statusN); +fun setup_channels out = + let val out_stream = + if out = "" orelse out = "-" then TextIO.stdOut + else + let val path = File.platform_path (Path.explode out) + in TextIO.openOut path (* before OS.FileSys.remove path *) end; + in + Output.writeln_fn := message out_stream "A" Markup.writelnN; + Output.priority_fn := message out_stream "B" Markup.priorityN; + Output.tracing_fn := message out_stream "C" Markup.tracingN; + Output.warning_fn := message out_stream "D" Markup.warningN; + Output.error_fn := message out_stream "E" Markup.errorN; + Output.debug_fn := message out_stream "F" Markup.debugN; + Output.prompt_fn := message out_stream "G" Markup.promptN; + Output.status_fn := message out_stream "I" Markup.statusN; + out_stream + end; (* init *) -fun init () = +fun init out = (change print_mode (update (op =) isabelle_processN); - setup_channels (); - init_message (); + setup_channels out |> init_message; Isar.toplevel_loop {init = true, welcome = false, sync = true, secure = true}); end;