program printer_set;

{******************************************************************************

     Program  : PRINTER_SET - Printer option configuration program
     Version  : 1.0
     Author   : Eliot Ramey
     Language : Pascal/MT+ V5.5

******************************************************************************}

const

     { Version number }

     vers = 10;   printer = 'Okidata';

     { Ascii equates }

     lf = 10;     vt = 11;     ff = 12;     cr = 13;
     so = 14;     si = 15;     dc1 = 17;    dc3 = 19;
     dc4 = 20;    can = 24;    esc = 27;    gs = 29;
     rs = 30;     us = 31;

     { Printer control codes - used in escape sequences }

     set_tof = 53;             six_lpi = 54;
     eight_lpi = 56;           long_line = 65;
     short_line = 66;

     { Default printer set-up }

     default = 'CAN LPI=6 CPI=16 LIN=S GRF=O';

type

    strptr = ^string;

var
    command : strptr;
    options : string[80];
    filename : string[14];
    ofile : text;
    optlen, result, lpi, cpi, cpipos : integer;
    grf, lin : char;

{******************************************************************************
     Function @CMD : Special Pacal/MT+ function
******************************************************************************}
external function @cmd : command;

{******************************************************************************
    Procedure SET_LPI : Sets number of lines per inch - 6,8
******************************************************************************}
procedure set_lpi(lines_per_inch : integer);

 begin
      case lines_per_inch of
           six_lpi : write(ofile,chr(esc),chr(six_lpi));
           eight_lpi : write(ofile,chr(esc),chr(eight_lpi));
      else
           writeln('Argument error for LPI.')
      end { case }
 end;

{******************************************************************************
    Procedure SET_CPI : Sets number of characters per inch - 5,8,10,16
******************************************************************************}
procedure set_cpi(chars_per_inch : integer);
 begin
      case chars_per_inch of
            5 : write(ofile,chr(rs),chr(us));
            8 : write(ofile,chr(gs),chr(us));
           10 : write(ofile,chr(rs));
           16 : write(ofile,chr(gs));
      else
          writeln('Argument error for CPI.')
      end { case }
 end;

{******************************************************************************
     Procedure SET_LIN : Set line length - Short or Long
******************************************************************************}
procedure set_lin(line_length : char);
 begin
      case line_length of
           'S' : write(ofile,chr(esc),chr(short_line));
           'L' : write(ofile,chr(esc),chr(long_line));
      else
           writeln('Argument error for LIN.')
      end { case }
 end;

{******************************************************************************
     Procedure SET_GRF : Sets graphics mode - In or Out
******************************************************************************}
procedure set_grf(graphics : char);
 begin
      case graphics of
           'I' : write(ofile,chr(si));
           'O' : write(ofile,chr(so));
      else
           writeln('Argument error for GRF.')
      end { case }
 end;

{******************************************************************************
     Procedure CAN_BUF : Cancels printer buffer - no arguments
******************************************************************************}
procedure can_buf;
 begin
      write(ofile,chr(can));
 end;

{******************************************************************************
     Procedure TOP_OF_FORM : Form feed - no arguments
******************************************************************************}
procedure top_of_form;
 begin
      write(ofile,chr(ff)); 
 end;

{******************************************************************************
     Procedure CLINE : Print commands - no arguments
******************************************************************************}
procedure cline;
 begin
          writeln('Enter options on command line:');
          writeln;
          writeln('LPI=n                        n=6 or 8');
          writeln('CPI=n                     n=5,8,10,16');
          writeln('LIN=c             c="S"hort or "L"ong');
          writeln('GRF=c               c="I"nto or "O"ut');
          writeln('CAN                      no arguments');
          writeln('TOF                      no arguments');
          writeln('DEF',default : 34);
 end;

{******************************************************************************
     Program PRINTER_SET : Set printer options - from command line
******************************************************************************}
begin { printer_set }
     command := @cmd;
     options := command^;
     assign(ofile,'LST:');
     rewrite(ofile);
     if length(options) > 1
          then begin
               if pos('LPI',options) <> 0
                    then begin
                    lpi := ord(options[pos('LPI=',options) + 4]);
                    set_lpi(lpi)
               end;

               if pos('DEF',options) <> 0
                   then begin
                        if pos('DEF',options) > 2
                             then
                                  writeln('DEF must be only option.')
                             else
                                  options := default;
                        end;

               if pos('CPI',options) <> 0
                    then begin
                         cpipos := pos('CPI=',options) + 4;
                         if options[cpipos + 1] in ['0'..'9']
                              then
                                   cpi := ((ord(options[cpipos])
                                          - ord('0')) * 10) 
                                          + (ord(options[cpipos+1])
                                          - ord('0'))
                              else
                                   cpi := ord(options[cpipos]) - ord('0');
                                   set_cpi(cpi)
                         end;

               if pos('LIN',options) <> 0
                    then begin
                         lin := options[pos('LIN=',options) + 4];
                         set_lin(lin)
                    end;

               if pos('GRF',options) <> 0
                    then begin
                         grf := options[pos('GRF=',options) + 4];
                         set_grf(grf)
                    end;

               if pos('CAN',options) <> 0 then can_buf;

               if pos('TOF',options) <> 0 then top_of_form;

               close(ofile,result)
          end
     else begin
          writeln(printer,' set program ',(vers div 10),'.',(vers mod 10));
          cline;
     end;
end. { pset }
