#! /bin/sh
# ylwrap - wrapper for lex/yacc invocations.
# Copyright 1996, 1997, 1998, 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
	 from_rx=`echo "$from" | sed -e 's,\\\\,\\\\\\\\,g' -e 's,\\.,\\\\.,g'`

	 # 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,," -e "/^#/ s,$from_rx,$2," "$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
