XEmacs 21.2-b1
[chise/xemacs-chise.git.1] / etc / xemacs-fe.sh
diff --git a/etc/xemacs-fe.sh b/etc/xemacs-fe.sh
new file mode 100755 (executable)
index 0000000..881ad07
--- /dev/null
@@ -0,0 +1,316 @@
+#! /bin/sh
+# emacs-fe --- front end driver for `emacs' and other programs
+
+# Copyright (C) 1995, 1996 Noah S. Friedman
+
+# Author: Noah Friedman <friedman@prep.ai.mit.edu>
+# Created: 1995-09-11
+
+# $.Id: emacs-fe,v 1.8 1996/03/07 04:32:33 friedman Exp $
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, you can either send email to this
+# program's maintainer or write to: The Free Software Foundation,
+# Inc.; 59 Temple Place, Suite 330; Boston, MA 02111-1307, USA.
+
+# Commentary:
+
+# Inspired by a similar set of scripts by Charles Sandel <sandel@cli.com>,
+# but generalized into this single script.
+
+# Front-end shell script for GNU Emacs, used to manage multiple versions of
+# Emacs and its associated utilities.
+#
+# Strategy: Install this script as "$prefix/bin/[progname]", for each
+# program named [progname], (e.g. "emacs", "ispell", "etags", etc).  These
+# are the commands users would normally execute to run them.
+
+# Give each version of emacs/xemacs/mule/ispell a separate hierarchy under
+# $prefix/[emacs|xemacs|mule|ispell], with the name
+# "[emacs|xemacs|mule|ispell]-NN.NN" where NN.NN is the version number.
+# This script looks at what versions are available, and selects a version,
+# currently whatever is specified by $DEFAULTLVERSION.
+
+# However, users can specify their own choice to force the selection of a
+# particular version by setting the environment variable PROGNAMEVERSION
+# (e.g. EMACSVERSION, MULEVERSION, XEMACSVERSION, etc.) to have a value
+# which is the version number of the program that they want to use (just
+# the numeric value), or to specify either the NEWEST or OLDEST versions.
+
+# Code:
+
+# Name by which this script was invoked.
+progname=`echo "$0" | sed -e 's/[^\/]*\///g'`
+
+# To prevent hairy quoting and escaping later.
+bq='`'
+eq="'"
+
+case "$progname" in
+  emacs-fe-print )
+    case $# in
+      1 ) : ;;
+      * )
+        echo "$progname: Exactly one argument is required." 1>&2
+        exit 1
+       ;;
+    esac
+
+    # sed is more portable than `dirname'
+    dir=`echo "$0" | sed -e 's/\/*$//' -e 's/\/[^\/]*$//'`
+    if test -f "$dir/$1"; then
+      EMACS_FE_PRINT=t
+      export EMACS_FE_PRINT
+      exec "$dir/$1"
+    fi
+
+    echo "$progname: $bq$dir/$1$eq does not seem to exist." 1>&2
+    exit 1
+  ;;
+esac
+
+DEFAULTVERSION="${DEFAULTVERSION-NEWEST}"
+VARIANT="${EMACSVARIANT-emacs}"
+
+if [ "$prefix" = "" ] ; then
+  # root of the GNU installed tree
+  prefix=/usr/local/gnu
+fi
+
+if [ ! -d "$prefix" ] ; then
+  echo "Cannot find root of GNU tree ($prefix)."
+  exit 1
+fi
+
+case "$progname" in
+  emacs | lemacs | xemacs | mule | ispell )
+    if [ "$eprefix" = "" ] ; then
+      # prefix name of the subdirectory
+      eprefix="${progname}/${progname}-"
+    fi
+   ;;
+  * )
+    eprefix="$VARIANT/${VARIANT}-"
+   ;;
+esac
+
+# Find out which versions are available on the system and sort them
+# in numeric order.
+#
+# The largish sed script prefixes all version numbers with a sort key.
+# That key is constructed by padding out any single or double digits to 3
+# digits from the version number, then converting all occurences of `.' to
+# `0', and prefixing and suffixing the entire result with an additional
+# zero.  After sorting, the sort key is stripped from the output.
+# We do all this because `sort' cannot numerically sort decimal numbers and
+# will stop on the first `.'.
+# This may not work correctly if the version number has more than 4 levels
+# of minor versions (e.g. "1.2.3.4.5" may cause problems).
+availversions=`ls -1d $prefix/${eprefix}*/. 2> /dev/null \
+                | sed -n \
+                      -e "s#^$prefix/$eprefix\([0-9.][0-9.]*\)/\.*#\1#" \
+                      -e 'h
+                          s/[^.]*[^0-9.][^.]*\.//g
+                          :0
+                          /[0-9.][0-9.]*\.[0-9.][0-9.]*\.[0-9.][0-9.]*\.[0-9.][0-9.]*/!{
+                            s/$/.0/
+                            b 0
+                          }
+                          s/^/./
+                          s/$/./
+                          :1
+                          s/\.\([0-9]\)\./.00\1./g
+                          s/\.\([0-9][0-9]\)\./.0\1./g
+                          t 1
+                          s/\./0/g
+                          G
+                          s/\n/ /' \
+                       -e 'p' \
+                 | sort -nu \
+                 | sed -e 's/.* //'`
+
+if [ "$availversions" = "" ] ; then
+       echo "No version of $progname found in $prefix/$eprefix*."
+       exit 1
+fi
+
+# This sets `oldest' to the oldest version available, and `newest'
+# to the newest version available.
+# On line 1, we save the original pattern in the hold space and restore it
+# in case it is the only line of input.
+eval `echo "$availversions" \
+       | sed -ne '1{h;s/^/oldest=/p;g;}
+                  ${s/^/newest=/p;}
+                 '`
+
+# The environment variable [progname]VERSION can have a value which specifies
+# a version number, OR it can contain the values "NEWEST" or "OLDEST" to
+# specify the newest or oldest version which was found.
+sed_upcase='y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'
+
+PROGNAME=`echo "$progname" | sed -e "$sed_upcase" -e 's/-/_/g'`
+eval version=\"\$${PROGNAME}VERSION\"
+
+# If there is no ETAGSVERSION, EMACSCLIENTVERSION, etc, then look for
+# EMACSVERSION, XEMACSVERSION, or whatever the current variant is.
+case "$version" in
+  '' )
+    case "$progname" in
+      ispell )
+        # If this is ispell and ISPELLVERSION isn't set, just use 3.1.
+        # We could run this script recursively with a flag indicating to
+        # find the current emacs variant and version and just print it out,
+        # but that is a very pathological case and is a lot of work.
+        version=3.1 ;;
+      * )
+        variant=`echo "$VARIANT" | sed -e "$sed_upcase"`
+        eval version=\"\$${variant}VERSION\"
+        case "$version" in
+          '' ) version="$DEFAULTVERSION" ;;
+        esac
+       ;;
+    esac
+esac
+
+case "$version" in
+  [Oo][Ll][Dd][Ee][Ss][Tt]) version="$oldest" ;;
+  [Nn][Ee][Ww][Ee][Ss][Tt]) version="$newest" ;;
+  '') version="$oldest" ;;
+  *)
+    if [ ! -d "$prefix/$eprefix$version" ] ;  then
+      echo "$progname: $version: Cannot find requested version." 1>&2
+      version=
+    fi
+   ;;
+esac
+
+# If we don't have a version by now, then give up.
+if [ "$version" = "" ] ; then
+  exec 1>&2
+  echo "$progname: Cannot determine which version to use."
+  case "$availversions" in
+    */* )
+      echo "Available versions are:"
+      for f in $availversions; do
+        echo "   $f"
+      done | sort
+     ;;
+    * )
+      echo "Available versions are:" $availversions
+     ;;
+  esac
+  exit 1
+fi
+
+case "$progname" in
+  emacs | lemacs | xemacs | mule )
+    EMACSVARIANT=$progname
+    eval ${PROGNAME}VERSION=$version
+    eval export EMACSVARIANT ${PROGNAME}VERSION
+
+    case "$EMACSVARIANT-$version" in
+      emacs-18* )       ISPELLVERSION=4.0    ;;
+      emacs-19.[0-9] )  ISPELLVERSION=4.0    ;;
+      emacs-19.1[0-9] ) ISPELLVERSION=4.0    ;;
+      emacs-19.2[0-2] ) ISPELLVERSION=4.0    ;;
+      emacs-19.2[3-9] ) ISPELLVERSION=3.1    ;;
+      emacs-* )         ISPELLVERSION=3.1    ;;
+
+      lemacs-19.[0-9] )        ISPELLVERSION=3.0.09 ;;
+      lemacs-19.10 )   ISPELLVERSION=3.1    ;;
+
+      xemacs-* )       ISPELLVERSION=3.1    ;;
+
+      mule-* )          ISPELLVERSION=3.1    ;;
+    esac
+    export ISPELLVERSION
+   ;;
+esac
+
+case "$progname" in
+  xemacs )
+    # xemacs expects to use the keysym database in /usr/openwin, but that
+    # database doesn't define many of the keysyms it uses.  Unless the user
+    # has already defined their own, specify the keysym database in X11.
+    XKEYSYMDB="${XKEYSYMDB-/usr/local/X11/lib/X11/XKeysymDB}"
+    export XKEYSYMDB
+
+    # Some versions of xemacs (e.g. 19.12) are dynamically linked against
+    # the openwin tooltalk library (libtt.so), so add openwin to the
+    # dynamic load path if necessary.
+    case "$LD_LIBRARY_PATH" in
+       *'/usr/openwin/lib'* ) : ;;
+       '' )
+         LD_LIBRARY_PATH=/usr/local/X11R5/lib:/usr/openwin/lib:/lib
+         export LD_LIBRARY_PATH
+        ;;
+       * )
+         LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/openwin/lib"
+         export LD_LIBRARY_PATH
+        ;;
+    esac
+ ;;
+esac
+
+# Set up the MANPATH so that the man pages for this version
+# are searched first
+if [ -d $prefix/$eprefix$version/man ] ; then
+  MANPATH=$prefix/$eprefix$version/man:$MANPATH
+  export MANPATH
+fi
+
+# There is no need to do this, and it can potentially cause problems,
+# especially if a program like `xemacs' exists in that directory and gets
+# run in subshells instead of this script.
+#PATH=$prefix/$eprefix$version/bin:$PATH
+#export PATH
+
+searchdirs=`exec 2> /dev/null
+            cd $prefix/$eprefix$version \
+            && find bin \
+                    libexec/$VARIANT/$version/* \
+                    lib/$VARIANT/$version/* \
+                    lib/$VARIANT-$version/* \
+                    lib/$VARIANT/etc \
+                    lib/etc \
+                 -type d -print`
+
+for dir in $searchdirs ; do
+  for p in $progname-$version $progname ; do
+    prog="$prefix/$eprefix$version/$dir/$p"
+
+    if test -f "$prog" ; then
+      case "${EMACS_FE_PRINT+set}" in
+        set )
+          echo "$prog"
+          exit 0
+         ;;
+      esac
+
+      exec "$prog" ${1+"$@"}
+    fi
+  done
+done
+
+exec 1>&2
+
+echo "$progname: Cannot find $bq$progname-$version$eq or $bq$progname$eq in"
+
+for d in $searchdirs ; do
+  ls -1d $prefix/$eprefix$version/$d 2> /dev/null \
+   | sed -e "s/^/$progname:   /"
+done
+
+exit 1
+
+# emacs-fe ends here