PACKET std printer 
 
(************************************************************************)
(*                                              Stand   : 29.07.86      *)
(*   STANDARD PRINTER                           Version : 4             *)
(*                                              Autor   : Rudolf Ruland *)
(************************************************************************)
 
       DEFINES open,
               close,
               execute,
 
               paper size :
 
LET underline           =  1,
    bold                =  2,
    italics             =  4,
    reverse             =  8,
 
    underline linetype  =  1,
 
    c document          =  1,
    c page              =  2,
 
    c write text        =  1,
    c write cmd         =  2,
    c carriage return   =  3, 
    c move              =  4,
    c draw              =  5,
    c on                =  6, 
    c off               =  7,
    c type              =  8;
 
INT VAR high, rest, blankbreite;
REAL VAR x size, y size;
 
(*********************************************************************)

paper size (8.0 * 2.54, 12.0 * 2.54);
 
PROC paper size (REAL CONST x, y) :
 
  x size := x;
  y size := y;
 
END PROC paper size;
 
PROC paper size : 
 
  line;
  putline ("Papierbreite  =  " + text (x size, 5, 2) + " cm  =  " + text (x size / 2.54, 5, 2) + " Zoll");
  putline ("Papierlaenge  =  " + text (y size, 5, 2) + " cm  =  " + text (y size / 2.54, 5, 2) + " Zoll");
 
END PROC paper size;
 
(*********************************************************************)
 
PROC open (INT CONST op code, INT VAR param1, param2) :
 
SELECT op code OF
  CASE c document : open document 
  CASE c page     : open page
END SELECT; 
 
 
. x steps : param1
. y steps : param2
. 
  open document :
    x steps      := x step conversion ( x size );
    y steps      := y step conversion ( y size );
    out (off string (underline));
    out (off string (bold));
    out (off string (italics));
    out (off string (reverse));
 
 
. x start : param1
. y start : param2
. 
  open page :
    x start := 0;
    y start := 0;
    rest    := 0;
    out (""13"");
 
END PROC open; 
 
 
PROC close (INT CONST op code, INT CONST param1) :
 
SELECT op code OF
  CASE c document : close document 
  CASE c page     : close page
END SELECT; 
 
. 
  close document :
 
 
. remaining y steps : param1
.
  close page :
    remaining y steps TIMESOUT ""10""
 
END PROC close;
 
 
PROC execute (INT CONST op code, TEXT CONST string, INT CONST param1, param2) :
 
SELECT op code OF
  CASE c write text       :  write text
  CASE c write cmd        :  write cmd
  CASE c carriage return  :  carriage return
  CASE c move             :  move
  CASE c draw             :  draw
  CASE c on               :  on
  CASE c off              :  off
  CASE c type             :  type
END SELECT

 
. from : param1
. to   : param2
.
  write text :
    out subtext (string, from, to)
 
.
  write cmd :
    out subtext (string, from, to)
 
 
(*. x steps to left margin : param1*)
.
  carriage return :
    rest := 0;
    out (""13"")
 
 
. x steps : param1
. y steps : param2
.
  move :
    IF   x steps < 0 OR y steps < 0
        THEN stop
    ELIF x steps > 0
        THEN x move
    ELIF y steps > 0
        THEN y move
    FI;
 
    . x move :
        high := (x steps + rest) DIV blankbreite;
        rest := (x steps + rest) MOD blankbreite;
        IF high > 0 THEN high TIMESOUT " " FI;
 
    . y move :
        y steps TIMESOUT ""10""
 
. 
  draw :
    IF x steps < 0 OR y steps <> 0 OR linetype <> underline linetype
       THEN stop
       ELSE x draw
    FI
 
    . x draw :
        high := (x steps + rest) DIV blankbreite;
        rest := (x steps + rest) MOD blankbreite;
        IF high > 0 THEN high TIMESOUT "_" FI;
 
 
