#!/usr/local/plan9/bin/rc
if (~ $DEBUG 1) flag x +
# convert Tex dvi to PostScript
PATCH='%!PS-Adobe-2.0'
switch ($LPCLASS) {
case *hp4simx*;
	PATCH=$PATCH'
%% set the default papertray to be the lower tray for HP4siMX printers
	statusdict begin defaultpapertray end 1 ne {
		statusdict begin
			1 setdefaultpapertray
		end
	} if'
}
for (i in `{echo $IBIN|awk -F, '{ n=split($0, a, ","); for (i=1;i<=n;i++) print a[i]; }'}) {
	switch ($i) {
	case man manual manualfeed;
		PATCH=$PATCH'
%%BeginFeature: *Select ManualFeed
[{ systemdict /languagelevel known {languagelevel 1 gt product (HP LaserJet 4Si) ne and} if {
    << /ManualFeed true >> setpagedevice
   } {statusdict begin /manualfeed true def end} ifelse
 } stopped cleartomark
%%EndFeature'
	case simplex;
		DUPLEX=0
	case [0-9];
		switch ($LPCLASS) {
		case *post2*;
			switch ($i) {
			case 0; PATCH=$PATCH'
systemdict/languagelevel known {languagelevel 2 eq {true (0) startjob dup not
{/exitserver errordict/invalidaccess get exec}if}{false}ifelse}{false}ifelse
{
  currentpagedevice/InputAttributes get {0 get} stopped
  {pop pop} {2 dict dup /InputAttributes 1 dict dup
  /Priority[0] put put dup /TraySwitch false put setpagedevice} ifelse
  false (0) startjob pop
} if'
			case 1; PATCH=$PATCH'
systemdict/languagelevel known {languagelevel 2 eq {true (0) startjob dup not
{/exitserver errordict/invalidaccess get exec}if}{false}ifelse}{false}ifelse
{
  currentpagedevice/InputAttributes get {1 get} stopped
  {pop pop} {2 dict dup /InputAttributes 1 dict dup
  /Priority[1] put put dup /TraySwitch false put setpagedevice} ifelse
  false (0) startjob pop
} if'
			}
		case *;	PATCH=$PATCH'
statusdict begin $i setpapertray end'
		}
	case 11x17 ledger;	PATCH=$PATCH'
statusdict begin '$i'tray end'
	}
}
if (! ~ $#DUPLEX 0) {
	switch ($DUPLEX) {
	case 0;
		DUPLEX=false
	case 1;
		DUPLEX=true
	}
	PATCH=$PATCH'
%%BeginFeature: *Set DuplexMode
[{ systemdict /languagelevel known {languagelevel 1 gt product (HP LaserJet 4Si) ne and} if {
    << /Duplex '$DUPLEX'  >> setpagedevice
  } {statusdict /setduplexmode known {statusdict begin '$DUPLEX' setduplexmode end} if} ifelse
 } stopped cleartomark
%%EndFeature'
}
if (! ~ $#LAND 0 && ~ $LAND 1)
	LAND='-tlandscape'
if (~ $LPCLASS *reverse*) {
	switch ($REVERSE) {
	case '';
		REVFLAG=1
	case 1;
		REVFLAG=''
	}
}
switch ($LPCLASS) {
case *post100*;
	DPI='-Z -D100'
case *600dpi*;
	DPI='-Z -D600'
case *1200dpi*;
	DPI='-Z -D1200'
case *;
	DPI=''
}
if (! ~ $COPIES '' -c*) COPIES=-c^$COPIES
if (! ~ $OLIST '' '='*) OLIST=`{echo $OLIST | sed 's/-o/=/' | sed 's/-/:/g' }
switch ($REVFLAG) {
case 1;
	echo $PATCH
	switch ($OLIST) {
	case '';
		eval dvips -q -f $DPI -r $LAND $COPIES $1
	case *;
		DVIFILE=/tmp/dv$pid.dvi
		dviselect -s $OLIST $1 > $DVIFILE
		eval dvips -q -f $DPI -r $LAND $COPIES $DVIFILE
		rm -f $DVIFILE
	}
	$LPLIB/process/hpost </dev/null
case '';
	$LPLIB/process/hpost </dev/null
	echo $PATCH
	switch ($OLIST) {
	case '';
		eval dvips -q -f $DPI $LAND $COPIES $1
	case *;
		DVIFILE=/tmp/dv$pid.dvi
		dviselect -s $OLIST $1 > $DVIFILE
		eval dvips -q -f $DPI $LAND $COPIES $DVIFILE
		rm -f $DVIFILE
	}
}
exit
