(*--------------------------------------------------------------------------
 :Program.    DiskInOut.mod
 :Author.     Marcus Stratmann
 :Address.    Böttcherstraße 13, D-4250 Bottrop-Kirchhellen
 :Phone.      02045/5191
 :Copyright.  Public Domain
 :Language.   MODULA-II
 :Translator. M2Amiga v3.3d
 :Support.    Modified some procedures taken from "InOut2" (Amok#12) by
 :Support.    Bernd Preusing
 :History.    V1.0,  26-Sep-89
 :History.    V1.1,  16-May-90
 :Contents.   Manages the input and output on disk
 --------------------------------------------------------------------------*)

IMPLEMENTATION MODULE DiskInOut;  (* $S- $R- $V- $F- *)

FROM ASCII       IMPORT nul, eol, eof;
FROM Conversions IMPORT ValToStr, StrToVal;
FROM FileSystem  IMPORT File, Lookup, Close, WriteBytes, ReadBytes, GetPos,
                        SetPos, WriteChar, ReadChar, done;
FROM Scan        IMPORT ScanString;
FROM SYSTEM      IMPORT ADR, CAST;

CONST
  BufferSize = 2000;

VAR
  InFile, OutFile: File;
  termCh: CHAR;


PROCEDURE SetInput(name: ARRAY OF CHAR);

  BEGIN
    Lookup(InFile, name, BufferSize, FALSE);
    Done := (InFile.res = done);
  END SetInput;


PROCEDURE SetOutput(name: ARRAY OF CHAR);

  BEGIN
    Lookup(OutFile, name, BufferSize, TRUE);
    Done := (OutFile.res = done)
  END SetOutput;


PROCEDURE CloseInput;

  BEGIN
    Close(InFile);
  END CloseInput;


PROCEDURE CloseOutput;

  BEGIN
    Close(OutFile);
  END CloseOutput;


PROCEDURE WriteString(str: ARRAY OF CHAR);

  VAR len, act : LONGINT;

  BEGIN
    len := 0;
    WHILE (len <= HIGH(str)) AND (str[len] # nul) DO
      INC(len)
    END;
    WriteBytes(OutFile, ADR(str), len, act);
    Done := (len = act);
  END WriteString;


PROCEDURE WriteLn;

  BEGIN
    WriteChar(OutFile, eol);
    Done := (OutFile.res = done);
  END WriteLn;


PROCEDURE ReadLn(VAR str: ARRAY OF CHAR; VAR len: INTEGER);

  TYPE CharPtr = POINTER TO CHAR;

  VAR Pos, i, actlen: LONGINT;
      cp: CharPtr;

  BEGIN
    GetPos(InFile, Pos);
    ReadBytes(InFile, ADR(str), HIGH(str)+1, actlen);
    IF actlen <= 0 THEN
      Done := FALSE;
      termCh := eof;
      len := 0;
      str[0] := nul
    ELSE
      i := 0; (* $V- $R- *)
      cp := CAST(CharPtr, ADR(str));
      WHILE (i < actlen) AND (cp^ # eol) DO INC(i); INC(cp) END;
      IF i < actlen THEN
        cp^ := nul;
        termCh := eol
      ELSE
        termCh := cp^;
      END;
      (* $V= $R= *)
      SetPos(InFile, Pos + i + 1);
      len := i;
      Done := TRUE;
    END;
  END ReadLn;


PROCEDURE WriteInt(x: LONGINT; n: INTEGER);

  VAR str: ARRAY[0..99] OF CHAR;

  BEGIN
    ValToStr(x, TRUE, str, 10, n, ' ', Done);
    Done := NOT Done;
    IF Done THEN
      WriteString(str)
    END
  END WriteInt;


PROCEDURE ReadByte(VAR ch: CHAR);

  BEGIN
    ReadChar(InFile, ch);
    IF InFile.eof OR (InFile.res # done) THEN
      Done := FALSE;
      ch := eof;
    ELSE
      Done:=TRUE
    END;
  END ReadByte;


PROCEDURE ReadString(VAR str: ARRAY OF CHAR);

  VAR len: INTEGER;

  BEGIN
    ScanString(ReadByte, str, len, termCh);
    Done := (len # 0)
  END ReadString;


PROCEDURE ReadInt(VAR x: INTEGER);

  VAR str: ARRAY[0..99] OF CHAR;
      l:LONGINT;
      signed: BOOLEAN;

  BEGIN
    ReadString(str);
    StrToVal(str, l, signed, 10, Done);
    Done:= (NOT Done) AND (signed AND (l >= MIN(INTEGER)) OR
                  (CAST(LONGCARD, l) <= CAST(LONGCARD, MAX(INTEGER))));
    IF Done THEN
      x := l
    END;
  END ReadInt;


END DiskInOut.
