IMPLEMENTATION MODULE LongInOut;

(** ------------------------------------------------------------------

               Commodore Amiga long type input/output module

      (c) Copyright 1986 Modula-2 Software Ltd.  All Rights Reserved
      (c) Copyright 1986 TDI Software, Inc.      All Rights Reserved

    ------------------------------------------------------------------ **)


(* VERSION FOR COMMODORE AMIGA

     Original Author : Paul Curtis, Modula-2 Software Ltd.  11-Jul-86

     Version         : 0.00a  11-Jul-86  Paul Curtis, Modula-2 Software Ltd.
                         Original

  *)




  (*$S-,$T-,$Q+*)

  FROM Conversions IMPORT ConvertToString, ConvertFromString;
  FROM InOut IMPORT ReadString, WriteStringRight;
  IMPORT InOut;

  PROCEDURE Len(VAR s: ARRAY OF CHAR): CARDINAL;
  VAR i: CARDINAL;
  BEGIN
    i := 0;
    WHILE (i <= HIGH(s)) & (s[i] # 0C) DO INC(i) END;
    RETURN i;
  END Len;

  PROCEDURE ReadLongInt(VAR x: LONGINT);
  VAR lx: LONGCARD;
    s: ARRAY [0..31] OF CHAR;
  BEGIN
    ReadString(s);
    Done := InOut.Done;
    IF Done THEN
      ConvertFromString(s,10,TRUE,07FFFFFFFH,lx,Done);
      IF Done THEN x := LONGINT(lx) END
    END
  END ReadLongInt;

  PROCEDURE ReadLongCard(VAR x: LONGCARD);
  VAR lx: LONGCARD;
    s: ARRAY [0..31] OF CHAR;
  BEGIN
    ReadString(s);
    Done := InOut.Done;
    IF Done THEN
      ConvertFromString(s,10,FALSE,0FFFFFFFFH,lx,Done);
      IF Done THEN x := lx END
    END
  END ReadLongCard;

  PROCEDURE WriteLongInt(x: LONGINT; n: CARDINAL);
  VAR s: ARRAY [0..39] OF CHAR;
    done: BOOLEAN;
  BEGIN
    ConvertToString(LONGCARD(ABS(x)),10,x<0,s,done);
    WriteStringRight(s,n);
    Done := InOut.Done;
  END WriteLongInt;

  PROCEDURE WriteLongCard(x: LONGCARD; n: CARDINAL);
  VAR s: ARRAY [0..39] OF CHAR;
    done: BOOLEAN;
  BEGIN
    ConvertToString(x,10,FALSE,s,done);
    WriteStringRight(s,n);
    Done := InOut.Done;
  END WriteLongCard;

  PROCEDURE WriteLongOct(x: LONGCARD; n: CARDINAL);
  VAR s: ARRAY [0..39] OF CHAR;
    l: CARDINAL;
    done: BOOLEAN;
  BEGIN
    ConvertToString(x,8,FALSE,s,done);
    l := Len(s);
    s[l] := "B"; s[l+1] := 0C;
    WriteStringRight(s,n);
    Done := InOut.Done;
  END WriteLongOct;

  PROCEDURE WriteLongHex(x: LONGCARD; n: CARDINAL);
  VAR s: ARRAY [0..39] OF CHAR;
    l: CARDINAL;
    done: BOOLEAN;
  BEGIN
    ConvertToString(x,16,FALSE,s,done);
    l := Len(s);
    s[l] := "H"; s[l+1] := 0C;
    WriteStringRight(s,n);
    Done := InOut.Done;
  END WriteLongHex;


END LongInOut.
