#! /bin/sh
SCHEME_LIBRARY_PATH=/usr/share/guile/site/slib/
S48_VICINITY=/usr/share/guile/site/scheme48/
VERSION=3b1
export SCHEME_LIBRARY_PATH S48_VICINITY

##"slib" script; Find a Scheme implementation and initialize SLIB in it.
#Copyright (C) 2003, 2004 Aubrey Jaffer
#
#Permission to copy this software, to modify it, to redistribute it,
#to distribute modified versions, and to use it for any purpose is
#granted, subject to the following restrictions and understandings.
#
#1.  Any copy made of this software must include this copyright notice
#in full.
#
#2.  I have made no warranty or representation that the operation of
#this software will be error-free, and I am under no obligation to
#provide any services, by way of maintenance, update, or otherwise.
#
#3.  In conjunction with products arising from the use of this
#material, there shall be no use of my name in any advertising,
#promotional, or sales literature without prior written consent in
#each case.

usage="Usage: slib [--version | -v]

  Display version information and exit successfully.

Usage: slib SCHEME

  Initialize SLIB in Scheme implementation SCHEME.

Usage: slib

  Initialize SLIB session using executable (MIT) 'scheme', 'scm',
  'gsi', 'mzscheme', 'guile', 'slib48', 'larceny', 'scmlit', 'elk',
  'sisc', or 'kawa'."

case "$1" in
    -v | --ver*) echo slib "$VERSION"; exit 0;;
    "") if type scheme>/dev/null 2>&1; then
	  command=scheme
	fi;;
    -*) echo "$usage"; exit 1;;
    *) command="$1"
	shift
esac
# If more arguments are supplied, then err out.
if [ ! -z "$1" ]; then
    echo "$usage"; exit 1
fi

if [ -z "$command" ]; then
    if type scm>/dev/null 2>&1; then
	command=scm; implementation=scm
    elif type gsi>/dev/null 2>&1; then
	command=gsi; implementation=gam
    elif type mzscheme>/dev/null 2>&1; then
	command=mzscheme; implementation=plt
    elif type guile>/dev/null 2>&1; then
	command=guile; implementation=gui
    elif type slib48>/dev/null 2>&1; then
	command=slib48; implementation=s48
    elif type larceny>/dev/null 2>&1; then
	command=larceny; implementation=lar
    elif type scmlit>/dev/null 2>&1; then
	command=scmlit; implementation=scm
    elif type elk>/dev/null 2>&1; then
	command=elk; implementation=elk
    elif type sisc>/dev/null 2>&1; then
	command=sisc; implementation=ssc
    elif type kawa>/dev/null 2>&1; then
	command=kawa; implementation=kwa
    else
	echo No Scheme implementation found.
	exit 1
    fi
# Gambit 4.0 doesn't allow input redirection; foils --version test.
elif [ "$command" == "gsi" ]; then implementation=gam
elif type $command>/dev/null 2>&1; then
  SPEW="`$command --version < /dev/null 2>&1`"
  if   echo ${SPEW} | grep 'Initialize load-path (colon-list of directories)'\
				       >/dev/null 2>&1; then implementation=elk
  elif echo ${SPEW} | grep 'MIT'       >/dev/null 2>&1; then implementation=mit
  elif echo ${SPEW} | grep 'UMB Scheme'>/dev/null 2>&1; then implementation=umb
  elif echo ${SPEW} | grep 'scheme48'  >/dev/null 2>&1; then implementation=s48
  elif echo ${SPEW} | grep 'MzScheme'  >/dev/null 2>&1; then implementation=plt
  elif echo ${SPEW} | grep 'larceny'   >/dev/null 2>&1; then implementation=lar
  elif echo ${SPEW} | grep 'Guile'     >/dev/null 2>&1; then implementation=gui
  elif echo ${SPEW} | grep 'SCM'       >/dev/null 2>&1; then implementation=scm
  elif echo ${SPEW} | grep 'SISC'      >/dev/null 2>&1; then implementation=ssc
  elif echo ${SPEW} | grep 'Kawa'      >/dev/null 2>&1; then implementation=kwa
  else implementation=
  fi
else
  echo "Program '$command' not found."
  exit 1
fi

case $implementation in
  scm);;
  s48);;
  *) if [ -z "${SCHEME_LIBRARY_PATH}" ]; then
	if type rpm>/dev/null 2>&1; then
	  SCHEME_LIBRARY_PATH=`rpm -ql slib 2>/dev/null \
	     | grep require.scm | sed 's%require.scm%%'`
	fi
     fi
     if [ -z "${SCHEME_LIBRARY_PATH}" ]; then
       if [ -d /usr/local/lib/slib/ ]; then
	  SCHEME_LIBRARY_PATH=/usr/local/lib/slib/
       elif [ -d /usr/share/slib/ ]; then
	  SCHEME_LIBRARY_PATH=/usr/share/slib/
       fi
     export SCHEME_LIBRARY_PATH
     fi;;
esac

# for gambit
case $implementation in
  gam) if [ -z "${LD_LIBRARY_PATH}" ]; then
	LD_LIBRARY_PATH=/usr/local/lib
	export LD_LIBRARY_PATH
	fi;;
esac

case $implementation in
    scm) exec $command -ip1 -l ${SCHEME_LIBRARY_PATH}scm.init "$@";;
    elk) exec $command -i -l ${SCHEME_LIBRARY_PATH}elk.init "$@";;
    gam) exec $command -:s ${SCHEME_LIBRARY_PATH}gambit.init - "$@";;
    ssc) exec $command -e "(load \"${SCHEME_LIBRARY_PATH}sisc.init\")" -- "$@";;
    kwa) exec $command -f ${SCHEME_LIBRARY_PATH}kawa.init -- "$@";;
    plt) exec $command -f ${SCHEME_LIBRARY_PATH}mzscheme.init "$@";;
    gui) exec $command -l ${SCHEME_LIBRARY_PATH}guile.init "$@";;
    lar) exec $command -- -e "(require 'srfi-96)" "$@";;
    mit) exec $command -load ${SCHEME_LIBRARY_PATH}mitscheme.init "$@";;
    s48) if [ -f "${S48_VICINITY}slib.image" ]; then
	exec scheme48 -h 4000000 -i ${S48_VICINITY}slib.image
	else
	echo "scheme48 found; in slib directory do: 'make slib48 && make install48'";
	fi
	exit 1;;
    umb) echo "umb-scheme vicinities are too wedged to run slib"; exit 1;;
    *)   exit 1;;
esac
