(*********************************************************************)
(* Title:	NullStream - Implementation			     *)
(* LastEdit:	"Tue Nov 13 16:42:58 1984" by Mick Jordan	     *)
(* Author: 	Mick Jordan					     *)
(* 		Copyright (C) 1984 by Acorn Research Centre	     *)
(*********************************************************************)

IMPLEMENTATION MODULE NullStream;
FROM SYSTEM IMPORT WORD, ADDRESS;
FROM SystemTypes IMPORT LongCARDINAL, LongINTEGER;
FROM Streams IMPORT
  ErrorCode, Stream, StreamProcs, Create, SeekMode, OptionalFunction;
FROM StreamRep IMPORT Procs, DefaultProcs;

VAR
  procsInstance: Procs;

PROCEDURE Put(s: Stream; w: WORD);
  BEGIN
    
  END Put;

PROCEDURE PutN(s: Stream; a: ADDRESS; n: CARDINAL): CARDINAL;
  BEGIN
    RETURN n;
  END PutN;

PROCEDURE Get(s: Stream): WORD;
  BEGIN
    s^.status := EndOfStream;
    RETURN WORD(0);
  END Get;

PROCEDURE GetN(s: Stream; a: ADDRESS; n: CARDINAL): CARDINAL;
  BEGIN
    s^.status := EndOfStream;
    RETURN 0;
  END GetN;

PROCEDURE Backspace(s: Stream);
  BEGIN
    s^.status := EndOfStream;
  END Backspace;

PROCEDURE Implements(s: Stream; f: OptionalFunction): BOOLEAN;
  BEGIN
    RETURN TRUE;
  END Implements;

PROCEDURE Seek(s: Stream; m: SeekMode; n: LongINTEGER);
  BEGIN
    
  END Seek;

PROCEDURE Tell(s: Stream; VAR n: LongCARDINAL);
  BEGIN
    n := 0;
  END Tell;

PROCEDURE Ignore(s: Stream);
  BEGIN
    
  END Ignore;

PROCEDURE Initialise(): Procs;
  VAR
    procs: Procs;
  BEGIN
    procs := DefaultProcs(0);
    procs^.Put := Put; procs^.PutN := PutN;
    procs^.Get := Get; procs^.GetN := GetN;
    procs^.Seek := Seek; procs^.Tell := Tell;
    procs^.Backspace := Backspace; procs^.Delete := Ignore;
    procs^.Flush := Ignore; procs^.Implements := Implements;
    RETURN procs;
  END Initialise;

PROCEDURE CreateInOutput(): Stream;
  BEGIN
    RETURN Create(StreamProcs(procsInstance), 0);
  END CreateInOutput;

BEGIN
  procsInstance := Initialise();
END NullStream.
