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

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

   # 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 's,\\\\,\\\\\\\\,g;s,\\.,\\\\.,g'`

   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.
	 #
	 # We want to use the real output file name, not yy.lex.c for
	 # instance.
	 #
	 # We want the include guards to be adjusted too.
	 FROM=`echo "$from" | sed \
                 -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'\
                 -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'`
	 TARGET=`echo "$2" | sed \
                 -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'\
                 -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'`
         sed "/^#/{s,$input_rx,,;s,$from,$2,;s,$FORM,$TO,;}" "$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
