(**********************************************************************

:Program.    NewInOut.def
:Contens.    Ein Bibliotheksmodul für gepufferte Ein- und Ausgabe.
:Contens.    Kompatibel zu InOut.
:Author.     Bernd Braun
:Address.    Lippestr. 11, D-3300 Braunschweig
:Phone.      0531/845498
:Copyright.  Public Domain
:Language.   Modula-2
:Translator. M2Amiga A+L V3.3d
:Support.    Tooltype-Übergabe nach Amiga 12/89 S.86f. Andreas Görtler.
:History.    V1.0 25.Sep.1989 Erste lauffähige Version
:History.    V1.1 26.Apr.1990 Kosmetische Verbesserungen
:History.    V1.2 26.Sep.1990 Tooltypeübergabe implementiert

***********************************************************************)

DEFINITION MODULE NewInOut;

   IMPORT ASCII;

   TYPE
      FILE;
      (* opaker Datentyp zur Unterstützung beliebiger DOS-Files. *)
      Modus = ( ModeOld, ModeNew );
      (* File-Modus für Open.
         ModeOld: Eröffnen eines alten Files zum Lesen. Besteht es
                  schon wird es überschrieben.
         ModeNew: Eröffnen eines neuen Files zum Lesen und Schreiben. *)

   CONST
      eol = ASCII.eol;

   VAR
      done            : BOOLEAN;
      (* TRUE, wenn letzte Operation erfolgreich. FALSE, sonst. *)
      stdin, stdout   : FILE;
      (* Standart Ein- und Ausgabe-Files. *)
      waitCloseGadget : BOOLEAN;
      (* Aus Kompatibilitatsgründen zum Modul Terminal. *)

   (* Öffnen eines beliebigen Amiga-DOS Files. *)
   PROCEDURE Open ( Datei : ARRAY OF CHAR; modus : Modus ) : FILE;

   (* Öffnen eines neuen Ausgabefiles anstelle stdout. In Datei steht das
      zu öffnende Amiga-DOS File. Ist Datei leer wird ein Filename per
      Tastatur angefragt.
      Änderung gegenüber InOut:
         - In Datei darf keine Extention wie '.mod' stehen sondern der
           Dateiname oder ein Leerstring.
         - Der Dateiname kann vorher ggf. mit ReadString eingegeben
           werden. *)
   PROCEDURE OpenOutput ( Datei : ARRAY OF CHAR );

   (* Öffnen eines neuen Ausgabefiles anstelle stdin. In Datei steht das
      zu öffnende Amiga-DOS File. Ist Datei leer wird ein Filename per
      Tastatur angefragt.
      Änderung gegenüber InOut:
         - In Datei darf keine Extention wie '.mod' stehen sondern der
           Dateiname oder ein Leerstring.
         - Der Dateiname kann vorher ggf. mit ReadString eingegeben
           werden. *)
   PROCEDURE OpenInput ( Datei : ARRAY OF CHAR );

   (* Schließen eines geöffneten Files. *)
   PROCEDURE Close ( file : FILE );

   (* Schließen eines geöffneten Ausgabefiles und Wiedereinsetzen von
      stdout. *)
   PROCEDURE CloseOutput;

   (* Schließen eines geöffneten Eingabefiles und Wiedereinsetzen von
      stdin. *)
   PROCEDURE CloseInput;

   (* Rückgabe eines Zeichens aus stdin mit Hilfe von ReadFile. *)
   PROCEDURE Read ( VAR c : CHAR );

   (* Schreiben eines Zeichens in stdout mit Hilfe von WriteFile. *)
   PROCEDURE Write ( c : CHAR );

   (* Schreiben einer neuen Zeile in stdout mit Hilfe von WriteLnFile. *)
   PROCEDURE WriteLn;

   (* Schreiben einer neuen Zeile in File mit Hilfe von WriteFile. *)
   PROCEDURE WriteLnFile ( file : FILE );

   (* Rückgabe des ersten Zeichens im Eingabepuffer. Ist er leer werden
      neue Zeichen aus file gelesen und im Eingabepuffer gespeichert. *)
   PROCEDURE ReadFile ( file : FILE; VAR c : CHAR );

   (* Speichern eines Zeichens im Ausgabepuffer von file. Ist er voll
      werden alle Zeichen im Ausgabepuffer in file geschrieben. *)
   PROCEDURE WriteFile ( file : FILE; c : CHAR );

   (* Schreiben eines String in stdout mit Hilfe von WriteStringFile. *)
   PROCEDURE WriteString ( Text : ARRAY OF CHAR );

   (* Schreiben eines Strings in file. *)
   PROCEDURE WriteStringFile ( file : FILE; Text : ARRAY OF CHAR );

   (* Eingabe eines Strings aus file. *)
   PROCEDURE ReadString ( VAR Text : ARRAY OF CHAR );

   (* Eingabe eines Strings aus stdin mit Hilfe von ReadStringFile. *)
   PROCEDURE ReadStringFile ( file : FILE; VAR Text : ARRAY OF CHAR );

   (* Schreiben aller Zeichen im Output-Puffer in file. *)
   PROCEDURE FlushOutput ( file : FILE );

   (* Eingabe eines Cardinal aus stdin mit Hilfe von ReadCardFile. *)
   PROCEDURE ReadCard ( VAR Card : CARDINAL );

   (* Eingabe eines Cardinal aus file. *)
   PROCEDURE ReadCardFile ( file : FILE; VAR Card : CARDINAL );

   (* Eingabe eines LongCardinal aus stdin mit Hilfe von ReadCardFile. *)
   PROCEDURE ReadLongCard ( VAR Card : LONGCARD );

   (* Eingabe eines LongCardinal aus file. *)
   PROCEDURE ReadLongCardFile ( file : FILE; VAR Card : LONGCARD );

   (* Eingabe eines Integer aus stdin mit Hilfe von ReadCardFile. *)
   PROCEDURE ReadInt ( VAR Int : INTEGER );

   (* Eingabe eines Integer aus file. *)
   PROCEDURE ReadIntFile ( file : FILE; VAR Int : INTEGER );

   (* Eingabe eines LongInteger aus stdin mit Hilfe von ReadCardFile. *)
   PROCEDURE ReadLongInt ( VAR Int : LONGINT );

   (* Eingabe eines LongInteger aus file. *)
   PROCEDURE ReadLongIntFile ( file : FILE; VAR Int : LONGINT );

   (* Schreiben eines Cardinal oder LongCardinal in stdout mit der
      Feldbreite Feld mit Hilfe von WriteCardFile.
      Ist Feld positiv rechtsbündig, bei negativ linksbündig.*)
   PROCEDURE WriteCard ( Card : LONGCARD; Feld : INTEGER );

   (* Schreiben eines Cardinal oder LongCardinal in file mit der
      Feldbreite Feld.
      Ist Feld positiv rechtsbündig, bei negativ linksbündig.*)
   PROCEDURE WriteCardFile ( file : FILE;
                             Card : LONGCARD;
                             Feld : INTEGER );

   (* Schreiben eines Integer oder LongInteger in stdout mit der
      Feldbreite Feld mit Hilfe von WriteCardFile.
      Ist Feld positiv rechtsbündig, bei negativ linksbündig.*)
   PROCEDURE WriteInt ( Int : LONGINT; Feld : INTEGER );

   (* Schreiben eines Integer oder LongInteger in file mit der
      Feldbreite Feld.
      Ist Feld positiv rechtsbündig, bei negativ linksbündig.*)
   PROCEDURE WriteIntFile ( file : FILE;
                            Int  : LONGINT;
                            Feld : INTEGER );

   (* Schreiben eines Cardinal oder LongCardinal als HexZahl in stdout
      mit der Feldbreite Feld mit Hilfe von WriteHexFile.
      Ist Feld positiv rechtsbündig, bei negativ linksbündig.*)
   PROCEDURE WriteHex ( Hex : LONGCARD; Feld : INTEGER );

   (* Schreiben eines Cardinal oder LongCardinal als HexZahl in file mit
      der Feldbreite Feld.
      Ist Feld positiv rechtsbündig, bei negativ linksbündig.*)
   PROCEDURE WriteHexFile ( file : FILE;
                            Hex  : LONGCARD;
                            Feld : INTEGER );

END NewInOut.
