1#! /bin/sh 2# ylwrap - wrapper for lex/yacc invocations. 3# Copyright 1996, 1997, 1998, 1999 Free Software Foundation, Inc. 4# Written by Tom Tromey <tromey@cygnus.com>. 5# 6# This program is free software; you can redistribute it and/or modify 7# it under the terms of the GNU General Public License as published by 8# the Free Software Foundation; either version 2, or (at your option) 9# any later version. 10# 11# This program is distributed in the hope that it will be useful, 12# but WITHOUT ANY WARRANTY; without even the implied warranty of 13# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14# GNU General Public License for more details. 15# 16# You should have received a copy of the GNU General Public License 17# along with this program; if not, write to the Free Software 18# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 19 20# As a special exception to the GNU General Public License, if you 21# distribute this file as part of a program that contains a 22# configuration script generated by Autoconf, you may include it under 23# the same distribution terms that you use for the rest of that program. 24 25# Usage: 26# ylwrap INPUT [OUTPUT DESIRED]... -- PROGRAM [ARGS]... 27# * INPUT is the input file 28# * OUTPUT is file PROG generates 29# * DESIRED is file we actually want 30# * PROGRAM is program to run 31# * ARGS are passed to PROG 32# Any number of OUTPUT,DESIRED pairs may be used. 33 34# The input. 35input="$1" 36shift 37case "$input" in 38 [\\/]* | ?:[\\/]*) 39 # Absolute path; do nothing. 40 ;; 41 *) 42 # Relative path. Make it absolute. 43 input="`pwd`/$input" 44 ;; 45esac 46 47# The directory holding the input. 48input_dir=`echo "$input" | sed -e 's,\([\\/]\)[^\\/]*$,\1,'` 49# Quote $INPUT_DIR so we can use it in a regexp. 50# FIXME: really we should care about more than `.' and `\'. 51input_rx=`echo "$input_dir" | sed -e 's,\\\\,\\\\\\\\,g' -e 's,\\.,\\\\.,g'` 52 53echo "got $input_rx" 54 55pairlist= 56while test "$#" -ne 0; do 57 if test "$1" = "--"; then 58 shift 59 break 60 fi 61 pairlist="$pairlist $1" 62 shift 63done 64 65# The program to run. 66prog="$1" 67shift 68# Make any relative path in $prog absolute. 69case "$prog" in 70 [\\/]* | ?:[\\/]*) ;; 71 *[\\/]*) prog="`pwd`/$prog" ;; 72esac 73 74# FIXME: add hostname here for parallel makes that run commands on 75# other machines. But that might take us over the 14-char limit. 76dirname=ylwrap$$ 77trap "cd `pwd`; rm -rf $dirname > /dev/null 2>&1" 1 2 3 15 78mkdir $dirname || exit 1 79 80cd $dirname 81 82$prog ${1+"$@"} "$input" 83status=$? 84 85if test $status -eq 0; then 86 set X $pairlist 87 shift 88 first=yes 89 # Since DOS filename conventions don't allow two dots, 90 # the DOS version of Bison writes out y_tab.c instead of y.tab.c 91 # and y_tab.h instead of y.tab.h. Test to see if this is the case. 92 y_tab_nodot="no" 93 if test -f y_tab.c || test -f y_tab.h; then 94 y_tab_nodot="yes" 95 fi 96 97 while test "$#" -ne 0; do 98 from="$1" 99 # Handle y_tab.c and y_tab.h output by DOS 100 if test $y_tab_nodot = "yes"; then 101 if test $from = "y.tab.c"; then 102 from="y_tab.c" 103 else 104 if test $from = "y.tab.h"; then 105 from="y_tab.h" 106 fi 107 fi 108 fi 109 if test -f "$from"; then 110 # If $2 is an absolute path name, then just use that, 111 # otherwise prepend `../'. 112 case "$2" in 113 [\\/]* | ?:[\\/]*) target="$2";; 114 *) target="../$2";; 115 esac 116 117 # Edit out `#line' or `#' directives. We don't want the 118 # resulting debug information to point at an absolute srcdir; 119 # it is better for it to just mention the .y file with no 120 # path. 121 sed -e "/^#/ s,$input_rx,," "$from" > "$target" || status=$? 122 else 123 # A missing file is only an error for the first file. This 124 # is a blatant hack to let us support using "yacc -d". If -d 125 # is not specified, we don't want an error when the header 126 # file is "missing". 127 if test $first = yes; then 128 status=1 129 fi 130 fi 131 shift 132 shift 133 first=no 134 done 135else 136 status=$? 137fi 138 139# Remove the directory. 140cd .. 141rm -rf $dirname 142 143exit $status 144