home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / pascal / library / dos / grafik / tiff / pcl.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1990-06-27  |  20.8 KB  |  745 lines

  1. program PCL_Interpreter;
  2. (* Konvertiert PCL-Druckdateien nach TIFF *)
  3. {$A+,B-,D-,E+,F-,I+,L-,N+,O-,R-,S-,V-}
  4. {$M 32768,0,655360}
  5. {$UNDEF ANALYSE}         (* "DEFINE" für Analyse *)
  6.  
  7. uses crt, dos, Aus_TIFF; (* oder Aus_CRT statt Aus_TIFF *)
  8.  
  9. const ESC            = #27;
  10.       Zoll           = 2.54;
  11.       DPI_300        = 1.0 / 300.0;
  12.       An             = true;
  13.       Aus            = not An;
  14.       Prim_Schrift   = true;
  15.       Sek_Schrift    = not Prim_Schrift;
  16.       Aktiviert      = true;
  17.       DeAktiviert    = not Aktiviert;
  18.       MaxStack       = 20;
  19.  
  20. type StackTyp        = array[1..20] of record X,Y : integer; end;
  21.  
  22. var PCL_Datei        : text;
  23.     DatName          : PathStr;
  24.     Zeichen          : char;
  25.     Sequenz          : string;
  26.     TextZeile        : string;
  27.     Faktor_V         : integer;
  28.     Val_Result       : integer;
  29.  
  30.     (* Puffer enthält die Grafikdaten beim Pixeldruck *)
  31.     Puffer           : BufferTyp;
  32.     PufferCnt        : integer;
  33.     XY_Stack         : StackTyp;
  34.     StackCnt         : integer;
  35.  
  36.     (* Jetzt folgen die relevanten Druck-Kenndaten *)
  37.     RasterDruck      : boolean;
  38.     RasterRand       : integer;
  39.     RasterAuf        : integer;
  40.     Kopf_Pos_X       : integer; (* in 300 DPI-Pixeln *)
  41.     Kopf_Pos_Y       : integer; (* in 300 DPI-Pixeln *)
  42.     CursorSpalte     : integer;
  43.     CursorZeile      : integer;
  44.     SchriftZahl      : integer;
  45.     ZeilenUmbruch    : boolean;
  46.     ZeichenCode      : byte;
  47.     ZeichenArt       : byte;
  48.     SeitenLaenge     : real;
  49.     SeitenBreite     : real;
  50.     ObererRand       : real;
  51.     UntererRand      : real;
  52.     LinkerRand       : real;
  53.     RechterRand      : real;
  54.     ZeilenAbstand    : real;
  55.     ZeichenAbstand   : real;
  56.     FuellM_H         : integer;
  57.     FuellM_V         : integer;
  58.     FuellM_Art       : byte;
  59. (*$IFDEF ANALYSE*)
  60.     DiagLst          : text;
  61. (*$ELSE*)
  62.     Ausgabe_Inited   : boolean;
  63. (*$ENDIF*)
  64.  
  65.  
  66. procedure Ausgabe(Str1,Str2 : string);
  67. begin
  68. (*$IFDEF ANALYSE*)
  69.   writeln(DiagLst,Str1,' ',Str2);
  70.   writeln(Str1,' ',Str2);
  71. (*$ENDIF*)
  72. end;
  73.  
  74. procedure StandardWerte;
  75. (* Standardbesetzung der Kennwerte *)
  76. begin
  77.   Ausgabe('Rücksetzen auf Standardwerte','');
  78.   PufferCnt := 0;
  79.   StackCnt := 0;
  80.   RasterDruck := false;
  81.   RasterRand := 0;
  82.   RasterAuf := 300;
  83.   Kopf_Pos_X := 0;
  84.   Kopf_Pos_Y := 0;
  85.   SchriftZahl := 0;
  86.   ZeichenCode := 0;
  87.   ZeichenArt  := 0;
  88.   FuellM_H := 0;
  89.   FuellM_V := 0;
  90.   FuellM_Art := 0;
  91.   SeitenLaenge := 29.7 / Zoll;
  92.   SeitenBreite := 21.0 / Zoll;
  93.   ObererRand := 0.5;
  94.   UntererRand := 0.5;
  95.   LinkerRand := 0;
  96.   RechterRand := 0;
  97.   ZeilenAbstand := 1.0 / 6.0;
  98.   ZeichenAbstand := 1.0 / 12.0;
  99.   CursorSpalte := 0;
  100.   CursorZeile := 0;
  101.   ZeilenUmbruch := Deaktiviert;
  102. end;
  103.  
  104. procedure LiesSequenz(var Seq : string);
  105. (* Liest eine Befehlssequenz aus der Datei *)
  106. begin
  107.   FillChar(Seq,SizeOf(string),0);
  108.   if EoF(PCL_Datei) then Zeichen := ' '
  109.   else
  110.   repeat
  111.     read(PCL_Datei,Zeichen);
  112.     if Zeichen > ESC then Seq := Seq + Zeichen;
  113.   until ((Zeichen >= 'A') and (Zeichen <= 'Z'))
  114.   or (Zeichen <= ESC) or EoF(PCL_Datei);
  115. end;
  116.  
  117. procedure LiesZeile(var Zeile : string);
  118. (* Liest eine normale Textzeile *)
  119. begin
  120.   FillChar(Zeile,SizeOf(string),0);
  121.   Zeichen := ' ';
  122.   if not EoF(PCL_Datei) then
  123.   repeat
  124.     read(PCL_Datei,Zeichen);
  125.     if Zeichen > ESC then Zeile := Zeile + Zeichen;
  126.   until (Zeichen <= ESC) or EoF(PCL_Datei);
  127. end;
  128.  
  129. procedure Analyse(var Seq : string);
  130. (* Hauptprozedur - analysiert eine Sequenz *)
  131. type Vorzeichen = (Plus,Minus,Ohne);
  132. var Seq_Pos  : integer;
  133.     FunktStr : string[2];
  134.     FunktLen : integer;
  135.     NumWert  : real;
  136.     Vorzeich : Vorzeichen;
  137.  
  138.  procedure Push_Cursor(X_Param,Y_Param : integer);
  139.  begin
  140.    if StackCnt < 20 then
  141.    begin
  142.      inc(StackCnt);
  143.      XY_Stack[StackCnt].X := X_Param;
  144.      XY_Stack[StackCnt].Y := Y_Param;
  145.    end
  146.    else Fehler('CursorStack-Überlauf ','');
  147.  end;
  148.  
  149.  procedure Pop_Cursor(var X_Param,Y_Param : integer);
  150.  begin
  151.    if StackCnt > 0 then
  152.    begin
  153.      X_Param := XY_Stack[StackCnt].X;
  154.      Y_Param := XY_Stack[StackCnt].Y;
  155.      dec(StackCnt);
  156.    end
  157.    else Fehler('CursorStack ist leer','');
  158.  end;
  159.  
  160.  procedure NeueSeite;
  161.  begin
  162.    Ausgabe('SeitenBreite ',R_to_Str(SeitenBreite));
  163.    Ausgabe('SeitenLaenge ',R_to_Str(SeitenLaenge));
  164.    if Ausgabe_Inited then AusgabeExit;
  165.    Ausgabe_Inited := false; (* Eventuell neuer Dateiname? *)
  166.  end;
  167.  
  168.  procedure ReadNum;
  169.  (* Liest numerischen Wert - Positionszeiger steht am Anfang der
  170.     Zahl und wird auf das erste nichtnumerische Zeichen gesetzt *)
  171.  var NumStr  : string;
  172.      NumCh   : char;
  173.      ValRes  : integer;
  174.  begin
  175.    NumStr := '';
  176.    Vorzeich := Ohne;
  177.    NumCh := upcase(Seq[Seq_Pos]);
  178.    if (NumCh = '+') or (NumCh = '-') then
  179.    begin
  180.      if NumCh = '+' then Vorzeich := Plus
  181.      else Vorzeich := Minus;
  182.      inc(Seq_Pos);
  183.      NumCh := upcase(Seq[Seq_Pos]);
  184.    end;
  185.    while ((NumCh >= '0') and (NumCh <= '9'))
  186.       or (NumCh = '.') do
  187.    begin
  188.      NumStr := NumStr + NumCh;
  189.      inc(Seq_Pos);
  190.      NumCh := upcase(Seq[Seq_Pos]);
  191.    end;
  192.    NumWert := 0;
  193.    if NumStr > ' ' then
  194.    begin
  195.      val(NumStr,NumWert,ValRes);
  196.      if ValRes > 0 then
  197.      begin
  198.        Fehler('numerisches Format ',NumStr);
  199.        NumWert := 0;
  200.      end;
  201.    end;
  202.  end;
  203.  
  204.  procedure Grafik;
  205.  (* Behandelt Sequenzen zur Rastergrafik *)
  206.  
  207.   procedure Raster_AnAus; (* "ESC * r" *)
  208.   begin
  209.     inc(Seq_Pos);
  210.     if upcase(Seq[Seq_Pos]) = 'B' then
  211.     begin
  212.       Ausgabe('Ende RasterGrafik','');
  213.       RasterDruck := Aus;
  214.     end
  215.     else
  216.     begin
  217.       ReadNum;
  218.       if (upcase(Seq[Seq_Pos]) = 'A') then
  219.       begin
  220.         if NumWert = 0.0 then
  221.         begin
  222.           RasterRand := round(DPI_300 * LinkerRand);
  223.           RasterDruck := An;
  224.           Ausgabe('Rasterrand = ',R_to_Str(RasterRand));
  225.         end
  226.         else if NumWert = 1.0 then
  227.         begin
  228.           RasterRand := Kopf_Pos_X;
  229.           RasterDruck := An;
  230.           Ausgabe('Rasterrand = ',R_to_Str(RasterRand));
  231.         end
  232.         else Fehler('Falscher Rasterrand ',Seq);
  233.       end
  234.       else Fehler('Rasterrand ',Seq);
  235.     end;
  236.   end;
  237.  
  238.   procedure Aufloesung; (* "ESC * t" *)
  239.   begin
  240.     inc(Seq_Pos);
  241.     ReadNum;
  242.     if (upcase(Seq[Seq_Pos]) = 'R')
  243.     and ((NumWert = 75.0) or (NumWert = 100.0)
  244.          or (NumWert = 150.0) or (NumWert = 300.0)) then
  245.     begin
  246.       RasterAuf := round(NumWert);
  247.       Ausgabe('RasterAuflösung ',R_to_Str(NumWert));
  248.     end
  249.     else Fehler('Falsche Auflösung ',Seq);
  250.   end;
  251.  
  252.   procedure RasterZeile; (* "ESC * b" *)
  253.   var Lauf : integer;
  254.       R_Ch : char;
  255.       AnzP : integer;
  256.   begin
  257.     inc(Seq_Pos);
  258.     ReadNum;
  259.     if (upcase(Seq[Seq_Pos]) = 'W')
  260.     and (NumWert >= 0.0) then
  261.     begin
  262.       FillChar(Puffer,SizeOf(Puffer),0);
  263.       PufferCnt := 0;
  264.       for Lauf := 1 to round(NumWert) do
  265.       begin
  266.         read(PCL_Datei,R_Ch);
  267.         inc(PufferCnt);
  268.         Puffer[PufferCnt] := ord(R_Ch);
  269.       end;
  270.       AnzP := 300 div RasterAuf;
  271.       Ausgabe('Rasterzeile','');
  272. (*$IFNDEF ANALYSE*)
  273.       if RasterDruck then
  274.        if NumWert > 0.0 then
  275.       begin
  276.         if not Ausgabe_Inited then
  277.         begin
  278.           AusgabeInit(round(SeitenBreite * 300.0),
  279.                       round(SeitenLaenge * 300.0),
  280.                       DatName,AnzP,Faktor_V);
  281.           Ausgabe_Inited := true;
  282.         end;
  283.         AusgabeDaten(Puffer,PufferCnt,Kopf_Pos_X,Kopf_Pos_Y);
  284.       end;
  285. (*$ENDIF*)
  286.       inc(Kopf_Pos_Y,AnzP);
  287.       Kopf_Pos_X := RasterRand;
  288.     end
  289.     else Fehler('Raster-Sequenz',Seq);
  290.   end;
  291.  
  292.   procedure Cursor_300; (* "ESC * p" *)
  293.   begin
  294.     inc(Seq_Pos);
  295.     ReadNum;
  296.     if upcase(Seq[Seq_Pos]) = 'X' then
  297.     begin
  298.       case Vorzeich of
  299.        Plus  : inc(Kopf_Pos_X,round(NumWert));
  300.        Minus : dec(Kopf_Pos_X,round(NumWert));
  301.        Ohne  : Kopf_Pos_X := round(NumWert);
  302.       end;
  303.       Ausgabe('Kopf_X = ',R_to_Str(Kopf_Pos_X));
  304.     end
  305.     else if upcase(Seq[Seq_Pos]) = 'Y' then
  306.     begin
  307.       case Vorzeich of
  308.        Plus  : inc(Kopf_Pos_Y,round(NumWert));
  309.        Minus : dec(Kopf_Pos_Y,round(NumWert));
  310.        Ohne  : Kopf_Pos_Y := round(NumWert);
  311.       end;
  312.       Ausgabe('Kopf_Y = ',R_to_Str(Kopf_Pos_Y));
  313.     end
  314.     else Fehler('Position',Seq);
  315.   end;
  316.  
  317.   procedure Diverses; (* "ESC * c" *)
  318.   begin
  319.     inc(Seq_Pos);
  320.     ReadNum;
  321.     case upcase(Seq[Seq_Pos]) of
  322.      'D' : SchriftZahl := round(NumWert);
  323.      'E' : ZeichenCode :=  round(NumWert);
  324.      'F' : ZeichenArt :=  round(NumWert);
  325.      'A' : FuellM_H := round(NumWert);
  326.      'B' : FuellM_V := round(NumWert);
  327.      'H' : FuellM_H := round(NumWert * 2.4);
  328.      'V' : FuellM_V := round(NumWert * 2.4);
  329.      'P' : FuellM_Art := 0;
  330.      else Fehler('Diverses',Seq);
  331.     end;
  332.   end;
  333.  
  334.  begin (* Grafik : "ESC *" *)
  335.    inc(Seq_Pos);
  336.    case upcase(Seq[Seq_Pos]) of
  337.     'R' : Raster_AnAus;
  338.     'T' : Aufloesung;
  339.     'B' : RasterZeile;
  340.     'P' : Cursor_300;
  341.     'C' : Diverses;
  342.    end;
  343.  end;
  344.  
  345.  procedure Positionierung;
  346.  (* Sequenzen zur Druckkopf-Positionierung *)
  347.  
  348.   procedure SeitenAufbau; (* "ESC & l" *)
  349.   begin
  350.     inc(Seq_Pos);
  351.     ReadNum;
  352.     case upcase(Seq[Seq_Pos]) of
  353.      'P' : begin
  354.              SeitenLaenge := NumWert * ZeilenAbstand;
  355.              Ausgabe('Seitenlänge = ',R_to_Str(SeitenLaenge));
  356.              UntererRand := 0.5;
  357.            end;
  358.      'E' : begin
  359.              ObererRand := NumWert * ZeilenAbstand;
  360.              Ausgabe('Oberer Rand = ',R_to_Str(ObererRand));
  361.              UntererRand := 0.5;
  362.            end;
  363.      'F' : begin
  364.              UntererRand := NumWert * ZeilenAbstand;
  365.              if UntererRand = 0
  366.              then UntererRand := 0.5
  367.              else UntererRand := SeitenLaenge - ObererRand
  368.                                - UntererRand;
  369.              Ausgabe('Unterer Rand = ',R_to_Str(UntererRand));
  370.            end;
  371.      'D' : begin
  372.              ZeilenAbstand := 1.0 / NumWert;
  373.              Ausgabe('Zeilenabstand = ',R_to_Str(ZeilenAbstand));
  374.            end;
  375.      'C' : begin
  376.              ZeilenAbstand := NumWert;
  377.              Ausgabe('Zeilenabstand = ',R_to_Str(ZeilenAbstand));
  378.            end;
  379.      'L' : begin
  380.              if NumWert = 1.0
  381.              then Ausgabe('Perforationssprung aktiviert','')
  382.              else if NumWert = 0.0
  383.              then Ausgabe('Perforationssprung nicht aktiviert','')
  384.              else Fehler('Perforation',Seq);
  385.            end;
  386.      'O' : begin
  387.              if NumWert = 0.0
  388.              then Ausgabe('Seite im Hochformat','')
  389.              else if NumWert = 1.0 then
  390.              begin
  391.                 Ausgabe('Seite im Querformat','');
  392.                 Fehler('Weitere Bearbeitung nicht möglich','');
  393.                 Halt(2);
  394.              end
  395.              else Fehler('Seiten-Mode',Seq);
  396.            end;
  397.      'X' : Ausgabe('Anzahl Kopien = ',R_to_Str(NumWert));
  398.      'H' : begin
  399.              Ausgabe('Neue Seite','');
  400.              NeueSeite;
  401.            end;
  402.      else Fehler('Seitenaufbau',Seq);
  403.     end;
  404.   end;
  405.  
  406.   procedure Cursor_Etc; (* "ESC & a" *)
  407.   begin
  408.     inc(Seq_Pos);
  409.     ReadNum;
  410.     case upcase(Seq[Seq_Pos]) of
  411.      'C' : begin
  412.              case Vorzeich of
  413.               Plus  : inc(CursorSpalte,round(NumWert));
  414.               Minus : inc(CursorSpalte,round(NumWert));
  415.               Ohne : CursorSpalte := round(NumWert);
  416.              end;
  417.              Ausgabe('Cursor in Spalte ',R_to_Str(CursorSpalte));
  418.              Kopf_Pos_X := round(CursorSpalte * ZeichenAbstand);
  419.            end;
  420.      'R' : begin
  421.              CursorZeile := round(NumWert);
  422.              Ausgabe('Cursor in Zeile ',R_to_Str(CursorZeile));
  423.              Kopf_Pos_Y := round(DPI_300
  424.                  * (CursorZeile * ZeilenAbstand + ObererRand));
  425.            end;
  426.      'H' : begin
  427.              case Vorzeich of
  428.               Plus  : inc(Kopf_Pos_X,round(NumWert / 2.4));
  429.               Minus : dec(Kopf_Pos_X,round(NumWert / 2.4));
  430.               Ohne  : Kopf_Pos_X := round(NumWert / 2.4);
  431.              end;
  432.              Ausgabe('Kopf_X = ',R_to_Str(Kopf_Pos_X));
  433.            end;
  434.      'V' : begin
  435.              case Vorzeich of
  436.               Plus  : inc(Kopf_Pos_Y,round(NumWert / 2.4));
  437.               Minus : dec(Kopf_Pos_Y,round(NumWert / 2.4));
  438.               Ohne  : Kopf_Pos_Y := round(NumWert / 2.4);
  439.              end;
  440.              Ausgabe('Kopf_Y = ',R_to_Str(Kopf_Pos_Y));
  441.            end;
  442.      'L' : begin
  443.              LinkerRand := NumWert * ZeichenAbstand;
  444.              Ausgabe('Linker Rand = ',R_to_Str(LinkerRand));
  445.            end;
  446.      'M' : begin
  447.              RechterRand := NumWert * ZeichenAbstand;
  448.              Ausgabe('Rechter Rand = ',R_to_Str(RechterRand));
  449.            end;
  450.      else Fehler('Cursor_Etc',Seq);
  451.     end;
  452.   end;
  453.  
  454.   procedure Druck_Schrift; (* "ESC & k" *)
  455.   begin
  456.     inc(Seq_Pos);
  457.     ReadNum;
  458.     case upcase(Seq[Seq_Pos]) of
  459.      'H' : begin
  460.              ZeichenAbstand := NumWert / 120.0;
  461.              Ausgabe('Zeichenabst. = ',R_to_Str(ZeichenAbstand));
  462.            end;
  463.      'G' : Ausgabe('Zeilen-Interpretation: ',R_to_Str(NumWert));
  464.      'S' : if NumWert = 0.0 then
  465.            begin
  466.              ZeichenAbstand := Zoll / 10.0;
  467.              Ausgabe('Normalschrift : Zeichenabstand = ',
  468.                      R_to_Str(ZeichenAbstand));
  469.            end
  470.            else if NumWert = 2.0 then
  471.            begin
  472.              ZeichenAbstand := Zoll / 16.66;
  473.              Ausgabe('Enge Schrift : Zeichenabstand = ',
  474.                      R_to_Str(ZeichenAbstand));
  475.            end
  476.            else Fehler('Schriftwahl ',Seq);
  477.      else Fehler('Druck_Schrift',Seq);
  478.     end;
  479.   end;
  480.  
  481.   procedure Unterstreichen; (* "ESC & d" *)
  482.   begin
  483.     inc(Seq_Pos);
  484.     case upcase(Seq[Seq_Pos]) of
  485.      'D' : Ausgabe('Automatisches Unterstreichen aktiviert','');
  486.      '@' : Ausgabe('Automatisches Unterstreichen deaktiviert','');
  487.      '3' : begin
  488.              inc(Seq_Pos);
  489.              if upcase(Seq[Seq_Pos]) = 'D'
  490.              then Ausgabe('Variables Unterstreichen aktiviert','')
  491.              else Fehler('V. Unterstreichen ',Seq);
  492.            end
  493.      else Fehler('Unterstreichen ',Seq);
  494.     end;
  495.   end;
  496.  
  497.   procedure Zeilen_Umbruch; (* "ESC & s" *)
  498.   begin
  499.     inc(Seq_Pos);
  500.     ReadNum;
  501.     if upcase(Seq[Seq_Pos]) = 'C' then
  502.     begin
  503.       if NumWert = 0.0 then
  504.       begin
  505.         ZeilenUmbruch := Aktiviert;
  506.         Ausgabe('Zeilenumbruch aktiviert','');
  507.       end
  508.       else
  509.       begin
  510.         ZeilenUmbruch := DeAktiviert;
  511.         Ausgabe('Zeilenumbruch nicht aktiviert','');
  512.       end;
  513.     end
  514.     else Fehler('Druck_Schrift',Seq);
  515.   end;
  516.  
  517.   procedure Seite_Anzahl; (* "ESC & 1" *)
  518.   begin
  519.     inc(Seq_Pos);
  520.     ReadNum;
  521.     if upcase(Seq[Seq_Pos]) = 'X'
  522.     then Ausgabe('Anzahl Kopien = ',R_to_Str(NumWert))
  523.     else if upcase(Seq[Seq_Pos]) = 'A' then
  524.     begin (* Seitengröße *)
  525.       case round(NumWert) of
  526.         1 : begin (* Executive *)
  527.               SeitenLaenge := 7.25;
  528.               SeitenBreite := 10.5;
  529.             end;
  530.         2 : begin (* Letter *)
  531.               SeitenLaenge := 8.5;
  532.               SeitenBreite := 11.0;
  533.             end;
  534.         3 : begin (* Legal *)
  535.               SeitenLaenge := 8.5;
  536.               SeitenBreite := 14.0;
  537.             end;
  538.        26 : begin (* DIN A4 *)
  539.               SeitenLaenge := 29.7 / Zoll;
  540.               SeitenBreite := 21.0 / Zoll;
  541.             end;
  542.        80 : begin (* Monarch *)
  543.               SeitenLaenge := 3.875;
  544.               SeitenBreite := 7.5;
  545.             end;
  546.        81 : begin (* Commercial *)
  547.               SeitenLaenge := 4.125;
  548.               SeitenBreite := 9.5;
  549.             end;
  550.        90 : begin (* International DL *)
  551.               SeitenLaenge := 110.0 / Zoll;
  552.               SeitenBreite := 220.0 / Zoll;
  553.             end;
  554.        91 : begin (* International C5 *)
  555.               SeitenLaenge := 162.0 / Zoll;
  556.               SeitenBreite := 229.0 / Zoll;
  557.             end;
  558.        else Fehler('Papierformat',R_to_Str(NumWert));
  559.       end;
  560.     end
  561.     else Fehler('Seite oder Anzahl ', Seq);
  562.   end;
  563.  
  564.   procedure CursorStack; (* "ESC & f" *)
  565.   begin
  566.     inc(Seq_Pos);
  567.     ReadNum;
  568.     if upcase(Seq[Seq_Pos]) = 'S' then
  569.     begin
  570.       if NumWert = 0.0
  571.       then Push_Cursor(Kopf_Pos_X,Kopf_Pos_Y)
  572.       else if NumWert = 1.0
  573.       then Pop_Cursor(Kopf_Pos_X,Kopf_Pos_Y)
  574.       else Fehler('CursorStack ',Seq);
  575.     end
  576.     else Fehler('CursorStack ',Seq);
  577.   end;
  578.  
  579.  begin (* Positionierung : "ESC &" *);
  580.    inc(Seq_Pos);
  581.    case upcase(Seq[Seq_Pos]) of
  582.      'L' : SeitenAufbau;
  583.      'A' : Cursor_Etc;
  584.      'K' : Druck_Schrift;
  585.      'D' : Unterstreichen;
  586.      'S' : Zeilen_Umbruch;
  587.      '1' : Seite_Anzahl;
  588.      'F' : CursorStack;
  589.    end;
  590.  end;
  591.  
  592.  procedure SchriftArt(PrimaerSchrift : boolean);
  593.  (* Sequenz zur Schriftwahl *)
  594.  var Kenn_Str : string;
  595.  begin (* SchriftArt : "(" oder ")" *)
  596.    if PrimaerSchrift
  597.    then Kenn_Str := 'Primärschrift'
  598.    else Kenn_Str := 'Sekundärschrift';
  599.    inc(Seq_Pos);
  600.    if upcase(Seq[Seq_Pos]) = 'S' then
  601.    begin
  602.      inc(Seq_Pos);
  603.      ReadNum;
  604.      case upcase(Seq[Seq_Pos]) of
  605.       'S' : if NumWert = 0.0 then Ausgabe(Kenn_Str,'normal')
  606.             else if NumWert = 1.0 then Ausgabe(Kenn_Str,'kursiv')
  607.             else Fehler(Kenn_Str,Seq);
  608.       'B' : Ausgabe('Intensität '+ Kenn_Str,R_to_Str(NumWert));
  609.       'T' : Ausgabe('Schrifttyp '+ Kenn_Str,R_to_Str(NumWert));
  610.       'V' : Ausgabe('Zeichenhöhe '+ Kenn_Str,R_to_Str(NumWert));
  611.       'H' : Ausgabe('CPI '+ Kenn_Str,R_to_Str(NumWert));
  612.       'P' : if NumWert = 0.0 then Ausgabe(Kenn_Str,'fest')
  613.             else if NumWert = 1.0 then Ausgabe(Kenn_Str,'prop.')
  614.             else Fehler(Kenn_Str,Seq);
  615.      end;
  616.    end
  617.    else if (Seq[Seq_Pos] >= '0') and (Seq[Seq_Pos] <= '9') then
  618.    begin (* Schriftarten laden etc. *)
  619.      ReadNum;
  620.      Ausgabe('Schrift laden ',Seq);
  621.    end
  622.    else Fehler('Schriftart '+ Kenn_Str,Seq);
  623.  end;
  624.  
  625.  procedure SteuerCode(Aktiv : boolean);
  626.  (* Nur für realen Drucker interessant *)
  627.  begin
  628.  end;
  629.  
  630. begin (* Analyse *)
  631. (*$IFDEF ANALYSE*)
  632.   write(DiagLst,Seq:24,'  ');
  633.   write(Seq:24,'  ');
  634. (*$ENDIF*)
  635.   Seq_Pos := 1;
  636.   FunktStr := copy(Seq,1,2);
  637.   case upcase(Seq[1]) of (* Unterteilung nach Funtionsgruppen *)
  638.     '*' : Grafik;
  639.     '&' : Positionierung;
  640.     '(' : SchriftArt(Prim_Schrift);
  641.     ')' : SchriftArt(Sek_Schrift);
  642.     'Y' : SteuerCode(Aktiviert);
  643.     'Z' : SteuerCode(DeAktiviert);
  644.     '9' : begin
  645.             LinkerRand := 0;
  646.             RechterRand := 0;
  647.           end;
  648.     '=' : Ausgabe('Halber Zeilenvorschub','');
  649.     'E' : StandardWerte;
  650.     #12 : Ausgabe('Seitenvorschub ','');
  651.     else
  652.     begin
  653.       Fehler('Unbekannter Befehl ',Seq);
  654.       Seq_Pos := 1;
  655.       Seq := ESC;
  656.     end;
  657.   end;
  658.   if (Seq[Seq_Pos] >= 'a') and (Seq[Seq_Pos] <= 'z') then
  659.   begin (* Hinzufügen des Gruppenkennzeichens *)
  660.     FunktLen := length(FunktStr);
  661.     if (FunktStr[FunktLen] >= '0')
  662.     and (FunktStr[FunktLen] <= '9')
  663.     then FunktStr := copy(FunktStr,1,1);
  664.     Seq := copy(Seq,succ(Seq_Pos),255);
  665.     FunktLen := length(FunktStr);
  666.     if FunktStr[FunktLen] = Seq[1]
  667.     then FunktStr := copy(FunktStr,1,pred(FunktLen));
  668.     Seq := FunktStr + Seq;
  669.   end
  670.   else Seq := copy(Seq,succ(Seq_Pos),255)
  671. end;
  672.  
  673. begin
  674. (*$IFDEF ANALYSE*)
  675.   assign(DiagLst,'PCL.LST');
  676.   rewrite(DiagLst);
  677. (*$ELSE*)
  678.   Ausgabe_Inited := false;
  679.   StandardWerte;
  680. (*$ENDIF*)
  681.   if ParamCount > 0 then DatName := ParamStr(1)
  682.   else
  683.   begin
  684.     ClrScr;
  685.     write('Name der PCL-Datei: ');
  686.     readln(DatName);
  687.   end;
  688.   if pos('.',DatName) = 0
  689.   then DatName := DatName + '.PCL';  (* Standard-Extension *)
  690.   assign(PCL_Datei,DatName);
  691.   (*$I-*)
  692.   reset(PCL_Datei);
  693.   (*$I+*)
  694.   if IOResult > 0 then
  695.   begin
  696.     Fehler('Datei nicht vorhanden: ',DatName);
  697.     halt(1);
  698.   end;
  699.   if ParamCount > 1 then (* 2. und 3. Parameter *)
  700.   begin
  701.     val(ParamStr(2),Faktor_V,Val_Result);
  702.     if Val_Result > 0 then
  703.     begin (* Dateiname der TIFF-Datei *)
  704.       DatName := ParamStr(2);
  705.       if ParamCount > 2 then
  706.       begin
  707.         val(ParamStr(3),Faktor_V,Val_Result);
  708.         if Val_Result > 0
  709.         then Faktor_V:= 1;
  710.       end;
  711.     end;
  712.   end
  713.   else if ParamCount = 1
  714.   then Faktor_V := 1
  715.   else
  716.   begin
  717.     writeln;
  718.     write('Verkleinerungs-Faktor: ');
  719.     readln(Faktor_V);
  720.   end;
  721.   read(PCL_Datei,Zeichen);
  722.   while Zeichen <= ESC do
  723.   begin
  724.     LiesSequenz(Sequenz);
  725.     while length(Sequenz) > 0
  726.     do Analyse(Sequenz);
  727.     if Zeichen <> ESC then
  728.     begin
  729.       LiesZeile(TextZeile);
  730.       if length(TextZeile) > 0 then
  731.       begin
  732.         if TextZeile[1] <= ESC then Analyse(TextZeile)
  733.         else Ausgabe('- ',TextZeile);
  734.       end;
  735.     end;
  736.   end;
  737.   close(PCL_Datei);
  738. (*$IFDEF ANALYSE*)
  739.   close(DiagLst);
  740. (*$ELSE*)
  741.   if Ausgabe_Inited then AusgabeExit;
  742. (*$ENDIF*)
  743. end.
  744.  
  745. @bu = Das Hauptprogramm bietet noch viel Raum für Erweiterungen