#!/bin/csh -f
#creates a macintosh "postscript with pict preview" file
#in macbinary format. ( transfer to a mac in binary/macbinary enabled mode )
#
###options, change defaults by uncommenting "#" lines  _SEE_README_
###_any_ of these options may be 'unset' or commented out
set first = 1
#set ps2epsdir =  ( /usr/new/bin )     # add to search path
#set notranslate           #do not translate any line endings
#set notransfile           #put mac line ending on only first two lines
#set havemacps             #pass through macps if necessary
#set noshowpage            #undefine showpage in eps file
#set density = 72          #dont change this, it doesn't work :-(
set widenbox = 1           #add n points extra white space around image
set bbinfo                #do not look for existing bounding box
set widenboxbb = 0         #widenbox used when using existing bounding box
set error = er_echo        #turn on error reporting
#set log = ps2eps.log      #write to log rather than stderr
set debuglev = 1           #default debug level ( 0 = none, 5 = all )
#set quiet                  #make -q on by default
###end of options, end of even mildly interesting notes
set colors = ppm24run
if($?debuglev == 0)set debuglev = 0
set destdir = '.'
while( $#argv >  0  )
 switch ( $1 )
 case -exec
 set destdir = o.command
 set command = "$2"
 shift
 breaksw
 case -widen
  set widenbox = $2
  if( $widenbox == unset )unset widenbox
  shift
 breaksw
 case -8
  set colors = ppm8run
 breaksw
 case -24
  set colors = ppm24run
 breaksw
 case -q
 case -batch
  set quiet
 breaksw
 case -d
  set destdir = $2
  shift
 breaksw
 case -ftp
  set ftp = $2
  shift
  set destdir = o.ftp
 breaksw
 case -pipe
  set destdir = stdout
 case -debug
  set debuglev = $2
  shift
 breaksw
 case -log
  set logfile = $2
  shift
 breaksw
 default
  set source = $1 #full path name of original ps file
 breaksw
 endsw
 shift
end
if( $?source == 0 )then
 echo no input file specified
 exit
else if( ! -f $source )then
 echo $source not found
 exit
else if( `head -1 $source | grep '^%\\!' | wc -l` == 0)then
 echo $source is not  a postscript file
 exit
endif
if( $destdir == stdout )then
 set quiet
 if( $?logfile == 0 )set logfile = ps2eps-mac.log  
endif
if( $?error == 1 && $?logfile == 1 )then
 rm -f $logfile
 set error = ( $error -log $logfile )
endif
if( $?error == 0 )set error = er_echo                 ##debug
if( "`which $error[1] | wc -w`" != 1 )goto errorok              #then     ##debug
 echo error, $error[1] is not on your path
 if( "`which st_echo | wc -w`" != 1 )then
  set error = st_echo 
 else
  echo fatal error, st_echo is not on your path either
  exit
 endif                                                 ##debug
errorok:  #endif
set error = ( $error -off $debuglev )
if( $debuglev >= 4 )then                           ##debug
 $error -level 4 shell variables...         ##debug
 set | $error -cat -level 4                  ##debug
 $error -level 4  environment variables...   ##debug
 printenv | $error -cat -level 4             ##debug
 $error -level 4  directory listing...       ##debug
 /bin/ls -l | $error -cat -level 4           ##debug
endif                                                 ##debug
if( $?ps2epsdir == 1 )then
 set path = ( $ps2epsdir $path )
endif
set psfile =  $source:t #original file without pathname
set name = $psfile:r    #root name ( .ps removed )
$error -level 2  reading $source to create ${name}.eps.bin ##debug
set ppm = ${name}.ppm   #ghostscript output
set eps =  ${name}.eps  #name of mac file to be created
set pict = ${eps}.pict  #pict data output by ppmtopict
set dat = ${eps}.ps     #data fork, %%boundin box added and line ends changed
set bin = ${eps}.bin    #macbinary file
set save = ${pict}-save #temporary copy of original
set fls = (  $eps $ppm $pict $dat $bin $save )
set np = 1
while( -f ${name}.${np}ppm || $np < 4 )
 set fls = (  $fls ${name}.${np}ppm )
 @ np = $np + 1
end
set destroy
foreach i ( $fls )
 if( -f $i )then
  if( $?quiet == 0 )echo $i will be over written or deleted
  set destroy = ( $destroy $i )
 endif
end
set q = y
if( "$destroy" != "" && $?quiet ==  0 )then
 echo -n "continue y/n? "
 set q = $<
endif
if( $q != y )exit
foreach i ( $destroy )
 $error -level 1 removing $i -level 3 "`/bin/ls -l $i`" ##debug
 rm -f $i
end
if( $psfile != $source )cp $source $psfile
if( $?widenbox == 0 || $?bbinfo == 1 )goto nobbox
# do we need to look further than 20 lines?
set bbinfo = `head -20 $psfile | grep '%%BoundingBox:' | head -1 | sed -e 's/%%BoundingBox:/ /'`
if( $#bbinfo ==  0 )goto nobbox
if( `echo $bbinfo | grep atend | wc -l` != 0 )then
 $error -level 1 looking for %%BoundingBox at the end of the file
 set bbinfo = `cat $psfile | grep '%%BoundingBox:' | tail -1 | sed -e 's/%%BoundingBox:/ /'`  
 set append
endif
if( $#bbinfo != 4 )then
 $error -level 1 seems to be a %%BoundingBox line but there is a problem so it will be ignored $bbinfo
 set bbinfo = ( )
 goto nobbox
endif
echo $bbinfo  | grep '\.'
if( `echo $bbinfo | grep '\.' | wc -l` != 0 )then
 $error -level 1 bounding box contains non-integers -- trying to fix
 $error -n -level 2 $bbinfo
 foreach jj ( 1 2 3 4 )
  set ibb = `echo "($bbinfo[$jj] + 0.5) / 1" | bc`
   if( $jj <= 2 )set bbinfo[$jj] = $ibb
   if( $jj >= 3 && $bbinfo[$jj] != $ibb )@ bbinfo[$jj] = $ibb + 1
 end
 set append
 $error -level 2 " to " $bbinfo
endif
$error -level 1  using bounding box information from source file %%BoundingBox: $bbinfo ##debug
if(`head -1 $psfile |egrep '^%\\!PS-Adobe-' |wc -l` == 0 )then
#this is the minimum header required by msword5 ( yes case sensative )
 $error -level 2 "the header on this ( eps ) input file is not quite correct so we will be appending a new one"
 set append
endif
if( $?widenboxbb == 0 )set widenboxbb =  $widenbox
set widenbox = $widenboxbb
if( $widenbox != 0)$error -level 1  widened by $widenbox ##debug
nobbox:
if( $?havemacps == 1 && `grep '%%IncludeProcSet: "(AppleDict md)"' $psfile | wc -l` != 0 )then
 mv $psfile $save
 $error -level 1  running macps on file -- only for ghostscript ##debug
 macps $save > $psfile
 set macpsed
endif
if( $?density == 0 )set density = 72
$error -level 1  running ghostscript on $name.... ##debug
$error -level 1  colors: $colors    ##debug
gs -dNODISPLAY pstoppm.ps << DGC | $error -cat -level 3
$density $density ppmsetdensity
($name) $colors
DGC
if( -f $ppm && ! -z $ppm )goto gsdone #then
 if( -f ${name}.1ppm )then
  set npages = ( ${name}.*ppm )
  $error -level 0 sorry, this file apparently contains $#npages pages
  $error -level 0 you can not create multi page eps-pict files
  rm -f $npages
 else
  $error -level 0 fatal error, no output from ghostscript
  if( $debuglev < 3)$error -level 0 re-run using -debug 3 or higher to see ghostscript errors
 endif
 exit
gsdone: #endif
if ( "$first" == "1" ) then
  cp $ppm $ppm.first
  set first = 0
endif
ls -la $ppm.first
$error -level 1  ghostscript done ##debug
if ( $?macpsed == 1)mv $save $psfile
set translate =  "tr '\012' '\015'"
if( $?notranslate == 1)set translate = "cat -"
switch ( $?widenbox )
 case 1
  if( $#bbinfo != 4 )then
   if( $colors != ppm1run )goto colorerror
   $error -level 1  getting bounding box info from pbmtoepsi ##debug
   set bbinfo  = ( `pbmtoepsi $ppm | head -2 | tail -1`  )
   $error -level 2 pbmtoepsi says $bbinfo ##debug
   @ bbinfo[3] = $bbinfo[3] - 1   # I think the pbmtoepsi box is 
   @ bbinfo[4] = $bbinfo[4] + 1   # not quite correct   
   $error -level 2  "'fixed' to be " $bbinfo ##debug
   shift bbinfo
   set append
  endif
  while( $widenbox > 0 && ( $bbinfo[1] - $widenbox < 0 || $bbinfo[2] - $widenbox < 0 ) )
   $error -level 1  -n cant widen box by $widenbox ##debug
   @ widenbox = $widenbox - 1
   $error -level 1  .... using $widenbox ##debug
  end
  if( $widenbox > 0 )then
  set append
  $error -level 1  widening bounding box by $widenbox ##debug
  @ bbinfo[1] = $bbinfo[1] - $widenbox
  @ bbinfo[2] = $bbinfo[2] - $widenbox
  @ bbinfo[3] = $bbinfo[3] + $widenbox
  @ bbinfo[4] = $bbinfo[4] + $widenbox
  endif
  if( $?noshowpage == 1 )set append
  if( $?append == 1 )then
   echo "%\!PS-Adobe-2.0 EPSF-1.2" | $translate > $dat
   echo "%%BoundingBox: $bbinfo" | $translate >> $dat
   $error -level 2  will append bounding box info to postscipt ##debug
   if( $?reportheader == 0 )goto norep  #then
    $error -level 0 first two lines of the file should be:
    $error -level 0 "%\!PS-Adobe-2.0 EPSF-1.2"
    $error -level 0 "%%BoundingBox: $bbinfo"
   norep: #endif
  else
   touch $dat
   $error -level 2  postscipt bounding box left alone ##debug
  endif
 breaksw
 default
  if( $colors != ppm1run )goto colorerror
  $error -level 1  writing eps header using pbmtoepsi directly ##debug
  pbmtoepsi $ppm | head -2 | $translate > $dat
  if( $? reportheader == 1 )pbmtoepsi $ppm | head -2 | $error -level 0 -cat
 breaksw
endsw
if( $?noshowpage == 1 )then
 echo "/showpage {} def" | $translate >> $dat
 $error -level 1   "/showpage {} def" added to postscript  ##debug
endif
if( $?notransfile == 1)set translate = "cat -"
if( "$translate" != "cat -")$error -level 1  translating line endings on postscript file ##debug
cat $psfile  | $translate >> $dat
if( $psfile != $source )rm -f $psfile
if( $?widenbox == 1 )then
 @ xwide =  $bbinfo[3] - $bbinfo[1] + 2
 @ yhi = $bbinfo[4] - $bbinfo[2]
 set xcut = $bbinfo[1]
 @ ycut = - $yhi + $bbinfo[2]
 $error -level 2  pict bounding box $bbinfo                             ##debug
 set bber = "fatal bounding box error"                                  ##debug
 if( $xcut < 0 )set bber = ( $bber ": x = $xcut out of bounds" )        ##debug
 if( $xwide < 8 )set bber = ( $bber ": xwidth = $xwide less than 8 is too small" )  ##debug
 if( $yhi + $ycut > 0 )set bber = ( $bber ": y out of bounds" )         ##debug
 if( $yhi <= 0 )set bber = ( $bber ": height = $yhi is too small" )     ##debug
 if( $#bber == 1 )goto boxok   #then                                    ##debug
  $error -level 0  $bber ; exit                                         ##debug
 boxok: #endif                                                          ##debug
 $error -level 1  writing pict file using pnmcut,ppmtopict              ##debug
 $error -level 2  pnmcut $xcut $ycut $xwide $yhi $ppm                   ##debug
 ( pnmcut $xcut $ycut $xwide $yhi $ppm.first | ppmtopict - > $pict ) |& \
	$error -cat -level 2
else
 $error -level 1  writing pict file using pnmcrop,ppmtopict             ##debug
 ( pnmcrop $ppm.first | ppmtopict - > $pict ) |&  $error -cat -level 2
endif
if( ! -f $pict || -z $pict )then
$error -level 0 fatal error pict not created
ls -l $pict $ppm
if( $debuglev < 2)$error -level 0 re-run with \"-debug 2\"
exit
endif
if( $debuglev >= 3)$error -level 3  removing "`/bin/ls -l $ppm`" ##debug
rm -f $ppm $ppm.first
set iftype ifcreator
if( $?EPSTYPE != 0 )then
 set iftype = ( -type $EPSTYPE )
endif
if( $?EPSCREATOR != 0 )then
 set ifcreator = ( -creator $EPSCREATOR )
endif
$error -level 1  writing macbinary file ##debug
ps-pict2macb $eps $iftype $ifcreator |& $error -cat -level 2
if($debuglev >= 3)then ##debug
 $error -level 3  removing "`/bin/ls -l $pict`" ##debug
 $error -level 3  removing "`/bin/ls -l $dat`" ##debug
endif ##debug
rm -f $pict $dat
switch ( $destdir )
 case .
  $error -level 1  macbinary file $bin saved in current directory ##debug
 breaksw
 case stdout
  cat $bin
  if($debuglev >= 3)$error -level 3  removing "`/bin/ls -l $bin`" ##debug
  rm -f $bin
  $error -level 1  macbinary written to stdout          ##debug
 breaksw
 case o.command
  $error -level 2 $command
  $command $bin
  rm -f $bin
 breaksw
 case o.ftp
  echo $ftp
  ftp $ftp << endftp |& $error -cat -level 1
  bin
  quote macb enabled
  put $bin
  ls $name.eps
endftp
  rm -f $bin
 breaksw
 default
  if( -d $destdir && -w $destdir )then
   mv $bin $destdir
   $error -level 1  output macbinary file is $destdir/$bin    ##debug
  else
   $error -level 1 invalid destination directory $destdir macbinary file $bin left in current directory ##debug
  endif
 breaksw
endsw
exit
colorerror:
$error -level 1 warning attempt to create color preview when source
$error -level 1 file has no bounding box.  - running in b/w mode
$error -level 1 to determine a bounding box
$error -level 1 \( you should add the bb by hand to create a color image \)
set colors = ppm1run
set reportheader
goto nobbox
