(*************************************************************************) 
(*   Installationsprogramm für                Stand   :  3. 1.89         *) 
(*      24-Nadel Drucker                      Version : 0.9              *) 
(*                                            Autor   : hjh              *) 
(*************************************************************************) 
 
PACKET driver inst 24 
 
 
       DEFINES treiber einrichten: 
 
 
LET up = ""3""13""5"", 
 
    generator name = "printer.24.nadel", 
 
    description file name = "beschreibungen24", 
    module file name = "module24"; 
 
 
INT VAR pr channel, 
        quality,
        paper format number,
        service option; 
TEXT VAR fonttab name :: "", 
         driver name :: ""; 
TEXT VAR inp; 
BOOL VAR was esc; 
 
treiber einrichten 
 
PROC treiber einrichten:

  treiber einrichten (0)
END PROC treiber einrichten;

PROC treiber einrichten (INT CONST service opt): 
 
  ask for print channel; 
  main menu; 
  IF installed 
    THEN generate printer spool 
    ELSE inform about restart 
  FI. 
 
  ask for printchannel: 
    inits; 
    page; 
    headline ("Druckerkanal - Einstellung"); 
    cursor (1, 15); 
    putline ("Hinweis: Die Druckerkanalnummer kann auch nachträglich mit"); 
    putline ("         'serverchannel (Kanalnummer)' in der Task """ + 
             name (myself) + """"); 
    putline ("         verändert werden."); 
    REP 
      cursor (1, 10);
      put (""5"EUMEL-Kanalnummer des Druckerkanals:");
      get (pr channel);
      disable stop; 
      serverchannel (pr channel);
      BOOL VAR no error :: NOT is error; 
      clear error; 
      no error := no error CAND
                  (pr channel <> channel (myself)) CAND  
                  (pr channel > 1)                 CAND  
                  (pr channel < 17); 
      
      IF NOT no error
        THEN cursor (1, 7); 
             put error;
             putline ("Eingabe korrigiert wiederholen!") 
      FI; 
      enable stop 
    UNTIL no error PER; 
    IF exists task ("canal " + text (pr channel)) 
      THEN end (/ ("canal " + text (pr channel))); 
    FI; 
 
. inits: 
    line; 
    IF single task 
      THEN errorstop ("Dieser Treiber arbeitet nur mit Multi-Tasking-EUMEL") 
    FI; 
    command dialogue (TRUE);
    IF name (myself) <> "PRINTER" 
      THEN putline ("Diese Task heißt nicht ""PRINTER"", sondern """ + 
                    name (myself) + """ !"); 
           IF yes ("Soll die Task in ""PRINTER"" umbenannt werden ?") 
             THEN rename myself ("PRINTER") 
           FI 
    FI; 
    INT VAR choice;
    service option := service opt.
 
  single task:  (pcb (9) AND 255) = 1.
 
  main menu: 
    BOOL VAR installed :: FALSE; 
    REP 
      show main menu; 
      get choice; 
      treat choice 
    UNTIL was esc OR installed PER. 
 
  show main menu: 
    page; 
    headline("Hauptmenü 24-Nadel-Drucker"); 
    putline (" 1. Brother");
    putline (" 2. Epson");
    putline (" 3. NEC"); 
    putline (" 4. OKI");
    putline (" 5. Toshiba").

  get choice: 
    cursor (1,24); 
    put ("CR: Eingabe        ESC: Installation abbrechen"); 
    ask user (5).
 
  treat choice: 
    SELECT int (inp) OF 
      CASE 1: brother menu 
      CASE 2: epson menu 
      CASE 3: nec menu 
      CASE 4: oki menu 
      CASE 5: toshiba menu 
    END SELECT. 
 
  
  brother menu: 
    page;
    headline ("brother - Menü"); 
    putline (" 1. M-1724 L"); 
    cursor (1,24); 
    put ("CR: Eingabe        ESC: Zurück zum Hauptmenü"); 
    ask user (1); 
    page; 
    choice := int (inp);
    IF was esc 
      THEN was esc := FALSE 
      ELSE headline ("");
           putline ("Druckertyp:"); 
           brother m1724l inst
    FI. 
  
    brother m1724l inst: 
      putline ("brother M-1724 L"); 
      line; 
      putline ("Wählen Sie folgende DIP-Schalter Optionen:"); 
      putline ("Emulationsmodus                IBM Proprinter XL ");
      putline ("Automatischer Zeilenvorschub       Nein       ");
      show control options ("paperfeed, std speed, top margin"); 
      show material options ("slow, fast, draft, nlq"); 
      show command options ("draft, nlq"); 
      ask for papersize; 
      ask for quality; 
      IF all right 
        THEN get fonttable ("fonttab.brother"); 
             generate ("brotherm1724l"); 
             adjust papersize; 
             adjust quality; 
             IF choice = 2 THEN do ("papersize (34.544, 30.48)") FI; 
             installed := TRUE 
      FI.
 
 
  toshiba menu:
    page;
    headline ("TOSHIBA - Menü"); 
    putline (" 1. P 321"); 
    cursor (1,24); 
    put ("CR: Eingabe        ESC: Zurück zum Hauptmenü"); 
    ask user (1); 
    page; 
    choice := int (inp);
    IF was esc 
      THEN was esc := FALSE 
      ELSE headline ("");
           putline ("Druckertyp:"); 
           toshiba p321 inst
    FI. 
  
    toshiba p321 inst: 
       putline ("TOSHIBA P 321"); 
       putline ("Die DIP-Schalter müssen so eingestellt sein:"); 
       putline ("S3-8  S3-7  S3-5  übrige Schalter"); 
       putline ("OFF   OFF   *)    egal           "); 
       putline ("*) ON: Einzelblatteinzug, OFF: kein Einzug"); 
       show control options ("std speed, paper feed"); 
       show material options("slow, fast"); 
       show command options ("nlq, draft"); 
       ask for quality; 
       ask for papersize; 
       IF all right 
         THEN get fonttable ("fonttab.toshiba.p321"); 
              generate ("toshp321"); 
              adjust papersize; 
              adjust quality; 
              do ("papersize(21.0,30.48)"); 
              installed := TRUE; 
        FI. 
 
  
  epson menu: 
    page; 
    headline ("Epson - Menü"); 
    putline (" 1. LQ 850"); 
    putline (" 2. LQ 1050"); 
    putline (" 3. LQ 1500"); 
    cursor (1,24); 
    put ("CR: Eingabe        ESC: Zurück zum Hauptmenü"); 
    ask user (3); 
    page; 
    choice := int (inp);
    IF was esc 
      THEN was esc := FALSE 
      ELSE headline ("");
           putline ("Druckertyp:"); 
           SELECT choice OF 
             CASE 1 : lq850 inst
             CASE 2 : lq850 inst
             CASE 3 : lq1500 inst
           END SELECT
    FI. 

    lq850 inst:
      IF choice = 1 
         THEN putline ("Epson LQ 850")
         ELSE putline ("Epson LQ 1050")
      FI; 
      putline ("Die DIP-Schalter müssen so eingestellt sein:"); 
      putline ("SW1-1 SW1-2 SW1-3 SW1-4 SW1-5 SW1-6 SW1-7 SW1-8");
      putline ("egal  egal  egal  egal  egal  egal  *1)    OFF ");
      putline ("*1) ON: Einzelblatteinzug, OFF: kein Einzug"); line;
      putline ("SW2-1 SW2-2 SW2-3 SW2-4 SW2-5 SW2-6 SW2-7 SW2-8"); 
      putline ("egal  egal  *2)                     OFF   OFF");
      putline ("*2) SW2-2 bis SW2-6 müssen je nach Art der Schnittstelle "); 
      putline ("    gesetzt werden (Druckerhandbuch)");
      show control options ("std speed, top margin, std typeface, paperfeed");
      show material options ("slow, fast, draft, nlq, roman, sansserif"); 
      show command options ("draft, nlq, roman, sansserif"); 
      ask for quality; 
      ask for papersize; 
      IF all right 
        THEN get fonttable ("fonttab.epson.lq850"); 
             generate ("epsonlq850"); 
             adjust quality; 
             adjust papersize; 
             IF choice = 2 THEN do ("papersize (34.544, 30.48)") FI; 
             installed := TRUE 
      FI. 
 
  lq1500 inst:
      putline ("EPSON LQ-1500");
      show control options ("");
      show material options ("draft, nlq"); 
      show command options ("draft, nlq"); 
      ask for quality; 
      IF all right 
        THEN get fonttable ("fonttab.epson.lq1500"); 
             generate ("epsonlq1500"); 
             adjust quality; 
             installed := TRUE 
      FI. 
 
  nec menu: 
    page;
    headline ("NEC - Menü"); 
    putline (" 1. PINWRITER P5 "); 
    putline (" 2. PINWRITER P6 "); 
    putline (" 3. PINWRITER P7 "); 
    putline (" 4. PINWRITER P6 PLUS"); 
    putline (" 5. PINWRITER P7 PLUS"); 
    cursor (1,24); 
    put ("CR: Eingabe        ESC: Zurück zum Hauptmenü"); 
    ask user (5); 
    page; 
    choice := int (inp);
    IF was esc 
      THEN was esc := FALSE 
      ELSE headline ("");
           putline ("Druckertyp:"); 
           SELECT choice OF 
             CASE 1   : necp5p7 inst
             CASE 2   : necp6 inst
             CASE 3   : necp5p7 inst 
             CASE 4   : necp6plus inst
             CASE 5   : necp6plus inst
           END SELECT
    FI. 
  
     necp5p7 inst: 
      IF choice = 1 
         THEN putline ("NEC PINWRITER P5") 
         ELSE putline ("NEC PINWRITER P7") 
      FI; 
      show control options ("paper feed"); 
      show material options ("draft, nlq"); 
      show command options ("draft, nlq"); 
      ask for quality; 
      ask for papersize; 
      IF all right 
        THEN get fonttable ("fonttab.nec.p5.new"); 
             generate ("necp5p7"); 
             adjust papersize; 
             adjust quality; 
             installed := TRUE 
      FI. 
 
     necp6 inst: 
      putline ("NEC PINWRITER P6 "); 
      show control options ("paper feed"); 
      show material options ("draft, nlq"); 
      show command options ("draft, nlq"); 
      ask for quality; 
      ask for papersize; 
      IF all right 
        THEN get fonttable ("fonttab.nec.p5.new"); 
             generate ("necp6"); 
             adjust papersize; 
             adjust quality; 
             installed := TRUE 
      FI. 
 
     necp6plus inst: 
      IF choice = 4 
         THEN putline ("NEC PINWRITER P6 PLUS") 
         ELSE putline ("NEC PINWRITER P7 PLUS") 
      FI; 
      putline ("Der Druckertreiber unterstützt auch den Farbdruck mit entsprechendem"); 
      putline ("Farbband.");
      line; 
      putline ("Wählen Sie folgende Optionen im Druckmenü des Druckers:"); 
      putline ("CR FUNCTION             CR ONLY ");
      show control options ("std speed, top margin, std typeface, paperfeed");
      show material options ("slow, fast, draft, nlq, courier, souvenir"); 
      show command options ("draft, nlq, courier, souvenir"); 
      ask for papersize; 
      ask for quality; 
      IF all right 
        THEN get fonttable ("fonttab.nec.p6+"); 
             generate ("necp6+"); 
             adjust papersize; 
             adjust quality; 
             installed := TRUE;
             IF choice = 5 THEN do ("papersize (34.544, 30.48)") FI; 
      FI. 
 
  oki menu: 
    page; 
    headline ("OKI - Menü"); 
    putline (" 1. MICROLINE 390 IBM-/EPSON-kompatibel"); 
    putline (" 2. MICROLINE 391 IBM-/EPSON-kompatibel"); 
    putline (" 3. MICROLINE 393/393C EPSON-kompatibel");                   
    putline (" 4. MICROLINE 393/393C IBM-kompatibel");                     
    cursor (1,24); 
    put ("CR: Eingabe        ESC: Zurück zum Hauptmenü"); 
    ask user (4); 
    page; 
    choice := int (inp);
    IF was esc 
      THEN was esc := FALSE 
      ELSE headline ("");
           putline ("Druckertyp:"); 
           SELECT choice OF 
             CASE 1   : oki ml390 inst                                 
             CASE 2   : oki ml390 inst                                 
             CASE 3   : oki ml393eps inst 
             CASE 4   : oki ml393ibm inst 
           END SELECT
    FI. 
 
    oki ml390 inst:
      IF choice = 1
        THEN putline ("OKI Microline 390") ;
        ELSE putline ("OKI Microline 391") ;
      FI;
      line; 
      putline ("Wählen Sie folgende Optionen im Druckmenü des Druckers:"); 
      putline ("EMULATION MODE           EPSON LQ ");
      putline ("AUTO LF                  NO       ");
      show control options ("paperfeed, std speed, top margin"); 
      show material options ("slow, fast, draft, nlq"); 
      show command options ("draft, nlq, courier, kassette"); 
      ask for papersize; 
      ask for quality; 
      IF all right 
        THEN get fonttable ("fonttab.oki"); 
             generate ("oki390/391"); 
             adjust papersize; 
             adjust quality; 
             IF choice = 2 THEN do ("papersize (34.544, 30.48)") FI; 
             installed := TRUE 
      FI.
 
 
    oki ml393eps inst:
      putline ("OKI Microline 393 EPSON-kompatibel");
      putline ("Der Druckertreiber unterstützt auch den Farbdruck mit entsprechendem"); 
      putline ("Farbband.");
      line; 
      putline ("Wählen Sie folgende Optionen im Druckmenü des Druckers:"); 
      putline ("AUTO LF                  NO    ");
      show control options ("paperfeed, std speed, top margin, std typeface"); 
      show material options ("slow, fast, draft, nlq"); 
      show command options ("draft, nlq, courier, kassette, schwarz, rot, blau, violett, gelb, orange, grün"); 
      ask for papersize; 
      ask for quality; 
      IF all right 
        THEN get fonttable ("fonttab.oki"); 
             generate ("oki393/393Ceps"); 
             adjust papersize; 
             adjust quality;
             installed := TRUE 
      FI.
 
    oki ml393ibm inst:
      putline ("OKI Microline 393 IBM-kompatibel");
      putline ("Der Druckertreiber unterstützt auch den Farbdruck mit entsprechendem"); 
      putline ("Farbband.");
      line; 
      putline ("Wählen Sie folgende Optionen im Druckmenü des Druckers:"); 
      putline ("EMULATION MODE           ASCII ");
      putline ("AUTO LF                  NO    ");
      show control options ("paperfeed, std speed, top margin, std typeface"); 
      show material options ("slow, fast, draft, nlq"); 
      show command options ("draft, nlq, courier, kassette, schwarz, rot, blau, violett, gelb, orange, grün"); 
      ask for papersize; 
      ask for quality; 
      IF all right 
        THEN get fonttable ("fonttab.oki");
             generate ("oki393/393Cibm"); 
             adjust papersize; 
             adjust quality;
             installed := TRUE 
      FI.
 
 
 
generate printer spool: 
   IF service opt = 0 
      THEN forget (generator name, quiet); 
           forget (driver name, quiet) 
    FI;
    eumel must advertise;
    cursor (1, 10);
(*  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 (2);
    putline ("Hinweis: Dieses Installationsprogramm kann in der Task """ + name (myself) + """"); 
    putline ("         mit 'treiber einrichten' aufgerufen werden, wenn ein anderer"); 
    putline ("         Drucker eingesetzt werden soll."); 
    line (2); 
*) 
(*  put ("Generierung beendet, weiter mit 'SV'");
    break (quiet);
*) 
    putline ("  Generierung beendet."); 
    putline ("  Weiter: Bitte Taste drücken"); 
    WHILE incharety <> "" REP ENDREP; 
    REP UNTIL incharety <> "" ENDREP; 
    break; 
    do ("spool manager (PROC printer)").
 
  inform about restart: 
    page; 
    putline ("Es ist kein Druckertreiber installiert worden!"); 
    line; 
    putline ("Dieses Installationsprogramm kann in der Task """ + name (myself) + """"); 
    putline ("mit 'treiber einrichten' erneut aufgerufen werden."); 
    line; 
    pause(50); 
    break. 
 
END PROC treiber einrichten; 
 
PROC headline (TEXT CONST header): 
 
  cursor (13,1); 
  putline ("E U M E L - Druckertreiber - Installations - Programm"); 
  cursor (40 - LENGTH header DIV 2, 2); 
  put (header); 
  line (2) 
END PROC headline; 
 
PROC ask user (INT CONST max choice): 
 
  TEXT VAR exit; 
  inp := "";
  REP 
    cursor (1,23); 
    IF inp = "" 
      THEN put ("Ihre Wahl (Nummer eingeben):")  
      ELSE put ("FEHLER! Eingabe korrigieren:")
    FI; 
    editget (inp, ""27"", "", exit); 
    was esc :=  exit = ""27"";
  UNTIL was esc OR ok PER. 
 
  ok: 
    int (inp) > 0 AND int (inp) <= max choice AND last conversion ok. 
END PROC ask user;

PROC show control options (TEXT CONST options): 
 
  line; 
  putline ("Steuerprozeduren in der Task """ + name (myself) + """:"); 
  write ("papersize, std quality");
  IF options <> "" 
    THEN put (","); 
         putline (options) 
  FI
END PROC show control options; 

PROC show material options (TEXT CONST options): 
 
  line; 
  putline ("Mögliche Materialwerte (#material(""..."")#):"); 
  putline (options) 
END PROC show material options; 
 
PROC show command options (TEXT CONST options): 
 
  line; 
  putline ("Mögliche direkte Druckeranweisungen (#""...""#):"); 
  putline (options) 
END PROC show command options; 
 
PROC ask for quality: 
 
  line (1); 
  putline ("Standard - Druckqualität:"); 
  line; 
  REP out (up); 
    IF yes ("Draft Quality (schneller, aber nicht so schön)") 
      THEN quality := 1; LEAVE ask for quality 
    FI;
    out (up);
    IF yes ("Near Letter Quality (schöner, aber langsamer)")
      THEN quality := 2; LEAVE ask for quality 
    FI;
  PER 
END PROC ask for quality; 
 
PROC adjust quality: 
 
  IF quality = 1 
    THEN do ("std quality (""draft"")") 
    ELSE do ("std quality (""nlq"")") 
  FI 
END PROC adjust quality; 
 
PROC ask for papersize : 
LET up           = ""3""13""5"";
 
  paper format number := paper format ; 
 
    . paper format :
        line (1); 
        putline ("Papierformat:"); 
        line;
        REP out (up);
            IF yes ("Endlospapier, 8 Zoll breit")
               THEN LEAVE paper format WITH 1 FI;
            out (up);
            IF yes ("Endlospapier, 13.2 Zoll breit")
               THEN LEAVE paper format WITH 2 FI;
            out (up);
            IF yes ("Einzelblatteinzug, DINA 4")
               THEN LEAVE paper format WITH 3 FI;
        PER;
        0
END PROC ask for papersize;
 
 
PROC adjust papersize: 
 
    SELECT paper format number OF 
      CASE 1 : do("papersize ( 8.0 * 2.54, 12.0 * 2.54)");
               do ("paper feed (""tractor"")") 
      CASE 2 : do("papersize (13.2 * 2.54, 12.0 * 2.54)");
               do ("paper feed (""tractor"")") 
      CASE 3 : do("papersize (21.0, 29.7)");
               do ("paper feed (""sheet"")") 
    END SELECT
 
END PROC adjust papersize; 
 
BOOL PROC all right: 
 
  line (3);
  cursor (1,23); 
  yes ("Soll der ausgewählte Druckertreiber installiert werden") 
END PROC all right; 
 
PROC get fonttable (TEXT CONST name): 
 
  fonttab name := name; 
  from archive ((description file name & module file name & fonttab name) 
                                                                    - all); 
  fonttable (fonttab name); 
  command dialogue (FALSE); 
  save (fonttab name, /"configurator"); 
  IF service option = 0 
    THEN forget (fonttab name) 
  FI; 
  command dialogue (TRUE); 
END PROC get fonttable; 
 
PROC from archive (THESAURUS CONST files):
 
  IF highest entry (files) > 0 
    THEN fetch from archive; 
         release (archive);
         putline ("Archiv abgemeldet !")
  FI.
 
  fetch from archive: 
    THESAURUS VAR thes :: files; 
    REP 
      ask for archive;
      reserve archive;
      fetch (thes / ALL archive, archive);
      thes := thes - all 
    UNTIL highest entry (thes) = 0 PER.

ask for archive:
  TEXT VAR buffer;
(*line;
  putline ("Bitte Archiv mit den Dateien"); 
  INT VAR index :: 0; 
  REP 
    get (thes, buffer, index); 
    putline ("    " + buffer) 
  UNTIL index = 0 PER; 
  putline ("einlegen !"); 
  line; 
  putline ("Wenn eingelegt: Taste drücken !"); 
  inchar (buffer)*). 
 
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.

END PROC from archive;

THESAURUS OP & (TEXT CONST left, right):
  THESAURUS VAR result := empty thesaurus;
  insert (result, left);
  insert (result, right);
  result
END OP &;

THESAURUS OP & (THESAURUS CONST left, TEXT CONST right):
  THESAURUS VAR result := left;
  insert (result, right);
  result
END OP &;
 
PROC generate (TEXT CONST name): 
 
  open files; 
  read description; 
  build programme; 
  insert programme; 
  forget files. 
 
  open files: 
    line (5); 
    cursor (1, 20); 
    putline (""4"Bitte warten !"); 
    putline ("    - Der Treiber wird generiert."); 
    driver name := "printer." + name + "(generiert)"; 
    IF exists (driver name) 
      THEN forget (driver name, quiet) 
    FI; 
    FILE VAR des file :: sequential file (modify, description file name), 
             mod file :: sequential file (modify, module file name), 
             driver file :: sequential file (output, driver name). 
 
  read description: 
    to line (des file, 1); 
    col (des file, 1);
    downety (des file, "$" + name + "$"); 
    IF eof (des file) 
      THEN errorstop ("Beschreibung von """ + name + """ nicht im"13""10"" + 
                      "Descriptions-File enthalten")
    FI; 
    TEXT VAR description :: "", 
             record; 
    BOOL VAR done :: FALSE; 
    read record (des file, record); 
    record := subtext (record, col (des file) + LENGTH name + 2);
    WHILE NOT eof (des file) AND NOT done REP 
      treat record
    PER. 
 
  treat record: 
    INT VAR dollar pos :: pos (record, "$"); 
    IF dollar pos = 0
      THEN description CAT compress (record); 
           down (des file); 
           read record (des file, record)  
      ELSE description CAT compress (subtext (record, 1, dollar pos - 1));
           col (des file, dollar pos); 
           done := TRUE; 
    FI. 
 
  build programme: 
    get module name; 
    WHILE still modules REP 
      find module; 
      transfer module; 
      get module name 
    PER. 
 
  get module name: 
    INT VAR semicol pos :: pos (description, ";"); 
    TEXT VAR module name; 
    IF semicol pos > 0 
      THEN module name := subtext (description, 1, semicol pos - 1); 
           description := subtext (description, semicol pos + 1) 
      ELSE module name := description; 
           description := "" 
    FI.
 
  still modules: 
    module name <> "" OR description <> "". 
 
  find module: 
    to line (mod file, 1); 
    col (mod file, 1); 
    downety (mod file, "$" + module name + "$"); 
    IF eof (mod file) 
      THEN errorstop ("Modul """ + module name + """ nicht im"13""10"" + 
                      "Modul-File enthalten")
    FI. 
 
  transfer module: 
    done := FALSE; 
    read record (mod file, record); 
    record := subtext (record, col (mod file) + LENGTH module name + 2);
    WHILE NOT eof (mod file) AND NOT done REP 
      transfer record
    PER. 
 
  transfer record: 
    dollar pos := pos (record, "$"); 
    IF dollar pos = 0
      THEN write (driver file, compress (record)); 
           line (driver file);
           down (mod file); 
           read record (mod file, record)  
      ELSE write (driver file, compress (subtext (record, 1, 
                                            dollar pos - 1)));
           col (mod file, dollar pos); 
           done := TRUE; 
           cout (line no (mod file)) 
    FI. 
 
  insert programme: 
    IF online 
      THEN putline ("    - Der Treiber wird insertiert.") 
    FI;
    check off; 
    insert (driver name). 
 
  forget files: 
    IF service option = 0 
      THEN forget (description file name, quiet); 
           forget (module file name, quiet)
    FI  .
END PROC generate; 
 
END PACKET driver inst 24