125b3c049e70834cf33790a28643ab058b507b35cBen Cheng#! /bin/sh
225b3c049e70834cf33790a28643ab058b507b35cBen Cheng# ylwrap - wrapper for lex/yacc invocations.
325b3c049e70834cf33790a28643ab058b507b35cBen Cheng# Copyright 1996, 1997, 1998, 1999, 2001  Free Software Foundation, Inc.
425b3c049e70834cf33790a28643ab058b507b35cBen Cheng# Written by Tom Tromey <tromey@cygnus.com>.
525b3c049e70834cf33790a28643ab058b507b35cBen Cheng#
625b3c049e70834cf33790a28643ab058b507b35cBen Cheng# This program is free software; you can redistribute it and/or modify
725b3c049e70834cf33790a28643ab058b507b35cBen Cheng# it under the terms of the GNU General Public License as published by
825b3c049e70834cf33790a28643ab058b507b35cBen Cheng# the Free Software Foundation; either version 2, or (at your option)
925b3c049e70834cf33790a28643ab058b507b35cBen Cheng# any later version.
1025b3c049e70834cf33790a28643ab058b507b35cBen Cheng#
1125b3c049e70834cf33790a28643ab058b507b35cBen Cheng# This program is distributed in the hope that it will be useful,
1225b3c049e70834cf33790a28643ab058b507b35cBen Cheng# but WITHOUT ANY WARRANTY; without even the implied warranty of
1325b3c049e70834cf33790a28643ab058b507b35cBen Cheng# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1425b3c049e70834cf33790a28643ab058b507b35cBen Cheng# GNU General Public License for more details.
1525b3c049e70834cf33790a28643ab058b507b35cBen Cheng#
1625b3c049e70834cf33790a28643ab058b507b35cBen Cheng# You should have received a copy of the GNU General Public License
1725b3c049e70834cf33790a28643ab058b507b35cBen Cheng# along with this program; if not, write to the Free Software
1825b3c049e70834cf33790a28643ab058b507b35cBen Cheng# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
1925b3c049e70834cf33790a28643ab058b507b35cBen Cheng
2025b3c049e70834cf33790a28643ab058b507b35cBen Cheng# As a special exception to the GNU General Public License, if you
2125b3c049e70834cf33790a28643ab058b507b35cBen Cheng# distribute this file as part of a program that contains a
2225b3c049e70834cf33790a28643ab058b507b35cBen Cheng# configuration script generated by Autoconf, you may include it under
2325b3c049e70834cf33790a28643ab058b507b35cBen Cheng# the same distribution terms that you use for the rest of that program.
2425b3c049e70834cf33790a28643ab058b507b35cBen Cheng
2525b3c049e70834cf33790a28643ab058b507b35cBen Cheng# Usage:
2625b3c049e70834cf33790a28643ab058b507b35cBen Cheng#     ylwrap INPUT [OUTPUT DESIRED]... -- PROGRAM [ARGS]...
2725b3c049e70834cf33790a28643ab058b507b35cBen Cheng# * INPUT is the input file
2825b3c049e70834cf33790a28643ab058b507b35cBen Cheng# * OUTPUT is file PROG generates
2925b3c049e70834cf33790a28643ab058b507b35cBen Cheng# * DESIRED is file we actually want
3025b3c049e70834cf33790a28643ab058b507b35cBen Cheng# * PROGRAM is program to run
3125b3c049e70834cf33790a28643ab058b507b35cBen Cheng# * ARGS are passed to PROG
3225b3c049e70834cf33790a28643ab058b507b35cBen Cheng# Any number of OUTPUT,DESIRED pairs may be used.
3325b3c049e70834cf33790a28643ab058b507b35cBen Cheng
3425b3c049e70834cf33790a28643ab058b507b35cBen Cheng# The input.
3525b3c049e70834cf33790a28643ab058b507b35cBen Chenginput="$1"
3625b3c049e70834cf33790a28643ab058b507b35cBen Chengshift
3725b3c049e70834cf33790a28643ab058b507b35cBen Chengcase "$input" in
3825b3c049e70834cf33790a28643ab058b507b35cBen Cheng [\\/]* | ?:[\\/]*)
3925b3c049e70834cf33790a28643ab058b507b35cBen Cheng    # Absolute path; do nothing.
4025b3c049e70834cf33790a28643ab058b507b35cBen Cheng    ;;
4125b3c049e70834cf33790a28643ab058b507b35cBen Cheng *)
4225b3c049e70834cf33790a28643ab058b507b35cBen Cheng    # Relative path.  Make it absolute.
4325b3c049e70834cf33790a28643ab058b507b35cBen Cheng    input="`pwd`/$input"
4425b3c049e70834cf33790a28643ab058b507b35cBen Cheng    ;;
4525b3c049e70834cf33790a28643ab058b507b35cBen Chengesac
4625b3c049e70834cf33790a28643ab058b507b35cBen Cheng
4725b3c049e70834cf33790a28643ab058b507b35cBen Chengpairlist=
4825b3c049e70834cf33790a28643ab058b507b35cBen Chengwhile test "$#" -ne 0; do
4925b3c049e70834cf33790a28643ab058b507b35cBen Cheng   if test "$1" = "--"; then
5025b3c049e70834cf33790a28643ab058b507b35cBen Cheng      shift
5125b3c049e70834cf33790a28643ab058b507b35cBen Cheng      break
5225b3c049e70834cf33790a28643ab058b507b35cBen Cheng   fi
5325b3c049e70834cf33790a28643ab058b507b35cBen Cheng   pairlist="$pairlist $1"
5425b3c049e70834cf33790a28643ab058b507b35cBen Cheng   shift
5525b3c049e70834cf33790a28643ab058b507b35cBen Chengdone
5625b3c049e70834cf33790a28643ab058b507b35cBen Cheng
5725b3c049e70834cf33790a28643ab058b507b35cBen Cheng# The program to run.
5825b3c049e70834cf33790a28643ab058b507b35cBen Chengprog="$1"
5925b3c049e70834cf33790a28643ab058b507b35cBen Chengshift
6025b3c049e70834cf33790a28643ab058b507b35cBen Cheng# Make any relative path in $prog absolute.
6125b3c049e70834cf33790a28643ab058b507b35cBen Chengcase "$prog" in
6225b3c049e70834cf33790a28643ab058b507b35cBen Cheng [\\/]* | ?:[\\/]*) ;;
6325b3c049e70834cf33790a28643ab058b507b35cBen Cheng *[\\/]*) prog="`pwd`/$prog" ;;
6425b3c049e70834cf33790a28643ab058b507b35cBen Chengesac
6525b3c049e70834cf33790a28643ab058b507b35cBen Cheng
6625b3c049e70834cf33790a28643ab058b507b35cBen Cheng# FIXME: add hostname here for parallel makes that run commands on
6725b3c049e70834cf33790a28643ab058b507b35cBen Cheng# other machines.  But that might take us over the 14-char limit.
6825b3c049e70834cf33790a28643ab058b507b35cBen Chengdirname=ylwrap$$
6925b3c049e70834cf33790a28643ab058b507b35cBen Chengtrap "cd `pwd`; rm -rf $dirname > /dev/null 2>&1" 1 2 3 15
7025b3c049e70834cf33790a28643ab058b507b35cBen Chengmkdir $dirname || exit 1
7125b3c049e70834cf33790a28643ab058b507b35cBen Cheng
7225b3c049e70834cf33790a28643ab058b507b35cBen Chengcd $dirname
7325b3c049e70834cf33790a28643ab058b507b35cBen Cheng
7425b3c049e70834cf33790a28643ab058b507b35cBen Cheng$prog ${1+"$@"} "$input"
7525b3c049e70834cf33790a28643ab058b507b35cBen Chengstatus=$?
7625b3c049e70834cf33790a28643ab058b507b35cBen Cheng
7725b3c049e70834cf33790a28643ab058b507b35cBen Chengif test $status -eq 0; then
7825b3c049e70834cf33790a28643ab058b507b35cBen Cheng   set X $pairlist
7925b3c049e70834cf33790a28643ab058b507b35cBen Cheng   shift
8025b3c049e70834cf33790a28643ab058b507b35cBen Cheng   first=yes
8125b3c049e70834cf33790a28643ab058b507b35cBen Cheng   # Since DOS filename conventions don't allow two dots,
8225b3c049e70834cf33790a28643ab058b507b35cBen Cheng   # the DOS version of Bison writes out y_tab.c instead of y.tab.c
8325b3c049e70834cf33790a28643ab058b507b35cBen Cheng   # and y_tab.h instead of y.tab.h. Test to see if this is the case.
8425b3c049e70834cf33790a28643ab058b507b35cBen Cheng   y_tab_nodot="no"
8525b3c049e70834cf33790a28643ab058b507b35cBen Cheng   if test -f y_tab.c || test -f y_tab.h; then
8625b3c049e70834cf33790a28643ab058b507b35cBen Cheng      y_tab_nodot="yes"
8725b3c049e70834cf33790a28643ab058b507b35cBen Cheng   fi
8825b3c049e70834cf33790a28643ab058b507b35cBen Cheng
8925b3c049e70834cf33790a28643ab058b507b35cBen Cheng   # The directory holding the input.
9025b3c049e70834cf33790a28643ab058b507b35cBen Cheng   input_dir=`echo "$input" | sed -e 's,\([\\/]\)[^\\/]*$,\1,'`
9125b3c049e70834cf33790a28643ab058b507b35cBen Cheng   # Quote $INPUT_DIR so we can use it in a regexp.
9225b3c049e70834cf33790a28643ab058b507b35cBen Cheng   # FIXME: really we should care about more than `.' and `\'.
9325b3c049e70834cf33790a28643ab058b507b35cBen Cheng   input_rx=`echo "$input_dir" | sed 's,\\\\,\\\\\\\\,g;s,\\.,\\\\.,g'`
9425b3c049e70834cf33790a28643ab058b507b35cBen Cheng
9525b3c049e70834cf33790a28643ab058b507b35cBen Cheng   while test "$#" -ne 0; do
9625b3c049e70834cf33790a28643ab058b507b35cBen Cheng      from="$1"
9725b3c049e70834cf33790a28643ab058b507b35cBen Cheng      # Handle y_tab.c and y_tab.h output by DOS
9825b3c049e70834cf33790a28643ab058b507b35cBen Cheng      if test $y_tab_nodot = "yes"; then
9925b3c049e70834cf33790a28643ab058b507b35cBen Cheng	 if test $from = "y.tab.c"; then
10025b3c049e70834cf33790a28643ab058b507b35cBen Cheng	    from="y_tab.c"
10125b3c049e70834cf33790a28643ab058b507b35cBen Cheng	 else
10225b3c049e70834cf33790a28643ab058b507b35cBen Cheng	    if test $from = "y.tab.h"; then
10325b3c049e70834cf33790a28643ab058b507b35cBen Cheng	       from="y_tab.h"
10425b3c049e70834cf33790a28643ab058b507b35cBen Cheng	    fi
10525b3c049e70834cf33790a28643ab058b507b35cBen Cheng	 fi
10625b3c049e70834cf33790a28643ab058b507b35cBen Cheng      fi
10725b3c049e70834cf33790a28643ab058b507b35cBen Cheng      if test -f "$from"; then
10825b3c049e70834cf33790a28643ab058b507b35cBen Cheng         # If $2 is an absolute path name, then just use that,
10925b3c049e70834cf33790a28643ab058b507b35cBen Cheng         # otherwise prepend `../'.
11025b3c049e70834cf33790a28643ab058b507b35cBen Cheng         case "$2" in
11125b3c049e70834cf33790a28643ab058b507b35cBen Cheng	   [\\/]* | ?:[\\/]*) target="$2";;
11225b3c049e70834cf33790a28643ab058b507b35cBen Cheng	   *) target="../$2";;
11325b3c049e70834cf33790a28643ab058b507b35cBen Cheng	 esac
11425b3c049e70834cf33790a28643ab058b507b35cBen Cheng
11525b3c049e70834cf33790a28643ab058b507b35cBen Cheng	 # Edit out `#line' or `#' directives.
11625b3c049e70834cf33790a28643ab058b507b35cBen Cheng	 #
11725b3c049e70834cf33790a28643ab058b507b35cBen Cheng	 # We don't want the resulting debug information to point at
11825b3c049e70834cf33790a28643ab058b507b35cBen Cheng	 # an absolute srcdir; it is better for it to just mention the
11925b3c049e70834cf33790a28643ab058b507b35cBen Cheng	 # .y file with no path.
12025b3c049e70834cf33790a28643ab058b507b35cBen Cheng	 #
12125b3c049e70834cf33790a28643ab058b507b35cBen Cheng	 # We want to use the real output file name, not yy.lex.c for
12225b3c049e70834cf33790a28643ab058b507b35cBen Cheng	 # instance.
12325b3c049e70834cf33790a28643ab058b507b35cBen Cheng	 #
12425b3c049e70834cf33790a28643ab058b507b35cBen Cheng	 # We want the include guards to be adjusted too.
12525b3c049e70834cf33790a28643ab058b507b35cBen Cheng	 FROM=`echo "$from" | sed \
12625b3c049e70834cf33790a28643ab058b507b35cBen Cheng                 -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'\
12725b3c049e70834cf33790a28643ab058b507b35cBen Cheng                 -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'`
12825b3c049e70834cf33790a28643ab058b507b35cBen Cheng	 TARGET=`echo "$2" | sed \
12925b3c049e70834cf33790a28643ab058b507b35cBen Cheng                 -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'\
13025b3c049e70834cf33790a28643ab058b507b35cBen Cheng                 -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'`
13125b3c049e70834cf33790a28643ab058b507b35cBen Cheng         sed "/^#/{s,$input_rx,,;s,$from,$2,;s,$FORM,$TO,;}" "$from" >"$target" ||
13225b3c049e70834cf33790a28643ab058b507b35cBen Cheng            status=$?
13325b3c049e70834cf33790a28643ab058b507b35cBen Cheng      else
13425b3c049e70834cf33790a28643ab058b507b35cBen Cheng	 # A missing file is only an error for the first file.  This
13525b3c049e70834cf33790a28643ab058b507b35cBen Cheng	 # is a blatant hack to let us support using "yacc -d".  If -d
13625b3c049e70834cf33790a28643ab058b507b35cBen Cheng	 # is not specified, we don't want an error when the header
13725b3c049e70834cf33790a28643ab058b507b35cBen Cheng	 # file is "missing".
13825b3c049e70834cf33790a28643ab058b507b35cBen Cheng	 if test $first = yes; then
13925b3c049e70834cf33790a28643ab058b507b35cBen Cheng	    status=1
14025b3c049e70834cf33790a28643ab058b507b35cBen Cheng	 fi
14125b3c049e70834cf33790a28643ab058b507b35cBen Cheng      fi
14225b3c049e70834cf33790a28643ab058b507b35cBen Cheng      shift
14325b3c049e70834cf33790a28643ab058b507b35cBen Cheng      shift
14425b3c049e70834cf33790a28643ab058b507b35cBen Cheng      first=no
14525b3c049e70834cf33790a28643ab058b507b35cBen Cheng   done
14625b3c049e70834cf33790a28643ab058b507b35cBen Chengelse
14725b3c049e70834cf33790a28643ab058b507b35cBen Cheng   status=$?
14825b3c049e70834cf33790a28643ab058b507b35cBen Chengfi
14925b3c049e70834cf33790a28643ab058b507b35cBen Cheng
15025b3c049e70834cf33790a28643ab058b507b35cBen Cheng# Remove the directory.
15125b3c049e70834cf33790a28643ab058b507b35cBen Chengcd ..
15225b3c049e70834cf33790a28643ab058b507b35cBen Chengrm -rf $dirname
15325b3c049e70834cf33790a28643ab058b507b35cBen Cheng
15425b3c049e70834cf33790a28643ab058b507b35cBen Chengexit $status
155