|##########| |#MAGIC #|CLABLLCN |#PROJECT #|"" |#PATHS #|"StdProject" |#FLAGS #|-x---x--x-x-x-x----------------- |#USERSW #|-------------------------------- |#USERMASK#|-------------------------------- |#SWITCHES#|x----xxxxx-xx--- |##########| |==============================================================================| | Modul : Streams | | Autor : Thomas Pfrengle | | Datum : 27.9.1991 | | Verwendung : Schreib- u. Lesefunktionen für Zeichenströme | | Bemerkungen: not Betatested | | Änderungen : - | |==============================================================================| DEFINITION MODULE Streams; FROM Resources IMPORT ContextPtr; FROM ASCII IMPORT cr,lf,eof,sp,ff; EXCEPTION NoInputStream : "Stream is not an inputstream"; NoOutputStream : "Stream is not an outputstream"; StreamNotInteractive : "Stream is not an interactive one"; AppendNotPossible : "Append not posssible"; WrongNumOfQuotes : "Incorrect number of quotation marks"; GROUP ExceptionGrp = NoInputStream,NoOutputStream,StreamNotInteractive, AppendNotPossible,WrongNumOfQuotes; TYPE Stream = HIDDEN; VAR CurrentInput, CurrentOutput : Stream; (*===================== Global Streamhandling ================================*) | | Funktion : Öffnet einen Eingabestrom. | Parameter : handle => Zugriff auf den Strom | name <= Name der Datei, die als Strom geöffnet werden | soll | buffSize <= größe des Eingabepuffers | context <=> Kontext, zu dem der Strom geöffnet werden soll | PROCEDURE OpenInputStream(VAR handle : Stream; REF name : STRING; buffSize : LONGINT := 256; context : ContextPtr := NIL); | | Funktion : Öffnet einen Ausgabestrom. | Parameter : handle => Zugriff auf den Strom | name <= Name der Datei, die als Strom geöffnet werden | soll | buffSize <= größe des Schreibpuffers | context <=> Kontext, zu dem der Strom geöffnet werden soll | PROCEDURE OpenOutputStream(VAR handle : Stream; REF name : STRING; append : BOOLEAN := FALSE; writeLnBuffer: BOOLEAN := TRUE; buffSize : LONGINT := 256; context : ContextPtr := NIL); | | Funktion : Öffnet einen Strom, der zur ein und Ausgabe dient. | Parameter : handle => Zugriff auf den Strom | name <= Name der Datei, die als Strom geöffnet werden | soll | buffSize <= größe des Ein/Ausgabepuffers | context <=> Kontext, zu dem der Strom geöffnet werden soll | Bemerkung : Bei einem Schreibzugriff, wird der Eingabepuffer gelöscht. | PROCEDURE OpenInOutStream(VAR handle : Stream; REF name : STRING; writeLnBuffer : BOOLEAN := TRUE; buffSize : LONGINT := 256; context : ContextPtr :=NIL); DEFINITION MODULE CustomStreams(Handle : ANYPTR); TYPE ReadProc = PROCEDURE(VAR c : CHAR;handle : Handle); WriteProc = PROCEDURE(c : CHAR;handle : Handle); CloseProc = PROCEDURE(handle : Handle); | | Funktion : Öffnet einen Kundenstrom. | Parameter : handle => Zugriff auf den Strom | customIn <= Lesezugriff, der der übergebenen Leseroutine | übergeben wird. | customOut <= Schreibzugriff, der der übergebenen Schreibroutine | übergeben wird. | read <= Leseroutine, mit der alle Lesefunktionen, | implementiert werden. | write <= Schreibroutine, mit der alle Schreibfunktionen, | implementiert werden. | close <= Wird beim schließen dieses Stromes zweimal | aufgerufen, das erste Mal mit `customIn`, | das zweite mal mit `customOut`. | echo <= gibt an, ob bei einem Aufruf von `read`, das | gelesene Zeichen gleich daruf mit `write`, | ausgegeben werden soll. | context <=> Kontext, zu dem der Strom geöffnet werden soll | PROCEDURE OpenCustomStream(VAR handle : Stream; customIn, customOut : Handle := NIL; read : ReadProc := NIL; write : WriteProc := NIL; close : CloseProc := NIL; echo : BOOLEAN := FALSE; context : ContextPtr:= NIL); END CustomStreams; | | Funktion : Schließt einen Strom | Parameter : handle <= Zugriff auf den Strom, der geschlossen werden soll | PROCEDURE CloseStream(VAR handle : Stream); | | Funktion : Mach den übergebenen Strom zum `CurrentInput` | Parameter : handle <= Zugriff auf den Strom, der `CurrentInput` | werden soll. | PROCEDURE SetCurrentInput(handle : Stream); | | Funktion : Macht den übergebenen Strom zum `CurrentOutput` | Parameter : handle <= Zugriff auf den Strom, der `CurrentOutput` | werden soll. | PROCEDURE SetCurrentOutput(handle : Stream); | | Funktion : Ermittelt, ob es sich bei dem übergebenen Strom | um einen interaktiven handelt. | Parameter : handle <= Zugriff auf den Strom, der geprüft werden soll | => TRUE wenn er interaktiv ist. | PROCEDURE IsInterActive(handle : Stream):BOOLEAN; GROUP GlobalGrp = OpenInputStream,OpenOutputStream,OpenInOutStream,CustomStreams, CloseStream,SetCurrentInput,SetCurrentOutput,Stream,CurrentInput, CurrentOutput,Stream; (*======================= Read ===============================================*) | Verzichted man beim Aufruf der Read-Prozeduren auf die Übergabe des | Zugriffes auf einen Strom, wird der aktuelle CurrentInput bemnutzt. | Ist dieser NIL, wird ein Console-Fenster geöffnet TYPE Termination = ARRAY [8] OF CHAR; CharPtr = POINTER TO CHAR; | | Funktion : Ließt ein Zeichen aus einem Strom | Parameter : c => gelesenes Zeichen | handle <= Strom, von dem gelesen werden soll. | PROCEDURE Read(VAR c : CHAR; handle : Stream :=NIL); | | Funktion : Liefert das jeweils nächste Zeichen im Strom, ohne die | Leseposition zu verschieben. | Parameter : handle <= Strom, auf den zugegriffen werden soll. | => nächstes Zeichen im Strom. | PROCEDURE NextChar(handle : Stream :=NIL):CHAR; | | Funktion : Ließt eine Anzahl Zeichen aus einem Strom, an eine | bestimmte Speicherstelle. | Parameter : pos => Position im Speicher, ab der die gelesenen | Zeichen abgelegt werden sollen. | len <= Anzahl der zu lesenden Zeichen. | handle <= Strom, von dem gelesen werden soll. | PROCEDURE ReadBytes(pos : ANYPTR; len : LONGINT; handle : Stream :=NIL); | | Funktion : Ließt einen beliebigen Type fester Länge aus einem Strom. | Parameter : block => Variable mit fester Länge, die gelesen werden soll. | handle <= Strom, von dem gelesen werden soll. | PROCEDURE ReadBlock(VAR block : ANYTYPE; handle : Stream :=NIL); | | Funktion : Ließt eine Anzahl Zeichen aus einem Strom, an eine | bestimmte Speicherstelle, bis eine Maximalzahl erreicht ist, | oder ein bestimmtes Zeichen gelesen wurde. | Parameter : pos => Position im Speicher, ab der die gelesenen | Zeichen abgelegt werden sollen. | maxLen <= Maximale Anzahl der zu lesenden Zeichen. | terms <= Array mit den Zeichen, die das Einlesen abbrechen sollen | handle <= Strom, von dem gelesen werden soll. | => Anzahl der tatsächlich gelesenen Zeichen | PROCEDURE ReadCharsTerminated(pos : CharPtr; maxLen : LONGINT; terms := Termination:(sp,lf,cr,ff,eof,eof,eof,eof); handle : Stream :=NIL):LONGINT; | | Funktion : Ließt einen String aus einem Strom bis eine Maximalzahl | erreicht ist oder ein bestimmtes Zeichen gelesen wurde. | Parameter : str => String, der gelesenen werden soll. | terms <= Array mit den Zeichen, die das Einlesen | abbrechen sollen | quotedFlag <= Gibt an, ob Leerzeichen bei der Eingabe | beachted werden. Siehe Handbuch. | handle <= Strom, von dem gelesen werden soll. | PROCEDURE ReadString(VAR str : STRING; terms := Termination:(sp,lf,cr,ff,eof,eof,eof,eof); quotedFlag : BOOLEAN :=TRUE; handle : Stream :=NIL); | | Funktion : Liefert das Zeichen, durch das die letzte Eingabe | abgebrochen wurde. | Parameter : handle <= Strom, auf den zugegriffen werden soll. | => Zeichen, das den Abbruch verursachte. | PROCEDURE TermChar(handle : Stream := NIL):CHAR; | | Funktion : Gibt an, ob in der letzten Eingabe ein `"` Enthalten war. | Parameter : handle <= Strom, auf den zugegriffen werden soll. | => TRUE, wenn ein `"` enthalten war. | PROCEDURE WasQuoted(handle : Stream :=NIL):BOOLEAN; GROUP ReadGrp = Termination,CharPtr,Read,NextChar,ReadBytes,ReadBlock, ReadCharsTerminated,TermChar,WasQuoted; (*======================= Write ==============================================*) | Verzichted man beim Aufruf der Write-Prozeduren auf die Übergabe des | Zugriffes auf einen Strom, wird der aktuelle CurrentOutput bemnutzt. | Ist dieser NIL, wird ein Console-Fenster geöffnet | | Funktion : Schreibt ein Zeichen in einem Strom | Parameter : c <= zu schreibendes Zeichen | handle <= Strom, von in den geschrieben werden soll. | PROCEDURE Write(c : CHAR; handle : Stream := NIL); | | Funktion : Schreibt eine Anzahl Zeichen von einer bestimmten | Speicherstelle aus in einem Strom. | Parameter : pos => Position im Speicher, von der ab | geschrieben werden soll. | len <= Anzahl der zu schreibenden Zeichen. | handle <= Strom, von dem gelesen werden soll. | PROCEDURE WriteBytes(pos : ANYPTR; len : LONGINT; handle : Stream :=NIL); | | Funktion : Schreibt einen beliebigen Type fester Länge in einen Strom. | Parameter : block <= Variable, deren Inhalt geschrieben werden soll. | handle <= Strom, in den geschrieben werden soll. | PROCEDURE WriteBlock(REF block : ANYTYPE; handle : Stream := NIL); | | Funktion : Schreibt einen String in einem Strom. | Parameter : str <= String, der geschrieben werden soll. | handle <= Strom, in dem geschrieben werden soll. | PROCEDURE WriteString(REF str : STRING; handle : Stream :=NIL); | | Funktion : Führt zur augenblicklichen Ausgabe des Ausgabepuffers | Parameter : handle <= Strom, dessen Puffer ausgegeben werden soll | PROCEDURE CustomWriteBuffer(handle : Stream); GROUP WriteGrp = Write,WriteBytes,WriteBlock,WriteString,CustomWriteBuffer; All = WriteGrp,ExceptionGrp,GlobalGrp,ReadGrp; END Streams.