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

    Modul      :  ZPKopfdruck, V1.0
    Author     :  Raymond Horn
    Contents   :  Hilfsmodul für 'ZPAusgabe'
                  Druckt eine Kopfleiste entsprechen dem in
                  ZPEingabe.Kopf spezifizierten Format bzw.
                  berechnet den Platzbedarf in Zeilen.

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

IMPLEMENTATION MODULE ZPKopfdruck;
(* Eigener Modul ist notwendig, um 'WriteString' zum Drucker zu lenken, es
   aber sonst immernoch für Terminalausgaben zur Verfügung zu haben  *)

FROM     InOut       IMPORT   Write,WriteString;
FROM     String      IMPORT   Length, Insert, Delete;
FROM     Conversions IMPORT   ValToStr;

IMPORT   ASCII;

FROM  ZPEingabe   IMPORT   Zeilenposition, PPars, Kopf;

VAR   Zeilenzaehler  :  CARDINAL;

PROCEDURE VolleZeile( C : CHAR; Flag : BOOLEAN );
   VAR   Zaehler : INTEGER;
   BEGIN
      IF Flag THEN
         FOR Zaehler := 1 TO PPars.Zeilenlaenge DO Write( C ) END;
         Write( ASCII.eol );
      END;  (* IF *)
      INC( Zeilenzaehler )
   END VolleZeile;

PROCEDURE CalcPos( Text : ARRAY OF CHAR; Position : Zeilenposition ) : INTEGER;
   VAR Len  :  CARDINAL;
   BEGIN
      Len := Length( Text );
      CASE Position OF
         links    :  RETURN 0    |
         mittig   :
               RETURN ( PPars.Zeilenlaenge - Len ) / 2 |
         rechts   :
               RETURN ( PPars.Zeilenlaenge - Len )
      END   (* CASE *)
   END CalcPos;

PROCEDURE DruckeKopf( Titel : ARRAY OF CHAR; Seitennummer: CARDINAL;
                      Druckflag : BOOLEAN ) : CARDINAL;
(* Druckt eine Kopfleiste entsprechend der Spezifikation in 'Kopf'.
   Die Anzahl der gedruckten Zeilen wird zurückgegeben.
   Datum und Zeit werden noch nicht berücksichtigt.
   Auch nicht Kollisionen der Textbestandteile!                   *)
   VAR   NStr, Name  : ARRAY [0..79] OF CHAR;
         Zeile       : ARRAY [0..159] OF CHAR;
         Errorflag   : BOOLEAN;
         Pos         : INTEGER;
   BEGIN
      Zeilenzaehler := 0;
      IF Kopf.DivOben THEN
         VolleZeile( Kopf.DivisionChar, Druckflag )
      END; (* IF *)
      IF PPars.NameImKopf THEN
         Pos := 0;
         IF Kopf.NameText THEN
            Insert( Name, 0, "Dateiname:" );
            Pos := 11
         END;
         Insert( Name, Pos, Titel );
         Pos := CalcPos( Name, Kopf.NamePos );
         Insert( Zeile, Pos, Name );
         Name[ 0 ] := ASCII.nul
      END;  (* IF *)
      IF PPars.Seitennummer THEN
         Pos := 0;
         IF Kopf.NummerText THEN
            Insert( Name, 0,"Seite:" );
            Pos := 7
         END;
         ValToStr( Seitennummer, FALSE, NStr, 10, 3, ASCII.sp, Errorflag );
         Insert( Name, Pos, NStr );
         Pos := CalcPos( Name, Kopf.NummerPos );
         Delete( Zeile, Pos, Length( Name ) );
         Insert( Zeile, Pos, Name );
         Name[ 0 ] := ASCII.nul
      END;  (* IF *)
      IF Druckflag THEN
         WriteString( Zeile ); Write( ASCII.eol )
      END;  (* IF *)
      INC( Zeilenzaehler );
      IF Kopf.DivUnten THEN
         VolleZeile( Kopf.DivisionChar, Druckflag )
      END; (* IF *)
      IF Druckflag THEN
         Write( ASCII.eol )     (* eine Leerzeile zum Abschluß *)
      END;  (* IF *)
      INC( Zeilenzaehler );
      RETURN Zeilenzaehler
   END DruckeKopf;

END ZPKopfdruck.
