#! /bin/sh
# ylwrap - wrapper for lex/yacc invocations.
# Copyright (C) 1996, 1997 Free Software Foundation, Inc.
# Written by Tom Tromey <tromey@cygnus.com>.
#
# 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, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

# Usage:
#     ylwrap PROGRAM INPUT [OUTPUT DESIRED]... -- [ARGS]...
# * PROGRAM is program to run.
# * INPUT is the input file
# * OUTPUT is file PROG generates
# * DESIRED is file we actually want
# * ARGS are passed to PROG
# Any number of OUTPUT,DESIRED pairs may be used.

# The program to run.
prog="$1"
shift
# Make any relative path in $prog absolute.
case "$prog" in
 /* | [A-Za-z]:\\*) ;;
 */*) prog="`pwd`/$prog" ;;
esac

# The input.
input="$1"
shift
case "$input" in
 /* | [A-Za-z]:\\*)
    # Absolute path; do nothing.
    ;;
 *)
    # Relative path.  Make it absolute.  Why?  Because otherwise any
    # debugging info in the generated file will point to the wrong
    # place.  This is really gross.
    input="`pwd`/$input"
    ;;
esac

# We don't want to use the absolute path if the input in the current
# directory like when making a tar ball.
input_base=`echo $input | sed -e 's|.*/||'`
if test -f $input_base && cmp $input_base $input >/dev/null 2>&1; then
  input=$input_base
fi

pairlist=
while test "$#" -ne 0; do
   if test "$1" = "--"; then
      shift
      break
   fi
   pairlist="$pairlist $1"
   shift
done

# FIXME: add hostname here for parallel makes that run commands on
# other machines.  But that might take us over the 14-char limit.
dirname=ylwrap$$
trap "cd `pwd`; rm -rf $dirname > /dev/null 2>&1" 1 2 3 15
mkdir $dirname || exit 1

cd $dirname
case "$input" in
 /* | [A-Za-z]:\\*)
    # Absolute path; do nothing.
    ;;
 *)
    # Make a symbolic link, hard link or hardcopy.
    ln -s ../"$input" . > /dev/null 2>&1 || ln ../"$input" . > /dev/null 2>&1 || cp ../"$input" .
    ;;
esac
$prog ${1+"$@"} "$input"
status=$?

if test $status -eq 0; then
   set X $pairlist
   shift
   first=yes
   while test "$#" -ne 0; do
      if test -f "$1"; then
         # If $2 is an absolute path name, then just use that,
         # otherwise prepend `../'.
         case "$2" in
	   /* | [A-Za-z]:\\*) target="$2";;
	   *) target="../$2";;
	 esac
	 mv "$1" "$target" || status=$?
      else
	 # A missing file is only an error for the first file.  This
	 # is a blatant hack to let us support using "yacc -d".  If -d
	 # is not specified, we don't want an error when the header
	 # file is "missing".
	 if test $first = yes; then
	    status=1
	 fi
      fi
      shift
      shift
      first=no
   done
else
   status=$?
fi

# Remove the directory.
cd ..
rm -rf $dirname

exit $status
