#! /bin/sh
# ylwrap - wrapper for lex/yacc invocations.
#
# Copyright (C) 1996, 1997, 1998, 1999, 2001, 2002 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"shiftcase"$input"in
[\\/]* | ?:[\\/]*)
# Absolute path; do nothing.
;;
*)
# Relative path. Make it absolute.
input="`pwd`/$input"
;;
esac
pairlist=
whiletest"$#" -ne 0; doiftest"$1" = "--"; thenshiftbreakfi
pairlist="$pairlist $1"shiftdone# 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
case $# in
0) $prog "$input" ;;
*) $prog "$@""$input" ;;
esac
status=$?
iftest $status -eq 0; thenset 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"iftest -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'`
whiletest"$#" -ne 0; do
from="$1"# Handle y_tab.c and y_tab.h output by DOS
iftest $y_tab_nodot = "yes"; theniftest $from = "y.tab.c"; then
from="y_tab.c"elseiftest $from = "y.tab.h"; then
from="y_tab.h"fififiiftest -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".
iftest $first = yes; then
status=1
fifishiftshift
first=no
doneelse
status=$?
fi# Remove the directory.
cd ..
rm -rf $dirname
exit $status