IMPLEMENTATION MODULE Streams;
(*------------------------------------------------------------------------*)
(* Interface between ISO M2 and Michael Riedls Streams Module *)
(* *)
(* Letzte Veraenderung: *)
(* *)
(* 05.02.16, MRi: Erstellen der ersten Version *)
(* 03.11.17, MRi: Erstellen der ersten Version *)
(* 13.01.18, MRi: Umstellen von LONGLONGCARD auf CommonIO.FilePtr *)
(*------------------------------------------------------------------------*)
(* Offene Punkte: *)
(* *)
(* - Testen, Testen, Testen *)
(* - Get/SetPos eventuell aus FileSystem direkt uebernehmen *)
(*------------------------------------------------------------------------*)
(* Licence : GNU Lesser General Public License (LGPL) *)
(*------------------------------------------------------------------------*)
(* $Id: Streams.mod,v 1.1 2017/11/03 22:49:37 mriedl Exp $ *)
IMPORT SYSTEM;
IMPORT Errors;
FROM FileSystem IMPORT File; (* File ist Platzhalter *)
(*
IMPORT FileSystem;
*)
IMPORT CommonIO;
IMPORT ChanConsts;
IMPORT IOChan;
IMPORT RndFile;
IMPORT SeqFile;
IMPORT IOResult;
IMPORT IOConsts;
FROM ChanConsts IMPORT ChanFlags, (* readFlag,writeFlag,oldFlag,textFlag *)
OpenResults; (* opened *)
IMPORT TIO;
CONST MaxDateiNamenLaenge = 255; (* _POSIX_PATH_MAX *)
PROCEDURE OpenStream(VAR Str : Stream;
DatName : ARRAY OF CHAR; (* Dateiname *)
creat : BOOLEAN);
VAR flags : ChanConsts.FlagSet;
res : ChanConsts.OpenResults;
BEGIN
flags:=ChanConsts.FlagSet{};
IF creat THEN
INCL(flags,ChanConsts.writeFlag);
INCL(flags,ChanConsts.rawFlag);
SeqFile.OpenWrite(Str,DatName,flags,res);
IF (res # opened) THEN
(* Datei existiert, also oeffnen und abschneiden *)
INCL(flags,ChanConsts.oldFlag);
SeqFile.OpenWrite(Str,DatName,flags,res);
SeqFile.Rewrite(Str);
END;
ELSE
INCL(flags,ChanConsts.textFlag);
INCL(flags,ChanConsts.rawFlag);
INCL(flags,ChanConsts.readFlag);
INCL(flags,ChanConsts.oldFlag);
SeqFile.OpenRead(Str,DatName,flags,res);
END;
IF (res # opened) THEN (* Ausarbeiten ... *)
Errors.WriteLn;
Errors.WriteString(" *** Datei '");
Errors.WriteString(DatName);
Errors.WriteString(
"' konne nicht geoeffnet werden (Streams.OpenStream) ***");
Errors.WriteLn;
Errors.WriteLn;
END;
END OpenStream;
PROCEDURE CloseStream(VAR Str : Stream);
BEGIN
SeqFile.Close(Str);
END CloseStream;
PROCEDURE ConnectStream(VAR Str : Stream;
f : File);
VAR name : ARRAY [0..MaxDateiNamenLaenge-1] OF CHAR;
BEGIN
IOChan.GetName(f,name);
Errors.WriteLn;
Errors.WriteString("Streams.ConnectStream not implemented (Stream = ");
Errors.WriteString(name);
Errors.WriteChar(")");
Errors.WriteLn;
Errors.WriteLn;
END ConnectStream;
PROCEDURE CloseAll();
BEGIN
Errors.ErrOut("Streams.CloseAll not implemented");
END CloseAll;
PROCEDURE SetWrite(VAR Str : Stream);
VAR Name : ARRAY [0..MaxDateiNamenLaenge-1] OF CHAR;
pos : RndFile.FilePos;
res : ChanConsts.OpenResults;
BEGIN
IOChan.GetName(Str,Name);
(***
Errors.WriteLn;
Errors.WriteString("Streams.SetWrite not implemented (Stream = ");
Errors.WriteString(name);
Errors.WriteChar(")");
Errors.WriteLn;
Errors.WriteLn;
***)
IOChan.GetName(Str,Name);
pos := RndFile.CurrentPos(Str);
SeqFile.Close(Str);
SeqFile.OpenWrite(Str,Name,SeqFile.write,res);
RndFile.SetPos(Str,pos);
END SetWrite;
PROCEDURE SetRead(VAR Str : Stream);
VAR Name : ARRAY [0..MaxDateiNamenLaenge-1] OF CHAR;
pos : RndFile.FilePos;
res : ChanConsts.OpenResults;
BEGIN
IOChan.GetName(Str,Name);
Errors.WriteLn;
Errors.WriteString("Streams.SetRead not implemented (Stream = ");
Errors.WriteString(Name);
Errors.WriteChar(")");
Errors.WriteLn;
Errors.WriteLn;
(***
IOChan.GetName(Str,Name);
pos := RndFile.CurrentPos(Str);
SeqFile.Close(Str);
SeqFile.OpenRead(Str,Name,SeqFile.read,res);
RndFile.SetPos(Str,pos);
***)
END SetRead;
PROCEDURE ReWrite(VAR Str : Stream);
BEGIN
SeqFile.Rewrite(Str); (* Geht das gut ??? *)
END ReWrite;
(*
* PROCEDURE Append(VAR Datei : Stream);
*
* (*----------------------------------------------------------------*)
* (* Versetzt die ge"offnete Datei Datei in Schreibmodus und stellt *)
* (* den Dateizeiger an das Dateiende. *)
* (*----------------------------------------------------------------*)
*
* BEGIN (* Mu3 noch installiert werden ! *)
* END Append;
*)
PROCEDURE WriteBuffer(VAR Str : Stream);
BEGIN
IOChan.Flush(Str);
END WriteBuffer;
PROCEDURE ReSet(VAR Str : Stream);
BEGIN
IOChan.Reset(Str);
END ReSet;
PROCEDURE GetPos(VAR Str : Stream;
VAR Pos : LONGCARD);
VAR pos : RndFile.FilePos;
pt : POINTER TO CommonIO.FilePrt;
BEGIN
pos:=RndFile.CurrentPos(Str);
pt:=SYSTEM.ADR(pos);
Pos:=VAL(LONGCARD,pt^);
END GetPos;
PROCEDURE SetPos(VAR Str : Stream;
Pos : LONGCARD);
VAR pos : RndFile.FilePos;
apos : POINTER TO RndFile.FilePos;
ptll : POINTER TO CommonIO.FilePrt;
pll : CommonIO.FilePrt;
BEGIN
(* Holla die Waldfee - schaut hier bitte nicht hin ... *)
(* alles durch die gaaaanz kalte Kueche. *)
pos:=RndFile.StartPos(Str);
ptll:=SYSTEM.ADR(pos);
ptll^:=ptll^ + VAL(CommonIO.FilePrt,Pos);
pll:=ptll^;
apos:=SYSTEM.ADR(pll);
RndFile.SetPos(Str,apos^);
END SetPos;
PROCEDURE IsEOL(str : Stream) : BOOLEAN;
VAR res : IOConsts.ReadResults;
BEGIN
res := IOResult.ReadResult(str);
IF (res = IOConsts.endOfLine) THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END;
END IsEOL;
PROCEDURE IsEOF(str : Stream) : BOOLEAN;
VAR res : IOConsts.ReadResults;
BEGIN
res := IOResult.ReadResult(str);
IF (res = IOConsts.endOfInput) THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END;
END IsEOF;
PROCEDURE GetChar(VAR Datei : Stream;
VAR Char : CHAR);
VAR i : CARDINAL;
Name : ARRAY [0..MaxDateiNamenLaenge-1] OF CHAR;
ch: CHAR;
res: IOConsts.ReadResults;
BEGIN
(*
IOChan.RawRead(Datei,SYSTEM.ADR(Char),1,i);
IF IsEOL(Datei) THEN
Char := CommonIO.EoL;
ELSIF IsEOF(Datei) THEN
Char := CommonIO.EoF;
ELSIF (i # 1) THEN
IOChan.GetName(Datei,Name);
Errors.WriteString(" *** Lesefehler auf Datei '");
Errors.WriteString(Name);
Errors.WriteString("' in Streams.GetChar ***");
Errors.WriteLn;
END;
(* Schau nach ob wir am Ende der Datei angekommen sind ... *)
IOChan.Look(Datei,ch,res);
*)
IOChan.Look(Datei,Char,res);
IF (res = IOConsts.allRight) THEN
IOChan.Skip(Datei);
ELSIF (res = IOConsts.endOfLine) THEN
Char := CommonIO.EoL;
IOChan.Skip(Datei);
ELSIF (res = IOConsts.endOfInput) THEN
Char := CommonIO.EoF;
IOChan.SetReadResult(Datei,IOConsts.endOfInput);
END;
END GetChar;
PROCEDURE PutChar(VAR Datei : Stream;
Char : CHAR);
BEGIN
IOChan.RawWrite(Datei,SYSTEM.ADR(Char),1);
END PutChar;
END Streams.