. modification : param1
.
  on :
    IF on string (modification) <> ""
       THEN out (on string (modification))
       ELSE stop
    FI
 
.
  off :
    IF off string (modification) <> ""
       THEN out (off string (modification))
       ELSE stop
    FI
 
 
. font nr : param1
.
  type :
    blankbreite := char pitch (font nr, " ");
    out (font string (font nr));
 
END PROC execute;
 
 
END PACKET std printer;
 
 
PACKET print cmd for single user                (* Autor : Rudolf Ruland *)
                                                (* Stand : 18.02.86      *)
       DEFINES print,
               print channel :
 
INT VAR pr channel;
TEXT VAR buffer;
FILE VAR print file;
 
BOOL CONST multi user := (pcb (9) AND 255) <> 1;
 
 
PROC print channel (INT CONST channel) :
 
  IF multi user THEN do ("serverchannel(" + text (channel) + ")" ) FI;
  pr channel := channel;
 
END PROC print channel; 
 
INT PROC print channel : pr channel END PROC print channel; 
 
 
PROC print :

  print (last param)

ENDPROC print ;

PROC print (TEXT CONST file name) :

  INT CONST myself channel := channel (myself);
  last param (file name) ;
  print file := sequential file (input, file name) ;
  continue (print channel) ;
  disable stop ;
  execute print ;
  remember error message if neccessary;
  IF multi user THEN do ("break (quiet)") FI;
  continue (myself channel);
  clear error;
  put error message if neccessary;

  . remember error message if neccessary :
      IF is error
         THEN buffer := error message;
              clear error;
         ELSE buffer := "";
      FI;
 
  . put error message if neccessary :
      IF buffer <> "" THEN errorstop (buffer) FI;
 
ENDPROC print ;

PROC execute print :

  enable stop ;
  print (print file,
         PROC (INT CONST, INT VAR, INT VAR) open,
         PROC (INT CONST, INT CONST) close,
         PROC (INT CONST, TEXT CONST, INT CONST, INT CONST) execute);
 
ENDPROC execute print ;

ENDPACKET print cmd for single user;
 
#page# 
(******************************************************************)
(***                                                            ***)
(***   Generierung des Printers                                 ***)
(***                                                            ***)
(******************************************************************)
 
LET printer name = "printer.std",
    up           = ""3""13""5"" ;
 
TEXT VAR fonttab name := "fonttab.std";
 
BOOL CONST multi user := (pcb (9) AND 255) <> 1;
 
INT VAR pr channel;
TEXT VAR buffer;
 
command dialogue (TRUE);
ask for print channel;
ask for paper format;
ask for font table;
load font table;
forget (printer name, quiet);
IF multi user THEN generate printer spool FI;
check on;
.
  ask for print channel : 
    line;
    put ("gib Druckerkanal:");
    get (pr channel);
    print channel (pr channel);
    line;
. 
  ask for paper format :
    SELECT paper format OF
      CASE 1 : papersize ( 8.0 * 2.54, 12.0 * 2.54)
      CASE 2 : papersize (13.2 * 2.54, 12.0 * 2.54)
      CASE 3 : papersize (21.0, 29.7)
    END SELECT

    . paper format :
        line;
        REP out (up);
            IF yes ("Papierformat : endlos, 8 Zoll breit")
               THEN LEAVE paper format WITH 1 FI;
            out (up);
            IF yes ("Papierformat : endlos, 13.2 Zoll breit")
               THEN LEAVE paper format WITH 2 FI;
            out (up);
            IF yes ("Papierformat : DINA 4")
               THEN LEAVE paper format WITH 3 FI;
        PER;
        0
