#!/bin/bash
#
# Start script for VIPS

# need extended regexps, hence we insist on bash above
shopt -s extglob 
# set -x

# name we were invoked as
bname=`basename $0`

# check args
if [[ $# < 1 ]]; then
	echo "usage: $bname [command ...]"
	echo "examples:"
	echo "    $bname nip"
	echo "    $bname man im_invert"
	echo "    $bname im_invert /pics/tmp/fred.jpg /pics/tmp/fred2.tif"
	exit 1
fi

# try to extract the prefix from a path to an executable
# eg. "/home/john/vips/bin/fred" -> "/home/john/vips"
function find_prefix () {
	# try to canonicalise the path
	ep_canon=$1

	# relative path? prefix with pwd
	if [ ${ep_canon:0:1} != "/" ]; then
		ep_canon=`pwd`/$ep_canon
	fi

	# replace any "/./" with "/"
	ep_canon=${ep_canon//\/.\//\/}

	# any "xxx/../" can go 
	ep_canon=${ep_canon//+([^\/])\/..\//}

	# trailing "xxx/.." can go 
	ep_canon=${ep_canon/%+([^\/])\/../}

	# remove trailing "/bin/xxx" to get the prefix
	ep_prefix=${ep_canon/%\/bin\/+([^\/])/}

	# was there anything to remove in that final step? if not, the path 
	# must be wrong
	if [ x$ep_prefix == x$ep_canon ]; then
		return 1
	fi

	echo $ep_prefix;

	return 0
}

# try to guess the install prefix from $0
function guess_prefix () {
	# $0 is a file? must be us
	if [ -f $0 ]; then
		find_prefix $0
		return 
	fi

	# nope, extract program name from $0 and try looking along the
	# searchpath for it
	name=`basename $0`

	fred=$PATH
	while [ x$fred != x"" ]; do
		path=${fred/:*/}/$name
		fred=${fred/*([^:])?(:)/}

		if [ -f $path ]; then
			find_prefix $path
			return 
		fi
	done

	# not found on path either ... give up!
	return 1
}

prefix=`guess_prefix`;

if [ $? != 0 ]; then
	echo "unable to find $0 from the file name, or from your PATH"
	echo "either run directly, or add the install bin area to "
	echo "your PATH"
	exit 1
fi

export VIPSHOME=$prefix

# add VIPSHOME to man pages
export MANPATH=$VIPSHOME/man:$MANPATH

# add the VIPS lib area to the library path
case `uname` in
HPUX)
	export SHLIB_PATH=$VIPSHOME/lib:$SHLIB_PATH
	;;

Darwin)
	export DYLD_LIBRARY_PATH=$VIPSHOME/lib:$DYLD_LIBRARY_PATH
	;;
 
*)
	export LD_LIBRARY_PATH=$VIPSHOME/lib:$LD_LIBRARY_PATH
	;;
esac

# add VIPS bin area to path
export PATH=$VIPSHOME/bin:$PATH

# run, passing in args we were passed
exec $*
