src/Pure/System/system_channel.ML
author wenzelm
Fri, 17 Apr 2015 22:15:35 +0200
changeset 60125 2944cc4f4f56
parent 59350 acba5d6fdb2f
child 60982 67e389f67073
permissions -rw-r--r--
tuned spelling;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
45029
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
     1
(*  Title:      Pure/System/system_channel.ML
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
     3
59350
acba5d6fdb2f discontinued fifo channel, always use portable socket;
wenzelm
parents: 54345
diff changeset
     4
Socket-based system channel for inter-process communication.
45029
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
     5
*)
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
     6
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
     7
signature SYSTEM_CHANNEL =
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
     8
sig
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
     9
  type T
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    10
  val input_line: T -> string option
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    11
  val inputN: T -> int -> string
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    12
  val output: T -> string -> unit
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    13
  val flush: T -> unit
59350
acba5d6fdb2f discontinued fifo channel, always use portable socket;
wenzelm
parents: 54345
diff changeset
    14
  val rendezvous: string -> T
45029
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    15
end;
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    16
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    17
structure System_Channel: SYSTEM_CHANNEL =
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    18
struct
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    19
59350
acba5d6fdb2f discontinued fifo channel, always use portable socket;
wenzelm
parents: 54345
diff changeset
    20
datatype T = System_Channel of BinIO.instream * BinIO.outstream;
45029
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    21
59350
acba5d6fdb2f discontinued fifo channel, always use portable socket;
wenzelm
parents: 54345
diff changeset
    22
fun input_line (System_Channel (in_stream, _)) =
45029
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    23
  let
50800
c0fb2839d1a9 recovered buffered sockets from 11f622794ad6 -- requires Poly/ML 5.5.x;
wenzelm
parents: 45158
diff changeset
    24
    fun result cs = String.implode (rev (#"\n" :: cs));
45029
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    25
    fun read cs =
50800
c0fb2839d1a9 recovered buffered sockets from 11f622794ad6 -- requires Poly/ML 5.5.x;
wenzelm
parents: 45158
diff changeset
    26
      (case BinIO.input1 in_stream of
c0fb2839d1a9 recovered buffered sockets from 11f622794ad6 -- requires Poly/ML 5.5.x;
wenzelm
parents: 45158
diff changeset
    27
        NONE => if null cs then NONE else SOME (result cs)
c0fb2839d1a9 recovered buffered sockets from 11f622794ad6 -- requires Poly/ML 5.5.x;
wenzelm
parents: 45158
diff changeset
    28
      | SOME b =>
c0fb2839d1a9 recovered buffered sockets from 11f622794ad6 -- requires Poly/ML 5.5.x;
wenzelm
parents: 45158
diff changeset
    29
          (case Byte.byteToChar b of
c0fb2839d1a9 recovered buffered sockets from 11f622794ad6 -- requires Poly/ML 5.5.x;
wenzelm
parents: 45158
diff changeset
    30
            #"\n" => SOME (result cs)
c0fb2839d1a9 recovered buffered sockets from 11f622794ad6 -- requires Poly/ML 5.5.x;
wenzelm
parents: 45158
diff changeset
    31
          | c => read (c :: cs)));
45029
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    32
  in read [] end;
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    33
59350
acba5d6fdb2f discontinued fifo channel, always use portable socket;
wenzelm
parents: 54345
diff changeset
    34
fun inputN (System_Channel (in_stream, _)) n =
acba5d6fdb2f discontinued fifo channel, always use portable socket;
wenzelm
parents: 54345
diff changeset
    35
  if n = 0 then ""  (*workaround for polyml-5.5.1 or earlier*)
acba5d6fdb2f discontinued fifo channel, always use portable socket;
wenzelm
parents: 54345
diff changeset
    36
  else Byte.bytesToString (BinIO.inputN (in_stream, n));
acba5d6fdb2f discontinued fifo channel, always use portable socket;
wenzelm
parents: 54345
diff changeset
    37
acba5d6fdb2f discontinued fifo channel, always use portable socket;
wenzelm
parents: 54345
diff changeset
    38
fun output (System_Channel (_, out_stream)) s =
acba5d6fdb2f discontinued fifo channel, always use portable socket;
wenzelm
parents: 54345
diff changeset
    39
  BinIO.output (out_stream, Byte.stringToBytes s);
acba5d6fdb2f discontinued fifo channel, always use portable socket;
wenzelm
parents: 54345
diff changeset
    40
acba5d6fdb2f discontinued fifo channel, always use portable socket;
wenzelm
parents: 54345
diff changeset
    41
fun flush (System_Channel (_, out_stream)) =
acba5d6fdb2f discontinued fifo channel, always use portable socket;
wenzelm
parents: 54345
diff changeset
    42
  BinIO.flushOut out_stream;
acba5d6fdb2f discontinued fifo channel, always use portable socket;
wenzelm
parents: 54345
diff changeset
    43
acba5d6fdb2f discontinued fifo channel, always use portable socket;
wenzelm
parents: 54345
diff changeset
    44
fun rendezvous name =
45029
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    45
  let
50800
c0fb2839d1a9 recovered buffered sockets from 11f622794ad6 -- requires Poly/ML 5.5.x;
wenzelm
parents: 45158
diff changeset
    46
    val (in_stream, out_stream) = Socket_IO.open_streams name;
c0fb2839d1a9 recovered buffered sockets from 11f622794ad6 -- requires Poly/ML 5.5.x;
wenzelm
parents: 45158
diff changeset
    47
    val _ = BinIO.StreamIO.setBufferMode (BinIO.getOutstream out_stream, IO.BLOCK_BUF);
59350
acba5d6fdb2f discontinued fifo channel, always use portable socket;
wenzelm
parents: 54345
diff changeset
    48
  in System_Channel (in_stream, out_stream) end;
45029
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    49
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    50
end;
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    51