#!/bin/csh -f
#
# Andrew Trevorrow, October 1988
# This shell script can print a DVI file, PostScript program, or text file
# on an Apple LaserWriter, DEC PrintServer 40 or Linotronic 300.
# Search for SYSDEP to locate site-specific values that you may want to change.
#
set tex_ps    = (/usr/users/applied/staff/atrevorr/ps)   # SYSDEP
set tfminfo   = (-T /usr/local/lib/tex/fonts/ -P ps-)    # SYSDEP
set dev       = lw         # SYSDEP: use LaserWriter if no -dev value
#
# DON'T change these values unless you know what you're doing:
#
set filename               # changed by last argument without "-" prefix
set filetype  = UNKNOWN    # changed by -dvi/-ps/-text/-two/-wide or filename
set ps_queue  = default    # use device-specific default if no -q value
set conserve  = default    # use device-specific default if no -con or -nocon
set rev       = default    # use device-specific default if no -rev or -norev
set copies    = 1          # changed by -c value
set output                 # changed by -o value
set note                   # changed by -n value
set hoff                   # changed by -ho value
set voff                   # changed by -vo value
set pages                  # changed by -p value
set inc                    # changed by -i value
set mag                    # changed by -m value
set units                  # changed by -u value
set stats                  # changed by -s
set landscape              # changed by -l
set linores   = 1270       # changed by -lowres (to 635)
set size      = a4p        # changed by -size value
set cutmarks  = true       # -cut = do cut marks; changed by -nocut
set flag      = true       # -flag = flag page enabled; changed by -noflag
set manual    = false      # no manual feed; changed by -manual
#
# Parse command line and set various parameters.
#
@ i = 1
while ($i <= $#argv)
   set arg = "$argv[$i]"
   if ("$arg" =~ -*) then                     # arg must be an option
      if ("$arg" == '-dvi') then
         set filetype = DVI
      else if ("$arg" == '-ps') then
         set filetype = PS
      else if ("$arg" == '-text') then
         set filetype = TEXT
      else if ("$arg" == '-two') then
         set filetype = TWO
      else if ("$arg" == '-wide') then
         set filetype = WIDE
      else if ("$arg" == '-dev' | "$arg" == '-device') then
         @ i++
         if ($i > $#argv) then
            echo 'Missing string after -dev\!'
            exit(1)
         endif
         set dev = "$argv[$i]"
      else if ("$arg" == '-o') then
         @ i++
         if ($i > $#argv) then
            echo 'Missing file after -o\!'
            exit(1)
         endif
         set output = "$argv[$i]"
      else if ("$arg" == '-n') then
         @ i++
         if ($i > $#argv) then
            echo 'Missing string after -n\!'
            exit(1)
         endif
         set note = "$argv[$i]"
      else if ("$arg" == '-ho') then
         @ i++
         if ($i > $#argv) then
            echo 'Missing dimension after -ho\!'
            exit(1)
         endif
         set hoff = (-H"$argv[$i]")
      else if ("$arg" == '-vo') then
         @ i++
         if ($i > $#argv) then
            echo 'Missing dimension after -vo\!'
            exit(1)
         endif
         set voff = (-V"$argv[$i]")
      else if ("$arg" == '-c') then
         @ i++
         if ($i > $#argv) then
            echo 'Missing integer after -c\!'
            exit(1)
         endif
         set copies = "$argv[$i]"
         if ("$copies" !~ [0,1,2,3,4,5,6,7,8,9]*) then
            echo 'Bad -c value:' $copies
            echo 'Specify a positive integer.'
            exit(1)
         else if ("$copies" < 1 | "$copies" > 25) then
            echo 'Bad -c value:' $copies
            echo 'Specify a positive integer from 1 to 25.'
            exit(1)
         endif
      else if ("$arg" == '-i') then
         @ i++
         if ($i > $#argv) then
            echo 'Missing integer after -i\!'
            exit(1)
         endif
         set inc = (-i"$argv[$i]")
      else if ("$arg" == '-m') then
         @ i++
         if ($i > $#argv) then
            echo 'Missing integer after -m\!'
            exit(1)
         endif
         set mag = (-m"$argv[$i]")
      else if ("$arg" == '-u') then
         @ i++
         if ($i > $#argv) then
            echo 'Missing units after -u\!'
            exit(1)
         endif
         set units = (-u"$argv[$i]")
      else if ("$arg" == '-p') then
         @ i++
         if ($i > $#argv) then
            echo 'Missing page range after -p\!'
            exit(1)
         endif
         set pages = (-p"$argv[$i]")
      else if ("$arg" == '-s') then
         set stats = -s                       # show stats (if DVI)
      else if ("$arg" == '-con' | "$arg" == '-conserve') then
         set conserve = -c                    # conserve VM (if DVI)
      else if ("$arg" == '-nocon' | "$arg" == '-noconserve') then
         set conserve                         # don't conserve VM
      else if ("$arg" == '-rev' | "$arg" == '-reverse') then
         set rev = -b                         # reverse page order (if DVI)
      else if ("$arg" == '-norev' | "$arg" == '-noreverse') then
         set rev                              # don't reverse
      else if ("$arg" == '-l') then
         set landscape = -l                   # swap paper dimens (if DVI)
      else if ("$arg" == '-f' | "$arg" == '-flag') then
         set flag = true                      # we want a flag page (if lw)
      else if ("$arg" == '-nof' | "$arg" == '-noflag') then
         set flag = false                     # no flag page
      else if ("$arg" == '-man' | "$arg" == '-manual') then
         set manual = true                    # wait for manual feed (if lw)
      else if ("$arg" == '-low' | "$arg" == '-lowres') then
         set linores = 635                    # low resolution (if lino)
      else if ("$arg" == '-cut' | "$arg" == '-cutmarks') then
         set cutmarks = true                  # show cut marks (if lino)
      else if ("$arg" == '-nocut' | "$arg" == '-nocutmarks') then
         set cutmarks = false                 # no cut marks
      else if ("$arg" == '-size') then
         @ i++
         if ($i > $#argv) then
            echo 'Missing value after -size\!'
            exit(1)
         endif
         set size = "$argv[$i]"
      else if ("$arg" == '-q') then
         @ i++
         if ($i > $#argv) then
            echo 'Missing queue after -q\!'
            exit(1)
         endif
         set ps_queue = "$argv[$i]"
      else
         echo 'Unknown option:' $arg
         exit(1)
      endif
   else
      # arg does not start with '-' so assume it is filename
      set filename = "$arg"
   endif
   @ i++
end
if ($filename == '') then
   echo 'File not given\!'
   exit(1)
endif
#
# If filetype is still UNKNOWN then we check filename to determine filetype.
# Note that if foo and foo.dvi exist then "psprint foo" will use foo.dvi
# (and "psprint foo -text" will use foo):
#
if ($filetype == 'UNKNOWN') then
   if ($filename =~ *.ps) then
      set filetype = PS
   else if ($filename =~ *.dvi) then
      set filetype = DVI
   else if (-e {$filename}.dvi) then
      set filename = {$filename}.dvi
      set filetype = DVI
   else
      set filetype = TEXT
   endif
endif
#
# Check that file exists:
#
if (-e $filename) then
   # file exists
else
   echo File not found: $filename
   exit(1)
endif
#
# Check for valid device; if ok then set up some device-specific values:
#
if ("$dev" == 'lw') then
   if ("$ps_queue" == 'default') then
      set ps_queue = ps_local               # SYSDEP: default LaserWriter queue
   else
      # SYSDEP: test for valid queue?
   endif
   if ("$rev" == 'default') set rev = -b          # default is reverse pages
   if ("$conserve" == 'default') set conserve     # default is don't conserve VM
   set papersize = "-x 210mm -y 297mm"            # SYSDEP: A4
   set res = 300
   set dummyfont = (-d cmr10.300pk)               # SYSDEP
   set pkdir = (-f /usr/local/bin/dvitovdu/pk/)   # SYSDEP
else if ("$dev" == 'lino') then
   if ("$ps_queue" == 'default') then
      set ps_queue = lino_queue             # SYSDEP: default Linotronic queue
   else
      # SYSDEP: test for valid queue?
   endif
   if ("$rev" == 'default') set rev                 # default is don't reverse
   if ("$conserve" == 'default') set conserve = -c  # default is conserve VM
   if ("$size" == 'a3l') then
      set pagesetup = A3Lsetup              # defined in lino_header.ps
      set papersize = "-x 297mm -y 420mm"   # A3
   else if ("$size" == 'a4p') then
      set pagesetup = A4Psetup
      set papersize = "-x 210mm -y 297mm"   # A4
   else if ("$size" == 'a4l') then
      set pagesetup = A4Lsetup
      set papersize = "-x 210mm -y 297mm"
   else if ("$size" == 'a5p') then
      set pagesetup = A5Psetup
      set papersize = "-x 148mm -y 210mm"   # A5
   else if ("$size" == 'a5l') then
      set pagesetup = A5Lsetup
      set papersize = "-x 148mm -y 210mm"
   else if ("$size" == 'b5p') then
      set pagesetup = B5Psetup
      set papersize = "-x 176mm -y 250mm"   # B5
   else if ("$size" == 'b5l') then
      set pagesetup = B5Lsetup
      set papersize = "-x 176mm -y 250mm"
   else
      echo 'Unknown -size value:' "$size" '(use a3l,a4p,a4l,a5p,a5l,b5p,b5l)'
      exit(1)
   endif
   set res = $linores                       # 635 or 1270
   set dummyfont = (-d cmr10.{$res}pk)      # SYSDEP
   set pkdir = (-f /usr/local/tex/linopk/)  # SYSDEP
else if ("$dev" == 'ps40') then
   if ("$ps_queue" == 'default') then
      set ps_queue = ps40_queue             # SYSDEP: default PrintServer queue
   else
      # SYSDEP: test for valid queue?
   endif
   if ("$rev" == 'default') set rev               # default is don't reverse pages
   if ("$conserve" == 'default') set conserve     # default is don't conserve VM
   set papersize = "-x 210mm -y 297mm"            # SYSDEP: A4
   set res = 300
   set dummyfont = (-d cmr10.300pk)               # SYSDEP
   set pkdir = (-f /usr/local/tex/write-white/)   # SYSDEP
else
   echo 'Unknown device:' "$dev" '(specify lw, lino or ps40)'
   exit(1)
endif
#
# Linotronic should only be used to print DVI or PS files:
#
if ("$dev" == 'lino') then
   if ($filetype != 'DVI' & $filetype != 'PS') then
      echo 'Linotronic should not be used to print a text file\!'
      exit(1)
   endif
endif
#
# Build temporary file in current directory:
#
set tmpfile = (psprint.tmp)
echo Creating $tmpfile
if ("$dev" == 'lw') then
   #
   # We no longer start with ^D because of problems encountered when
   # a LaserWriter is connected to an X25 pad (due to echoing of ^D):
   #
   cp $tex_ps/lw_header.ps $tmpfile
   echo '/@USER    (USER    :' $user     ') def' >> $tmpfile
   echo '/@NODE    (NODE    :' $HOST     ') def' >> $tmpfile
   echo '/@FILE    (FILE    :' $filename ') def' >> $tmpfile
   echo '/@FORMAT  (FORMAT  :' $filetype ') def' >> $tmpfile
   echo '/@QUEUED  (QUEUED  :' `date`    ') def' >> $tmpfile
   echo '/@NOTE    (NOTE    :' $note     ') def' >> $tmpfile
   if ($flag != 'true') then
      echo '/@bannerpage { } def' >> $tmpfile   # no flag page
   endif
   if ($manual == 'true') then
      echo 'statusdict begin /manualfeed true def end' >> $tmpfile
   endif
else if ("$dev" == 'lino') then
   echo '/@USER ('$user'   '$filename') def' >> $tmpfile
   echo '/@DATE ('`date`') def'              >> $tmpfile
   echo '/@NOTE ('$note') def'               >> $tmpfile
   cat $tex_ps/lino_header.ps >> $tmpfile
   echo $pagesetup >> $tmpfile                  # call page setup procedure
   if ($cutmarks != 'true') then
      echo '/@cutmarks { } def' >> $tmpfile     # no cutmarks
   endif
else # "$dev" must be 'ps40'
   cp $tex_ps/ps40_header.ps $tmpfile
endif
#
# The value of #copies will be used by PostScript's showpage operator to
# print multiple copies of each page:
#
echo '/#copies '$copies' def' >> $tmpfile
#
# Here are some definitions used in the various prologues:
#
if ("$dev" == 'lw')   echo '/dev (LW) def'   >> $tmpfile
if ("$dev" == 'lino') echo '/dev (LINO) def' >> $tmpfile
if ("$dev" == 'ps40') echo '/dev (PS40) def' >> $tmpfile
echo '/res '$res' def' >> $tmpfile
echo '/fspec ('$filename') def' >> $tmpfile   # used in two.ps and wide.ps
if ("$landscape" == '-l') then
   echo '/land true def'  >> $tmpfile
else
   echo '/land false def' >> $tmpfile
endif
#
# Each type of file has its own prologue:
#
if ($filetype == 'DVI')  cat $tex_ps/tex.ps $tex_ps/{$dev}_fonts.ps >> $tmpfile
if ($filetype == 'PS')   cat $tex_ps/ps.ps   >> $tmpfile
if ($filetype == 'TEXT') cat $tex_ps/text.ps >> $tmpfile
if ($filetype == 'TWO')  cat $tex_ps/two.ps  >> $tmpfile
if ($filetype == 'WIDE') cat $tex_ps/wide.ps >> $tmpfile
#
# If DVI file then run psdvi and check exit status:
#
if ($filetype == 'DVI') then
   set psdvifile = (psdvi.tmp)
   $tex_ps/psdvi \
      $rev $landscape $stats $conserve $pkdir $dummyfont $tfminfo \
      "$pages" $inc $mag $units $hoff $voff $papersize \
      -h $tmpfile -o $psdvifile -r $res \
      $filename                     # best if last argument
   #
   # psdvi can exit with 0=success, 1=error, 2=warning:
   #
   if ($status >= '1') then         # psdvi saw warning(s) or fatal error
      rm $tmpfile                   # delete temporary header
      echo 'Printing aborted due to error(s).  '$tmpfile deleted.
      if (-e $psdvifile) then       # psdvi output file exists
         rm $psdvifile              # so delete it
      endif
      exit(1)
   else                             # no errors
      rm $tmpfile                   # delete header
      mv $psdvifile $tmpfile        # and use psdvi output as temporary file
   endif
endif
#
# Complete temporary file:
#
if ("$dev" == 'lw') then
   if ($filetype == 'DVI') then
      cat $tex_ps/lw_trailer.ps $tex_ps/ctrld           >> $tmpfile
   else if ($filetype == 'PS') then
      cat $filename $tex_ps/lw_trailer.ps $tex_ps/ctrld >> $tmpfile
   else # TEXT/TWO/WIDE
      cat $filename $tex_ps/ctrld                       >> $tmpfile
   endif
else if ("$dev" == 'lino') then
   if ($filetype == 'DVI') then
      cat $tex_ps/lino_trailer.ps $tex_ps/ctrld           >> $tmpfile
   else if ($filetype == 'PS') then
      cat $filename $tex_ps/lino_trailer.ps $tex_ps/ctrld >> $tmpfile
   else # TEXT/TWO/WIDE not supported on Linotronic
   endif
else
   # dev = 'ps40'; no trailer file or ^D needed for PrintServer
endif
#
# If -o used then rename temporary file, else print it:
#
if ("$output" == '') then
   lpr -P$ps_queue -h $tmpfile
   echo Your output has been sent to $ps_queue
   # echo debug: lpr '-P'$ps_queue '-h' $tmpfile
   rm $tmpfile
else
   mv $tmpfile $output
   echo PostScript code saved in $output
endif
