--- a
+++ b/Streams.ISO.mi
@@ -0,0 +1,273 @@
+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.