src/Pure/Tools/isabelle_process.ML
author wenzelm
Fri, 14 Dec 2007 21:15:37 +0100
changeset 25631 9036ccd685b4
parent 25576 ee11881606b7
child 25748 55a458a31e37
permissions -rw-r--r--
added output protocol specification; PID: always on new line;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
25528
e67230c2b952 Isabelle process wrapper -- interaction via external program.
wenzelm
parents:
diff changeset
     1
(*  Title:      Pure/Tools/isabelle_process.ML
e67230c2b952 Isabelle process wrapper -- interaction via external program.
wenzelm
parents:
diff changeset
     2
    ID:         $Id$
e67230c2b952 Isabelle process wrapper -- interaction via external program.
wenzelm
parents:
diff changeset
     3
    Author:     Makarius
e67230c2b952 Isabelle process wrapper -- interaction via external program.
wenzelm
parents:
diff changeset
     4
e67230c2b952 Isabelle process wrapper -- interaction via external program.
wenzelm
parents:
diff changeset
     5
Isabelle process wrapper -- interaction via external program.
25631
9036ccd685b4 added output protocol specification;
wenzelm
parents: 25576
diff changeset
     6
9036ccd685b4 added output protocol specification;
wenzelm
parents: 25576
diff changeset
     7
General format of process output:
9036ccd685b4 added output protocol specification;
wenzelm
parents: 25576
diff changeset
     8
9036ccd685b4 added output protocol specification;
wenzelm
parents: 25576
diff changeset
     9
  (a) unmarked stdout/stderr, no line structure (output should be
9036ccd685b4 added output protocol specification;
wenzelm
parents: 25576
diff changeset
    10
  processed immediately as it arrives)
9036ccd685b4 added output protocol specification;
wenzelm
parents: 25576
diff changeset
    11
9036ccd685b4 added output protocol specification;
wenzelm
parents: 25576
diff changeset
    12
  (b) echo of my pid on stdout, appears *relatively* early after
9036ccd685b4 added output protocol specification;
wenzelm
parents: 25576
diff changeset
    13
  startup on a separate line, e.g. "\nPID=4711\n"
9036ccd685b4 added output protocol specification;
wenzelm
parents: 25576
diff changeset
    14
9036ccd685b4 added output protocol specification;
wenzelm
parents: 25576
diff changeset
    15
  (c) properly marked-up messages, e.g. for writeln channel
9036ccd685b4 added output protocol specification;
wenzelm
parents: 25576
diff changeset
    16
  "\002A" ^ text ^ "\002.\n" where the body text may consist of several
9036ccd685b4 added output protocol specification;
wenzelm
parents: 25576
diff changeset
    17
  lines (output should be processed in one piece).
25528
e67230c2b952 Isabelle process wrapper -- interaction via external program.
wenzelm
parents:
diff changeset
    18
*)
e67230c2b952 Isabelle process wrapper -- interaction via external program.
wenzelm
parents:
diff changeset
    19
e67230c2b952 Isabelle process wrapper -- interaction via external program.
wenzelm
parents:
diff changeset
    20
signature ISABELLE_PROCESS =
e67230c2b952 Isabelle process wrapper -- interaction via external program.
wenzelm
parents:
diff changeset
    21
sig
25554
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    22
  val test_markupN: string
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    23
  val test_markup: Markup.T -> output * output
25528
e67230c2b952 Isabelle process wrapper -- interaction via external program.
wenzelm
parents:
diff changeset
    24
  val init: unit -> unit
e67230c2b952 Isabelle process wrapper -- interaction via external program.
wenzelm
parents:
diff changeset
    25
end;
e67230c2b952 Isabelle process wrapper -- interaction via external program.
wenzelm
parents:
diff changeset
    26
e67230c2b952 Isabelle process wrapper -- interaction via external program.
wenzelm
parents:
diff changeset
    27
structure IsabelleProcess: ISABELLE_PROCESS =
e67230c2b952 Isabelle process wrapper -- interaction via external program.
wenzelm
parents:
diff changeset
    28
struct
e67230c2b952 Isabelle process wrapper -- interaction via external program.
wenzelm
parents:
diff changeset
    29
25554
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    30
(* test markup *)
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    31
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    32
val test_markupN = "test_markup";
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    33
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    34
fun test_markup (name, props) =
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    35
 (enclose "<" ">" (space_implode " " (name :: map XML.attribute props)),
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    36
  enclose "</" ">" name);
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    37
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    38
val _ = Markup.add_mode test_markupN test_markup;
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    39
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    40
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    41
(* channels *)
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    42
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    43
local
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    44
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    45
fun special c = chr 2 ^ c;
25576
ee11881606b7 special_end: replaced Z by dot;
wenzelm
parents: 25565
diff changeset
    46
val special_end = special ".";
25554
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    47
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    48
fun output c m s =
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    49
  Output.writeln_default (special c ^ Markup.enclose m s ^ special_end);
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    50
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    51
in
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    52
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    53
fun setup_channels () =
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    54
 (Output.writeln_fn  := output "A" Markup.writeln;
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    55
  Output.priority_fn := output "B" Markup.priority;
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    56
  Output.tracing_fn  := output "C" Markup.tracing;
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    57
  Output.warning_fn  := output "D" Markup.warning;
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    58
  Output.error_fn    := output "E" Markup.error;
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    59
  Output.debug_fn    := output "F" Markup.debug);
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    60
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    61
end;
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    62
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    63
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    64
(* init *)
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    65
25528
e67230c2b952 Isabelle process wrapper -- interaction via external program.
wenzelm
parents:
diff changeset
    66
fun init () =
25631
9036ccd685b4 added output protocol specification;
wenzelm
parents: 25576
diff changeset
    67
 (Output.writeln_default ("\nPID=" ^ string_of_pid (Posix.ProcEnv.getpid ()));
25554
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    68
  setup_channels ();
25528
e67230c2b952 Isabelle process wrapper -- interaction via external program.
wenzelm
parents:
diff changeset
    69
  Isar.secure_main ());
e67230c2b952 Isabelle process wrapper -- interaction via external program.
wenzelm
parents:
diff changeset
    70
e67230c2b952 Isabelle process wrapper -- interaction via external program.
wenzelm
parents:
diff changeset
    71
end;
e67230c2b952 Isabelle process wrapper -- interaction via external program.
wenzelm
parents:
diff changeset
    72