#!/usr/bin/env bash
#
# interface,v 8.0 2004/04/17 23:40:00 da Exp
#
# Proof General interface wrapper for Isabelle.


## self references

THIS=$(cd "$(dirname "$0")"; pwd)
SUPER=$(cd "$THIS/.."; pwd)
KIND=$(basename "$(dirname "$0")")

if [ "$KIND" = isar ]; then
  ISAR=true
else
  ISAR=false
fi


## diagnostics

usage()
{
  echo
  echo "Usage: Isabelle [OPTIONS] [FILES ...]"
  echo
  echo "  Options are:"
  echo "    -I BOOL      use Isabelle/Isar instead of classic Isabelle (default $ISAR)"
  echo "    -P BOOL      actually start Proof General (default true), otherwise"
  echo "                 run plain tty session"
  echo "    -X BOOL      configure the X-Symbol package on startup (default true)"
  echo "    -g GEOMETRY  specify Emacs geometry"
  echo "    -k NAME      use specific isar-keywords for named logic"
  echo "    -l NAME      logic image name (default \$ISABELLE_LOGIC=$ISABELLE_LOGIC)"
  echo "    -m MODE      add print mode for output"
  echo "    -p NAME      Emacs program name (default xemacs)"
  echo "    -u BOOL      use personal .emacs file (default true)"
  echo "    -w BOOL      use window system (default true)"
  echo "    -x BOOL      enable the X-Symbol package on startup (default false)"
  echo
  echo "Starts Proof General for Isabelle with theory and proof FILES"
  echo "(default Scratch.thy)."
  echo
  echo "  PROOFGENERAL_OPTIONS=$PROOFGENERAL_OPTIONS"
  echo
  exit 1
}

fail()
{
  echo "$1" >&2
  exit 2
}


## process command line

# options

ISABELLE_OPTIONS=""
START_PG="true"
GEOMETRY=""
KEYWORDS=""
LOGIC="$ISABELLE_LOGIC"
PROGNAME="xemacs"
INITFILE="true"
WINDOWSYSTEM="true"
XSYMBOL=""
XSYMBOLSETUP=true

getoptions()
{
  OPTIND=1
  while getopts "I:P:X:g:k:l:m:p:u:w:x:" OPT
  do
    case "$OPT" in
      I)
        ISAR="$OPTARG"
        ;;
      P)
        START_PG="$OPTARG"
        ;;
      X)
        XSYMBOLSETUP="$OPTARG"
        ;;
      g)
        GEOMETRY="$OPTARG"
        ;;
      k)
        KEYWORDS="$OPTARG"
        ;;
      l)
        LOGIC="$OPTARG"
        ;;
      m)
        if [ -z "$ISABELLE_OPTIONS" ]; then
          ISABELLE_OPTIONS="-m $OPTARG"
        else
          ISABELLE_OPTIONS="$ISABELLE_OPTIONS -m $OPTARG"
        fi
        ;;
      p)
        PROGNAME="$OPTARG"
        ;;
      u)
        INITFILE="$OPTARG"
        ;;
      w)
        WINDOWSYSTEM="$OPTARG"
        ;;
      x)
        XSYMBOL="$OPTARG"
        ;;
      \?)
        usage
        ;;
    esac
  done
}

getoptions $PROOFGENERAL_OPTIONS

getoptions "$@"
shift $(($OPTIND - 1))

if [ "$ISAR" = true ]; then
  KIND=isar
  DEFAULT_FILES="Scratch.thy"
else
  KIND=isa
  DEFAULT_FILES="Scratch.thy Scratch.ML"
fi


# args

if [ "$#" -eq 0 ]; then
  FILES="$DEFAULT_FILES"
else
  FILES=""
  while [ "$#" -gt 0 ]; do
    FILES="$FILES '$1'"
    shift
  done
fi


## smart X11 font installation

function checkfonts ()
{
  XLSFONTS=$(xlsfonts -fn "-xsymb-xsymb0-*" 2>&1) || return 1

  case "$XLSFONTS" in
    xlsfonts:*)
      return 1
      ;;
  esac

  return 0
}

function installfonts ()
{
  checkfonts "$XSYMBOL_PATTERN" || eval $XSYMBOL_INSTALLFONTS
}


## main

if [ "$START_PG" = false ]; then

  [ "$ISAR" = true ] && ISABELLE_OPTIONS="$ISABELLE_OPTIONS -I"
  exec "$ISABELLE" $ISABELLE_OPTIONS "$LOGIC"

else

  ARGS=""

  [ -n "$GEOMETRY" ] && ARGS="$ARGS -geometry '$GEOMETRY'"

  [ "$INITFILE" = false ] && ARGS="$ARGS -q"
  
  if [ "$WINDOWSYSTEM" = true -a -n "$DISPLAY" ]; then
    #ARGS="$ARGS -T Isabelle"
    [ -n "$XSYMBOL_INSTALLFONTS" -a "$XSYMBOLSETUP" = true ] && installfonts
  else
    ARGS="$ARGS -nw"
    XSYMBOL=false
  fi
  
  [ ! "$XSYMBOLSETUP" = true ] && XSYMBOL_HOME=""
  
  
  ARGS="$ARGS -l '$SUPER/isa/interface-setup.el'"

  if [ -n "$KEYWORDS" ]; then
    if [ -f "$ISABELLE_HOME_USER/etc/isar-keywords-$KEYWORDS.el" ]; then
      ARGS="$ARGS -l '$ISABELLE_HOME_USER/etc/isar-keywords-$KEYWORDS.el'"
    elif [ -f "$ISABELLE_HOME/etc/isar-keywords-$KEYWORDS.el" ]; then
      ARGS="$ARGS -l '$ISABELLE_HOME/etc/isar-keywords-$KEYWORDS.el'"
    else
      fail "No isar-keywords file for '$KEYWORDS'"
    fi
  elif [ -f "$ISABELLE_HOME_USER/etc/isar-keywords.el" ]; then
    ARGS="$ARGS -l '$ISABELLE_HOME_USER/etc/isar-keywords.el'"
  elif [ -f "$ISABELLE_HOME/etc/isar-keywords.el" ]; then
    ARGS="$ARGS -l '$ISABELLE_HOME/etc/isar-keywords.el'"
  fi
  
  for FILE in "$ISABELLE_HOME/etc/proofgeneral-settings.el" \
      "$ISABELLE_HOME_USER/etc/proofgeneral-settings.el"
  do
    [ -f "$FILE" ] && ARGS="$ARGS -l '$FILE'"
  done
  
  case "$LOGIC" in
    /*)
      ;;
    */*)
      LOGIC="$PWD/$LOGIC"
      ;;
  esac
  
  PROOFGENERAL_HOME="$SUPER"
  PROOFGENERAL_ASSISTANTS="$KIND"
  PROOFGENERAL_LOGIC="$LOGIC"
  PROOFGENERAL_XSYMBOL="$XSYMBOL"
  
  export PROOFGENERAL_HOME PROOFGENERAL_ASSISTANTS PROOFGENERAL_LOGIC PROOFGENERAL_XSYMBOL
  export ISABELLE_OPTIONS
  
  eval exec "$PROGNAME" "$ARGS" "$FILES"

fi
