src/Pure/Tools/isabelle_process.ML
author wenzelm
Sun, 30 Dec 2007 23:07:27 +0100
changeset 25748 55a458a31e37
parent 25631 9036ccd685b4
child 25810 bac99880fa99
permissions -rw-r--r--
added PROMPT message;
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
25748
55a458a31e37 added PROMPT message;
wenzelm
parents: 25631
diff changeset
    24
  val isabelle_processN: string
25528
e67230c2b952 Isabelle process wrapper -- interaction via external program.
wenzelm
parents:
diff changeset
    25
  val init: unit -> unit
e67230c2b952 Isabelle process wrapper -- interaction via external program.
wenzelm
parents:
diff changeset
    26
end;
e67230c2b952 Isabelle process wrapper -- interaction via external program.
wenzelm
parents:
diff changeset
    27
e67230c2b952 Isabelle process wrapper -- interaction via external program.
wenzelm
parents:
diff changeset
    28
structure IsabelleProcess: ISABELLE_PROCESS =
e67230c2b952 Isabelle process wrapper -- interaction via external program.
wenzelm
parents:
diff changeset
    29
struct
e67230c2b952 Isabelle process wrapper -- interaction via external program.
wenzelm
parents:
diff changeset
    30
25748
55a458a31e37 added PROMPT message;
wenzelm
parents: 25631
diff changeset
    31
(* test_markup *)
25554
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    32
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    33
val test_markupN = "test_markup";
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    34
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    35
fun test_markup (name, props) =
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    36
 (enclose "<" ">" (space_implode " " (name :: map XML.attribute props)),
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    37
  enclose "</" ">" name);
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    38
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    39
val _ = Markup.add_mode test_markupN test_markup;
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    40
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    41
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    42
(* channels *)
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    43
25748
55a458a31e37 added PROMPT message;
wenzelm
parents: 25631
diff changeset
    44
val isabelle_processN = "isabelle_process";
55a458a31e37 added PROMPT message;
wenzelm
parents: 25631
diff changeset
    45
25554
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    46
local
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    47
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    48
fun special c = chr 2 ^ c;
25576
ee11881606b7 special_end: replaced Z by dot;
wenzelm
parents: 25565
diff changeset
    49
val special_end = special ".";
25554
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    50
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    51
fun output c m s =
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    52
  Output.writeln_default (special c ^ Markup.enclose m s ^ special_end);
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    53
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    54
in
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    55
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    56
fun setup_channels () =
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    57
 (Output.writeln_fn  := output "A" Markup.writeln;
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    58
  Output.priority_fn := output "B" Markup.priority;
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    59
  Output.tracing_fn  := output "C" Markup.tracing;
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    60
  Output.warning_fn  := output "D" Markup.warning;
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    61
  Output.error_fn    := output "E" Markup.error;
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    62
  Output.debug_fn    := output "F" Markup.debug);
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    63
25748
55a458a31e37 added PROMPT message;
wenzelm
parents: 25631
diff changeset
    64
val _ = Markup.add_mode isabelle_processN (fn (name, _) =>
55a458a31e37 added PROMPT message;
wenzelm
parents: 25631
diff changeset
    65
  if name = Markup.promptN then (special "G", special_end ^ "\n")
55a458a31e37 added PROMPT message;
wenzelm
parents: 25631
diff changeset
    66
  else ("", ""));
55a458a31e37 added PROMPT message;
wenzelm
parents: 25631
diff changeset
    67
25554
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    68
end;
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    69
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    70
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    71
(* init *)
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    72
25528
e67230c2b952 Isabelle process wrapper -- interaction via external program.
wenzelm
parents:
diff changeset
    73
fun init () =
25631
9036ccd685b4 added output protocol specification;
wenzelm
parents: 25576
diff changeset
    74
 (Output.writeln_default ("\nPID=" ^ string_of_pid (Posix.ProcEnv.getpid ()));
25554
082d97057e23 added test_markup;
wenzelm
parents: 25528
diff changeset
    75
  setup_channels ();
25748
55a458a31e37 added PROMPT message;
wenzelm
parents: 25631
diff changeset
    76
  change print_mode (update (op =) isabelle_processN);
25528
e67230c2b952 Isabelle process wrapper -- interaction via external program.
wenzelm
parents:
diff changeset
    77
  Isar.secure_main ());
e67230c2b952 Isabelle process wrapper -- interaction via external program.
wenzelm
parents:
diff changeset
    78
e67230c2b952 Isabelle process wrapper -- interaction via external program.
wenzelm
parents:
diff changeset
    79
end;
e67230c2b952 Isabelle process wrapper -- interaction via external program.
wenzelm
parents:
diff changeset
    80