#!/bin/sh
# @(#) psnup 1.1 Delta: 93/09/26 15:53:13 Extraction: 95/04/10 22:06:42 @(#)
#    Copyright 1991, Chris Lewis, All Rights Reserved.
#
#    Permission to copy and further distribute is freely given provided
#    this copyright notice remains intact and that this software is not
#    sold for profit.
#
trap "rm -f /tmp/?$$" 0
rm -f /tmp/?$$

pages=2
#	Default is nonreversed for use with forward printing printers.
reverse=false
start=0

for i
do
    case $i in
	-p2 | -p4 | -p8 | -p16)
	    pages=`echo $i | sed -e 's/^..//'`
	    ;;
	-p*)
	    echo "$0: -p option ($i) must be 2, 4, 8 or 16" >&2
	    exit 1
	    ;;
	-r)
	    reverse=true
	    ;;
	-R)
	    reverse=false
	    ;;
	-s*)
	    start=`echo $i | sed -e 's/^..//'`
	    if [ -z "$start" -o -n "`echo $start | sed -e 's/[0-9]*//'`" ]
	    then
		echo "$0: Non-numeric start spot option $i" >&2
		exit 1
	    fi
	    ;;
	-*)
	    echo "$0: invalid option $i" >&2
	    echo "usage: $0 [-pn] [-r | -t] [-sn] files" >&2
	    exit 1
	    ;;
	*)
	    files="$files $i"
	    ;;
    esac
    shift
done
if [ $start -ge $pages ]
then
    echo "$0: start option (-s$start) must be < pages/sheet (-p$pages)" \
	>&2
    exit 1
fi
#echo pages $pages
#echo rev $reverse
#echo start $start

eof=`echo X | tr 'X' '\004'`

if [ -z "$files" ]
then
    files=-
fi

touch /tmp/A$$ /tmp/B$$

(
    cat $files
    echo
) | sed -e '1w /tmp/A'$$ \
	-e '1d' \
	-e '/^'$eof'$/w /tmp/B'$$ \
	-e '/^'$eof'$/d' > /tmp/C$$

if grep '^%' /tmp/A$$ > /dev/null
then
    cat /tmp/A$$
    > /tmp/A$$
else
    echo "%!"
fi

sed -e '/@#@Pages@#@/s//'$pages'/' \
    -e '/@#@Rev@#@/s//'$reverse'/' \
    -e '/@#@Start@#@/s//'$start'/' <<\!ENDPRO
%!
%
%!
%
%!
%
% nup.pre.ps -- Prelude for n-up printing. $Revision: 4.2 $
/$Nup 75 dict def $Nup begin/spots @#@Pages@#@ def/reverse? @#@Rev@#@
def/startspot @#@Start@#@ def gsave/transforms[/ind 0 def[2 4 8 16]{spots
eq{exit}if/ind ind 1 add def}forall/upright?[false true false true]ind get
def/numwide[2 2 4 4]ind get def/sfactor[0.5833 0.4444 0.2916 0.2222]ind get
def/pwidth sfactor 612 mul def/pheight sfactor 792 mul def upright?{/width 544
def/height 704 def}{/width 714 def/height 462 def}ifelse reverse?{spots 1 sub
-1 0}{0 1 spots 1 sub}ifelse{/p exch def initmatrix upright?{34 44
translate}{537 39 translate 90 rotate}ifelse p numwide mod pwidth mul height
p numwide idiv 1 add pheight mul sub translate sfactor dup scale matrix
currentmatrix}for]def grestore/spot startspot
def/pods[/showpage/copypage/erasepage/initgraphics/initmatrix/initclip
/defaultmatrix/currentmatrix/setmatrix/restore/gsave/grestore/grestoreall]def
/+s 128 string dup 0(+)putinterval def/-s 128 string dup 0(-)putinterval
def/namestr 128 string def pods{dup namestr cvs dup length/l exch def -s exch
1 exch putinterval systemdict exch get -s 0 l 1 add getinterval exch
def}forall/psave{-gsave[/newpath load{/moveto load}{/lineto load}{/curveto
load}{/closepath load}pathforall]-grestore}def/prestore{cvx exec}def gsave
initgraphics clippath/page-clip psave def grestore/astr 128 string def/numstr
10 string def/$arrays 50 dict def/a2s{/l 0 def{100 mul cvi numstr cvs astr
exch l exch dup length l add/l exch def putinterval astr l(:)putinterval/l
l 1 add def}forall astr 0 l 1 sub getinterval}def/arrdef{exch a2s exch $arrays
3 1 roll put}def/arrload{a2s $arrays exch 2 copy known{get
true}{false}ifelse}def/m matrix def/m2 matrix def/m3 matrix
def/fix-gstate{psave clippath psave 4 2 roll fix-trans -initclip prestore clip
prestore}def/fix-trans{/newspot exch def/oldspot exch def m -currentmatrix
transforms oldspot get m2 invertmatrix m3 concatmatrix transforms newspot get
m concatmatrix -setmatrix}def/page-edges{-gsave +initgraphics -initclip 0.0
setlinewidth newpath 0 0 moveto 0 792 lineto 612 792 lineto 612 0 lineto
closepath stroke -grestore}def/+defaultmatrix{transforms spot get exch
copy}def/+initmatrix{m +defaultmatrix
-setmatrix}def/+initgraphics{-initgraphics +initmatrix
+initclip}def/+initclip{psave m -currentmatrix -initclip +defaultmatrix
page-clip prestore clip -setmatrix prestore}def/+showpage{+copypage +erasepage
+initgraphics}def/+copypage{page-edges spot 1 add dup spots eq{-copypage
-erasepage pop 0}if/spot exch def}def/+erasepage{-gsave +initgraphics
page-clip prestore 1 setgray fill -grestore}def/+restore{spot exch -restore
dup spot ne{dup spot exch fix-gstate/spot exch
def}{pop}ifelse}def/+gsave{-gsave m -currentmatrix spot
arrdef}def/+grestore{-grestore m -currentmatrix arrload{spot
fix-gstate}if}def/+grestoreall{-grestoreall m -currentmatrix arrload{spot
fix-gstate}if}def/+currentmatrix{-currentmatrix dup spot
arrdef}def/+setmatrix{dup -setmatrix dup arrload{spot fix-trans
pop}{(bad setmatrix: )print ==}ifelse}def pods{/pod exch def userdict
pod[$Nup/begin load pod namestr cvs dup length/l exch def +s exch 1 exch
putinterval +s 0 l 1 add getinterval cvn cvx/end load]cvx put}forall end
initgraphics
!ENDPRO

cat /tmp/A$$
cat /tmp/C$$

cat <<\!ENDEPI
% nup.post.ps -- Postlude for n-up printing. $Revision: 4.2 $
$Nup begin spot 0 ne{-showpage}if end
!ENDEPI
if [ -s /tmp/B$$ ]
then
    echo "\c" > /tmp/A$$
    if [ -s /tmp/A$$ ]
    then
	echo -n "$eof"
    else
	echo "$eof\c"
    fi
fi
