(*********************************************************************)
(* Title:BinaryIO - Implementation     *)
(* LastEdit:"Sat Nov 10 14:57:46 1984" by Mick Jordan     *)
(* Author: Mick Jordan     *)
(* Copyright (C) 1984 by Acorn Research Centre     *)
(*********************************************************************)

 IMPLEMENTATION MODULE BinaryIO;

FROM SYSTEM IMPORT BYTESPERWORD, MOSTSIGBIT, ADR, WORD;
FROM SystemTypes IMPORT String;
IMPORT Streams; FROM Streams IMPORT Stream, ErrorCode, Put, Get, PutN, GetN;

TYPE WordPtr = POINTER TO ARRAY [0..BYTESPERWORD-1] OF CHAR;

(* --------------------- Output Procedures -------------------------------- *)

PROCEDURE WriteCHAR(s: Stream; ch: CHAR);
  BEGIN
    Put(s, ch);
  END WriteCHAR;

PROCEDURE WriteINTEGER(s : Stream;  i : INTEGER);
  VAR  wPtr: WordPtr;
    n: CARDINAL;
  BEGIN
    wPtr := ADR(i);
    n := PutN(s, wPtr, BYTESPERWORD);
  END WriteINTEGER;

PROCEDURE WriteCARDINAL(s : Stream;  c : CARDINAL);
  VAR  wPtr: WordPtr;
    n: CARDINAL;
  BEGIN
    wPtr := ADR(c);
    n := PutN(s, wPtr, BYTESPERWORD);
  END WriteCARDINAL;

PROCEDURE WriteBOOLEAN(s : Stream;  bool : BOOLEAN);
  BEGIN
    Put(s, bool);
  END WriteBOOLEAN;

PROCEDURE WriteREAL(s : Stream;  real : REAL);
  BEGIN
      WriteWORD(s, real);
  END WriteREAL;

PROCEDURE WriteBITSET(s: Stream; b: BITSET);
  VAR  wPtr: WordPtr;
    n: CARDINAL;
  BEGIN
    wPtr := ADR(b);
    n := PutN(s, wPtr, BYTESPERWORD);
  END WriteBITSET;

PROCEDURE WriteWORD(s: Stream; w: WORD);
  VAR  wPtr: WordPtr;
    n: CARDINAL;
  BEGIN
    wPtr := ADR(w);
    n := PutN(s, wPtr, BYTESPERWORD);
  END WriteWORD;

(* --------------------- Input Procedures -------------------------------- *)

PROCEDURE ReadCHAR(s: Stream): CHAR;
  BEGIN
    RETURN CHAR( Get(s) );
  END ReadCHAR;

PROCEDURE ReadINTEGER(s: Stream): INTEGER;
  VAR
    i: INTEGER;
    n: CARDINAL;
    wPtr: WordPtr;
  BEGIN
    wPtr := ADR(i);
    n := GetN(s, wPtr, BYTESPERWORD);
    RETURN i
  END ReadINTEGER;

PROCEDURE ReadCARDINAL(s: Stream): CARDINAL;
  VAR
    c: CARDINAL;
    n: CARDINAL;
    wPtr: WordPtr;
  BEGIN
    wPtr := ADR(c);
    n := GetN(s, wPtr, BYTESPERWORD);
    RETURN c
  END ReadCARDINAL;

PROCEDURE ReadBOOLEAN(s: Stream): BOOLEAN;
  BEGIN
    RETURN BOOLEAN( Get(s) );
  END ReadBOOLEAN;

PROCEDURE ReadREAL(s: Stream) : REAL;
  BEGIN
    RETURN REAL(ReadWORD(s));
  END ReadREAL;

PROCEDURE ReadBITSET(s: Stream): BITSET;
  VAR
    r: BITSET;
    n: CARDINAL;
    wPtr: WordPtr;
  BEGIN
    wPtr := ADR(r);
    n := GetN(s, wPtr, BYTESPERWORD);
    RETURN r
  END ReadBITSET;

PROCEDURE ReadWORD(s: Stream): WORD;
  VAR
    w: WORD;
    n: CARDINAL;
    wPtr: WordPtr;
  BEGIN
    wPtr := ADR(w);
    n := GetN(s, wPtr, BYTESPERWORD);
    RETURN w
  END ReadWORD;

END BinaryIO.
