(********************************************************************** :Program. ErrorMsg.mod :Contents. Read all errormessages from M2:Fehlermeldungen :Author. Steffen Reith :Address. Hessenstr. 64, D-8700 Wuerzburg :Phone. None :Copyright. Shareware :Language. Modula-2 :Translator. M2Amiga A+L V3.2d :Imports. Msg :History. V1.0 14.June 1990 :History. V1.1 24.June 1990 ( Better Memory Usage ) :History V1.2 23.Oct 1990 ( Improved loading speed ) **********************************************************************) IMPLEMENTATION MODULE ErrorMsg; FROM Files IMPORT Open,Close,FileDes,Seek,Read1,Front,Current,FileModes, WhereIAm,Read; FROM SYSTEM IMPORT ADR,ADDRESS,BYTE; FROM Heap IMPORT Allocate,Deallocate; FROM Msg IMPORT EndRequest; CONST ErrName='M2:Fehler-Meldungen'; (* Nur deutsche Version *) TYPE NodePtr=POINTER TO Node; Node=RECORD No:INTEGER; Entry:ADDRESS; NextNode:NodePtr END; VAR CurrentPtr:NodePtr; PROCEDURE KillList(Root:NodePtr); VAR Help:NodePtr; BEGIN WHILE Root#NIL DO Help:=Root; Root:=Root^.NextNode; Deallocate(Help^.Entry); Deallocate(ADDRESS(Help)) END END KillList; PROCEDURE ReadLongInt(File:FileDes):LONGINT; VAR Value:LONGINT; BEGIN Read(File,ADR(Value),SIZE(Value)); RETURN(Value) END ReadLongInt; PROCEDURE ReadErrorNumber(File:FileDes):INTEGER; VAR Value:INTEGER; BEGIN Read(File,ADR(Value),SIZE(Value)); RETURN(Value) END ReadErrorNumber; PROCEDURE ReadString(File:FileDes;Next:LONGINT;VAR Text:ADDRESS); VAR Aktuell,Laenge:LONGINT; BEGIN Aktuell:=WhereIAm(File); Laenge:=Next-Aktuell; Allocate(Text,Laenge); IF Text=NIL THEN EndRequest('Nicht genug Speicher fuer Fehlermeldungen') END; Read(File,Text,Laenge) END ReadString; PROCEDURE ReadList(VAR Root:NodePtr); VAR File:FileDes; Help:NodePtr; Ptr:ADDRESS; Next,Dummy:LONGINT; Meldung,Name:String; ErrorNo:INTEGER; BEGIN Root:=NIL; Name:=ErrName; File:=Open(Name,read); IF File=NIL THEN EndRequest('Kann Fehlermeldungsdatei nicht oeffnen') END; LOOP Next:=ReadLongInt(File); IF Next=0 THEN EXIT END; ErrorNo:=ReadErrorNumber(File); ReadString(File,Next,Ptr); Allocate(ADDRESS(Help),SIZE(Node)); IF Help=NIL THEN EndRequest('Nicht genug Speicher fuer Errorliste') END; WITH Help^ DO No:=ErrorNo; Entry:=Ptr; NextNode:=Root END; Root:=Help; Seek(File,Next,Front) END; CurrentPtr:=Root; (* Global !! *) Close(File) END ReadList; PROCEDURE NextEntry():NodePtr; BEGIN IF CurrentPtr^.NextNode#NIL THEN CurrentPtr:=CurrentPtr^.NextNode; RETURN CurrentPtr ELSE RETURN NIL END END NextEntry; PROCEDURE Cp(Ptr:ADDRESS;VAR Text:String); TYPE CharPtr=POINTER TO CHAR; VAR ChPtr:CharPtr; i:INTEGER; BEGIN i:=0; ChPtr:=Ptr; WHILE (ChPtr^#CHAR(0)) AND (i<=len) DO Text[i]:=ChPtr^; INC(i); INC(ChPtr,SIZE(ChPtr^)) END; IF i>len THEN Text[i-1]:=CHAR(0) ELSE Text[i]:=CHAR(0) END END Cp; PROCEDURE FindMsg (Root:NodePtr;Nummer:CARDINAL;VAR Msg:String); VAR Help:NodePtr; BEGIN CurrentPtr:=Root; REPEAT Help:=NextEntry(); IF Help^.No=INTEGER(Nummer) THEN Cp(Help^.Entry,Msg); RETURN END UNTIL Help=NIL; Msg:='' END FindMsg; BEGIN END ErrorMsg.