(* -------------------------------------------------------------------------
  :Program.       PortPrint
  :Author.        Kai Bolay
  :Address.       Hoffmannstraße 168, 7250 Leonberg
  :Phone.         07152/22135
  :History.       v1.0 Initial
  :Copyright.     Freeware (maybe a claim by Markt & Technik)
  :Language.      Modula-2
  :Translator.    M2Amiga 3.3d
  :Contents.      PortPrint's main output Program
------------------------------------------------------------------------- *)
MODULE PortPrint;

FROM SYSTEM      IMPORT ADR;
FROM Terminal    IMPORT WriteString, WriteLn, waitCloseGadget;
FROM Str         IMPORT Length, Compare;
FROM Arts        IMPORT Assert, DetectCtrlC;
FROM Exec        IMPORT FindPort, MsgPortPtr, WaitPort, GetMsg, MessagePtr,
                        FreeMem, Message, Forbid, Permit;
FROM ExecSupport IMPORT CreatePort, DeletePort;
FROM PortInOut   IMPORT PortName, SendText;

CONST Copyright = "This is PortPrint by K. Bolay (Idea: Achim Albert)";
      Install   = "PortPrint installed!";
      Remove    = "PortPrint removed";
      Quit      = "!¡!QUIT!¡!";

VAR PortPtr : MsgPortPtr;
    MsgPtr  : MessagePtr;
    TextPtr : POINTER TO ARRAY [0..999] OF CHAR;

BEGIN
   DetectCtrlC (FALSE);
   WriteString (Copyright); WriteLn;
   Forbid;
   PortPtr := FindPort (ADR (PortName));
   IF PortPtr = NIL THEN
      PortPtr := CreatePort (ADR (PortName), 0);
      Permit;
      Assert (PortPtr # NIL, ADR ("Can't create Port!"));
      waitCloseGadget := FALSE;
      WriteString (Install); WriteLn;
      LOOP
         WaitPort (PortPtr);
         MsgPtr := GetMsg (PortPtr);
         IF MsgPtr # NIL THEN
            TextPtr := MsgPtr^.node.name;
            IF TextPtr # NIL THEN
               Forbid;
               IF Compare (TextPtr^, Quit) = 0 THEN
                  DeletePort (PortPtr);
                  Permit;
                  PortPtr := NIL;
                  FreeMem (TextPtr, Length (TextPtr^) + 1);
                  FreeMem (MsgPtr, SIZE (Message));
                  EXIT;
               ELSE
                  Permit;
                  WriteString (TextPtr^);
                  FreeMem (TextPtr, Length (TextPtr^) + 1);
                  FreeMem (MsgPtr, SIZE (Message));
               END; (* IF *)
            END; (* IF *)
            WriteLn;
            MsgPtr := NIL;
         END; (* IF *)
      END; (* LOOP *)
   ELSE
      Permit;
      SendText (Quit);
      WriteString (Remove); WriteLn;
   END; (* IF *)
END PortPrint.
