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