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

    :Program.    ErrorReq.mod
    :Contents.   Requesters or Messages to handle Errors, Warnings...
    :Author.     Nicolas Benezan [bne]
    :Address.    Postwiesenstr. 2, D7000 Stuttgart 60
    :Phone.      711/333679
    :Copyright.  Public Domain
    :Language.   Modula-2
    :Translator. M2Amiga AMSoft 3.2d
    :History.    V1.0b [bne] 27.Jan.1989 (extracted from MemSystem1.1)
    :History.    V1.1a [bne] 27.Jan.1989 (YesNoReq. modified, m2cV3.2)
    :History.    V1.2b [bne] 12.Feb.1989 (+ Assert)
    :History.    V1.3b [bne] 16.May.1989 (bug fixed, -Str)

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

IMPLEMENTATION MODULE ErrorReq;

FROM SYSTEM     IMPORT ADDRESS, ADR;
FROM Arts       IMPORT Terminate, CurrentLevel, Requester, wbStarted;
FROM Dos        IMPORT Write, Output;
IMPORT ASCII;

CONST   ReqWidth=320;
        ReqHeight=72;

PROCEDURE YesNoRequest(BodyText,PositiveText,NegativeText:ADDRESS):BOOLEAN;
BEGIN
  RETURN Requester(ADR(ErrHeader),BodyText,PositiveText,NegativeText);
END YesNoRequest;

PROCEDURE RecoverableExit(ReqBody,PosText,NegText:ADDRESS);
BEGIN
  IF NOT YesNoRequest(ReqBody,PosText,NegText) THEN
    ExitQuiet;
  END;
END RecoverableExit;

PROCEDURE DeadEndExit(ReqBody:ADDRESS);
VAR     Dummy:BOOLEAN;
BEGIN
  Dummy:=YesNoRequest(ReqBody,NIL,ADR(ABORT));
  ExitQuiet;
END DeadEndExit;

(*нннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн*)
(* Assert CLI: writes message to current window WB: Requester           *)
(*нннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн*)
PROCEDURE Assert(Condition:BOOLEAN;Text:ADDRESS);
VAR     Ok:LONGINT;
        TextPtr:POINTER TO ARRAY [0..31] OF CHAR;
        LineFeed:ARRAY [0..0] OF CHAR;

  PROCEDURE Length(String:ARRAY OF CHAR):INTEGER;
    VAR
      Len:INTEGER;
    BEGIN
      Len:=0;
      WHILE (Len<=HIGH(String)) AND (String[Len]#ASCII.nul) DO
        INC(Len);
      END;
      RETURN Len;
    END Length;

BEGIN
  IF NOT Condition THEN
    IF wbStarted THEN
      DeadEndExit(Text);
    ELSE
      TextPtr:=Text;
      LineFeed[0]:=ASCII.lf;
      Ok:=Write(Output(),ADR(AssertMessage),Length(AssertMessage));
      IF Ok>0 THEN
        Ok:=Write(Output(),ADR(TextPtr^),Length(TextPtr^));
        IF Ok>0 THEN
          Ok:=Write(Output(),ADR(LineFeed),1);
        END;
      END;
      ExitQuiet;
    END;
  END;
END Assert;

PROCEDURE ExitQuiet;
BEGIN
  Terminate(CurrentLevel());
END ExitQuiet;

BEGIN
  ErrHeader:="Modula-2 Error Handler";
  AssertMessage:="Break (Assert): ";
END ErrorReq.
