(*---------------------------------------------------------------------------
    :Program.    Print.mod
    :Author.     Fridtjof Siebert
    :Address.    Nobileweg 67, D-7-Stgt-40
    :Phone.      0711/822509
    :Shortcut.   [fbs]
    :Version.    1.0
    :Date.       01-Aug-88
    :Copyright.  PD
    :Language.   Modula-II
    :Translator. M2Amiga
    :Imports.    PrinterSupport
    :UpDate.     none.
    :Contents.   Programm, das einen Text mit Perforationskipping ausdruckt.
    :Remark.     Usage: Print <File>
---------------------------------------------------------------------------*)

MODULE Print;

(*------  ImportList:  ------*)

FROM SYSTEM         IMPORT ADR, ADDRESS;
FROM Arts           IMPORT TermProcedure, Terminate;

FROM Dos            IMPORT Open, Close, Read, Write, newFile, oldFile,
                           FileHandlePtr;
FROM Exec           IMPORT AllocMem, FreeMem, MemReqs, MemReqSet, UByte;
FROM Printer        IMPORT sgr3, sgr23, sgr4, sgr24, sgr1, sgr22, shorp2,
                           shorp1, shorp4, shorp3, shorp6, shorp5, den4,
                           den3, sus2, sus1, sus4, sus3, verp0, verp1, slpp,
                           perf;

FROM Arguments      IMPORT NumArgs, GetArg;

FROM PrinterSupport IMPORT OpenPrinter, WritePrinter, PrintCommand,
                           ClosePrinter;

TYPE
  LineSpacings = (sixlpi,eightlpi);

(* Set these constants to whatever you like: *)

CONST
  italics      = FALSE;
  underline    = FALSE;
  boldface     = FALSE;
  elite        = FALSE;
  condensed    = TRUE;
  enlarged     = FALSE;
  doublestrike = FALSE;
  superscript  = FALSE;
  subscript    = FALSE;
  linespacing  = sixlpi;
  formlength   = 72;
  perfskip     = 6;

(*------  Variables:  ------*)

VAR
  InH: FileHandlePtr;
  Buffer: POINTER TO ARRAY[0..255] OF CHAR;
  len: LONGINT;
  Name: ARRAY[0..79] OF CHAR;
  l: INTEGER;

(*------  Toggle a Command:  ------*)

PROCEDURE OnOff(what:BOOLEAN;trueCmd,falseCmd: UByte);

BEGIN
  IF what THEN
    PrintCommand(trueCmd,0,0,0,0);
  ELSE
    PrintCommand(falseCmd,0,0,0,0);
  END;
END OnOff;

(*------  CleanUp:  ------*)

PROCEDURE CleanUp();

BEGIN
  IF InH#NIL THEN Close(InH) END;
  IF Buffer#NIL THEN FreeMem(Buffer,SIZE(Buffer^)) END;
  ClosePrinter();
END CleanUp;

(*------  Main:  ------*)

BEGIN
  OpenPrinter();
  InH := NIL; Buffer := NIL;
  TermProcedure(CleanUp);
  Buffer := AllocMem(256,MemReqSet{chip});
  IF NumArgs()=0 THEN Terminate(0) END;
  GetArg(1,Name,l);
  InH := Open(ADR(Name),oldFile);
  IF InH=NIL THEN Terminate(0) END;
  OnOff(italics,sgr3,sgr23);
  OnOff(underline,sgr4,sgr24);
  OnOff(boldface,sgr1,sgr22);
  OnOff(elite,shorp2,shorp1);
  OnOff(condensed,shorp4,shorp3);
  OnOff(enlarged,shorp6,shorp5);
  OnOff(doublestrike,den4,den3);
  OnOff(superscript,sus2,sus1);
  OnOff(subscript,sus4,sus3);
  OnOff(linespacing=sixlpi,verp1,verp0);
  PrintCommand(slpp,formlength,0,0,0);
  PrintCommand(perf,perfskip,0,0,0);
  REPEAT
    len := Read(InH,Buffer,256);
    WritePrinter(Buffer,len);
  UNTIL len=0;
  Buffer^[0] := CHAR(12);
  Buffer^[1] := CHAR(0);
  WritePrinter(Buffer,1);
END Print.