.
  ask for font table :
    line;
    fonttab name CAT char pitch;
    line;
    fonttab name CAT language
 
    . char pitch :
        REP out (up); 
            IF yes ("Zeichenbreite des Druckers : 10 Zeichen pro Zoll")
               THEN LEAVE char pitch WITH "-10" FI;
            out (up);
            IF yes ("Zeichenbreite des Druckers : 12 Zeichen pro Zoll")
               THEN LEAVE char pitch WITH "-12" FI;
        PER;
        ""
 
    . language :
        REP out (up); 
            IF yes ("Zeichensatz des Druckers : deutsch") 
               THEN LEAVE language WITH "" FI;
            out (up);
            IF yes ("Zeichensatz des Druckers : ascii") 
               THEN LEAVE language WITH ".ascii" FI;
        PER;
        ""
.
  load font table :
    IF NOT exists (fonttab name)
       THEN command dialogue (TRUE); 
            REP line (2); 
                putline ("Bitte Archiv mit der Fonttabelle """ +
                          fonttab name + """ einlegen!");
                line;
            UNTIL yes ("Archiv eingelegt") PER;
            reserve archive;
            fetch (fonttab name, archive);
            release (archive);
    FI;
    font table (fonttab name);
    IF multi user
       THEN command dialogue (FALSE); 
            do ("save(""" + font tab name + """,task(""configurator""))") 
    FI;
    forget (fonttab name, quiet);
 
    . reserve archive :
        INT VAR p1, p2;
        archive (" "31" ");
        disable stop;
        list (archive);
        IF is error
           THEN buffer := errormessage;
                p1 := pos (buffer, """", 1 ) + 1;
                p2 := pos (buffer, """", p1) - 1;
                IF p1 > 0 AND p2 > 0
                   THEN clear error;
                        buffer := subtext (buffer, p1, p2);
                        archive (buffer);
                FI;
        FI;
        enable stop;
 
. generate printer spool :
    eumel must advertise;
    cursor (1, 12);
    putline ("In allen bestehenden Tasks - insbesondere in der Task ""PUBLIC"" - muß");
    putline ("die Fonttabelle mit dem Kommando");
    line;
    putline ("      font table (""" + font tab name + """)");
    line;
    putline ("eingestellt werden!!!");
    line (4);
    putline ("Generierung beendet, weiter mit 'SV'");
    generate printer server;
    do (buffer);
 
. generate printer server :
    buffer :=  "break (quiet);";
    buffer CAT "spool manager (PROC printer);";
    buffer CAT "INT VAR reply; DATASPACE VAR ds; FILE VAR file;";
    buffer CAT "PROC printer:";
    buffer CAT "  disable stop;";
    buffer CAT "  continue (server channel);";
    buffer CAT "  check error (error message);";
    buffer CAT "  ds := nilspace;";
    buffer CAT "  REP forget (ds);";
    buffer CAT "      execute print;";
    buffer CAT "      IF is error AND online THEN put error; clear error; FI;";
    buffer CAT "  PER;";
    buffer CAT "END PROC printer;";
    buffer CAT "PROC execute print:";
    buffer CAT "  LET ack = 0, fetch code = 11, file type = 1003;";
    buffer CAT "  enable stop;";
    buffer CAT "  ds := nilspace;";
    buffer CAT "  call (father, fetch code, ds, reply);";
    buffer CAT "  IF reply = ack CAND type (ds) = file type";
    buffer CAT "     THEN file := sequential file (input, ds);";
    buffer CAT "          print (file,";
    buffer CAT "            PROC (INT CONST, INT VAR, INT VAR) open,";
    buffer CAT "            PROC (INT CONST, INT CONST) close,";
    buffer CAT "            PROC (INT CONST, TEXT CONST, INT CONST, INT CONST) execute);";
    buffer CAT "  FI;";
    buffer CAT "END PROC execute print;"; 
    buffer CAT "PROC check error(TEXT CONST message):";
    buffer CAT "  IF is error";
    buffer CAT "     THEN clear error; rename myself (message);";
    buffer CAT "          IF is error THEN end(myself) FI;"; 
    buffer CAT "          pause (9000); end(myself);";
    buffer CAT "  FI;";
    buffer CAT "END PROC check error;"; 
