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

    Program    :  ZapPrint
    Author     :  Raymond Horn
    Address    :  Haeselerstraße 14 E, D-1000 Berlin 19
    Version    :  1.0
    Date       :  3. Mar. 1992
    Copyright  :  ShareWare: DM 10,- ( Schein oder Scheck )
    Language   :  Modula-II
    Translator :  M2-Amiga-Compiler V4.0
    Imports    :  ZPEingabe, ZPAusgabe, UserLineIO
    Contents   :  Druckutility mit Seitenauswahl, Kopf, Zeilennummern,..

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

MODULE ZapPrint;

FROM  Terminal    IMPORT   WriteLn, WriteInt, WriteString, Read, ReadLn;
FROM  Arguments   IMPORT   GetArg, NumArgs;
FROM  String      IMPORT   Compare, Length;

FROM  ZPEingabe   IMPORT   PPars, Quiet, NeuerZustand, DisplaySettings,
                           SaveCurrentPPars, RestoreSavedPPars;
FROM  ZPAusgabe   IMPORT   Darstellungsart, DruckeText,
                           MacheFormFeed, MacheLineFeed;
FROM  UserLineIO  IMPORT   GetBefZeile, GetNextArg;

IMPORT ASCII;

CONST MaxZeilLen  =  160;
      HelpRequestChar = '?';
      Zeigewort   = "zeige";
      Druckwort   = "druck";
      Statwort    = "stat";
      FormFeed    = "ff";
      LineFeed    = "lf";
      Infozustand = "-fanklaez+q";
      Infodateiname = "S:ZP_kurz.dok";

TYPE  ZeilenTyp                = ARRAY [0..79] OF CHAR;

VAR   Dateiname               : ZeilenTyp;
      Antwort                 : CHAR;
      len, ArgCount           : INTEGER;
      Zustand                 : Darstellungsart;

PROCEDURE InitVars();
   BEGIN
      Dateiname[ 0 ] := ASCII.nul;
      ArgCount := 1;
      Zustand := druck
   END InitVars;

PROCEDURE GiveInstructions();
(* Gibt Informationen über die Benutzung des Programms *)
   VAR Q :  BOOLEAN;
   BEGIN
      Q := Quiet;
      SaveCurrentPPars;
      NeuerZustand( Infozustand );
      MacheLineFeed( zeige );
      DruckeText( Infodateiname, zeige );
      RestoreSavedPPars;
      DisplaySettings;
      Quiet := Q
   END GiveInstructions;

PROCEDURE SchreibeZustand;
   BEGIN
      WriteString( "Bin im " );
      CASE Zustand OF
         druck :  WriteString( "Druck" )     |
         zeige :  WriteString( "Zeige" )     |
         stat  :  WriteString( "Statistik" )
      END; (* CASE *)
      WriteString( "modus!\n" )
   END SchreibeZustand;

PROCEDURE CheckArg( VAR Befehlswort : ARRAY OF CHAR; len : INTEGER );
(* analysiert die Befehlswort; gibt Dateinamen oder Nullstring zurück *)
   VAR Pos, Count : CARDINAL;
       Eingabe    : INTEGER;     (* Hilfsvariable *)
       StillArgs  : BOOLEAN;
   BEGIN
      IF Length( Befehlswort ) = len THEN
         IF Compare( Befehlswort, HelpRequestChar ) = 0 THEN
            GiveInstructions
         ELSIF Compare( Befehlswort, Zeigewort ) = 0 THEN
            Zustand := zeige
         ELSIF Compare( Befehlswort, Druckwort ) = 0 THEN
            Zustand := druck
         ELSIF Compare( Befehlswort, Statwort ) = 0 THEN
            Zustand := stat
         ELSIF Compare( Befehlswort, FormFeed ) = 0 THEN
            MacheFormFeed( Zustand );
            IF NOT Quiet THEN WriteString( "Mache FormFeed!\n" ) END
         ELSIF Compare( Befehlswort, LineFeed ) = 0 THEN
            MacheLineFeed( Zustand );
            IF NOT Quiet THEN WriteString( "Mache LineFeed!\n" ) END
         ELSIF ( Befehlswort[0] = '-' ) OR ( Befehlswort[0] = '+' ) THEN
            (* Befehlswort ist Kommandozeile *)
            NeuerZustand( Befehlswort )
         ELSE RETURN           (* Befehlswort ist Dateiname -> Abbruch *)
         END (* IF 2 *)
      ELSE
         WriteString( "Aktuelles Directory: " );
         WriteString( Befehlswort ); WriteLn
      END; (* IF *)
      Befehlswort[ 0 ] := ASCII.nul
   END CheckArg;

PROCEDURE HolNamen( VAR Name : ARRAY OF CHAR );
(* Geht zunächst den Argumentenvektor durch und holt sich danach Daten
   vom Benutzer.
   Befehlsworte werden ausgeführt, ein gefundener Dateiname wird zurück-
   gegeben und an dieser Stelle beim nächsten Aufruf fortgefahren    *)
   VAR   Abbruch, LastArg     :  BOOLEAN;
         ArgInZeile, ArgZahl  :  INTEGER;
   BEGIN
      ArgZahl  := NumArgs();
      Name[ 0 ] := ASCII.nul;
      WHILE ( Length( Name ) = 0 ) AND ( ArgCount <= ArgZahl ) DO
         GetArg( ArgCount, Name, len );
         CheckArg( Name, len );
         INC( ArgCount )
      END;
      IF Length( Name ) = 0 THEN
         WHILE ( Length( Name ) = 0 ) AND NOT Abbruch DO
            GetNextArg( Name, LastArg );
            IF Name[ 0 ] = ASCII.nul THEN
               SchreibeZustand;
               ArgInZeile := GetBefZeile( "Dateiname und/oder Befehl: " );
               GetNextArg( Name, LastArg )
            END;  (* IF *)
            Abbruch := Name[ 0 ] = ASCII.nul;
            CheckArg( Name, Length( Name ) )
         END  (* WHILE *)
      END;  (* IF *)
      RETURN
   END HolNamen;

BEGIN (* Hauptprogramm *)

   InitVars();

   HolNamen( Dateiname );
   WHILE Dateiname[ 0 ] # ASCII.nul DO
      DruckeText( Dateiname, Zustand );
      HolNamen( Dateiname )
   END;  (* WHILE *)

END ZapPrint.

