#! /bin/sh
# ylwrap - wrapper for lex/yacc invocations.
# Copyright 1996-1999 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.

# As a special exception to the GNU General Public License, if you
# distribute this file as part of a program that contains a
# configuration script generated by Autoconf, you may include it under
# the same distribution terms that you use for the rest of that program.

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

# The input.
input="$1"
shift
case "$input" in
 [\\/]* | ?:[\\/]*)
    # Absolute path; do nothing.
    ;;
 *)
    # Relative path.  Make it absolute.
    input="`pwd`/$input"
    ;;
esac

# The directory holding the input.
input_dir=`echo "$input" | sed -e 's,\([\\/]\)[^\\/]*$,\1,'`
# Quote $INPUT_DIR so we can use it in a regexp.
# FIXME: really we should care about more than `.' and `\'.
input_rx=`echo "$input_dir" | sed -e 's,\\\\,\\\\\\\\,g' -e 's,\\.,\\\\.,g'`

echo "got $input_rx"

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

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

# 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

$prog ${1+"$@"} "$input"
status=$?

if test $status -eq 0; then
   set X $pairlist
   shift
   first=yes
   # Since DOS filename conventions don't allow two dots,
   # the DOS version of Bison writes out y_tab.c instead of y.tab.c
   # and y_tab.h instead of y.tab.h. Test to see if this is the case.
   y_tab_nodot="no"
   if test -f y_tab.c || test -f y_tab.h; then
      y_tab_nodot="yes"
   fi

   while test "$#" -ne 0; do
      from="$1"
      # Handle y_tab.c and y_tab.h output by DOS
      if test $y_tab_nodot = "yes"; then
	 if test $from = "y.tab.c"; then
	    from="y_tab.c"
	 else
	    if test $from = "y.tab.h"; then
	       from="y_tab.h"
	    fi
	 fi
      fi
      if test -f "$from"; then
         # If $2 is an absolute path name, then just use that,
         # otherwise prepend `../'.
         case "$2" in
	   [\\/]* | ?:[\\/]*) target="$2";;
	   *) target="../$2";;
	 esac

	 # Edit out `#line' or `#' directives.  We don't want the
	 # resulting debug information to point at an absolute srcdir;
	 # it is better for it to just mention the .y file with no
	 # path.
	 sed -e "/^#/ s,$input_rx,," "$from" > "$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
