1#! /bin/sh 2# ylwrap - wrapper for lex/yacc invocations. 3# Copyright 1996, 1997, 1998, 1999, 2001 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 47pairlist= 48while test "$#" -ne 0; do 49 if test "$1" = "--"; then 50 shift 51 break 52 fi 53 pairlist="$pairlist $1" 54 shift 55done 56 57# The program to run. 58prog="$1" 59shift 60# Make any relative path in $prog absolute. 61case "$prog" in 62 [\\/]* | ?:[\\/]*) ;; 63 *[\\/]*) prog="`pwd`/$prog" ;; 64esac 65 66# FIXME: add hostname here for parallel makes that run commands on 67# other machines. But that might take us over the 14-char limit. 68dirname=ylwrap$$ 69trap "cd `pwd`; rm -rf $dirname > /dev/null 2>&1" 1 2 3 15 70mkdir $dirname || exit 1 71 72cd $dirname 73 74$prog ${1+"$@"} "$input" 75status=$? 76 77if test $status -eq 0; then 78 set X $pairlist 79 shift 80 first=yes 81 # Since DOS filename conventions don't allow two dots, 82 # the DOS version of Bison writes out y_tab.c instead of y.tab.c 83 # and y_tab.h instead of y.tab.h. Test to see if this is the case. 84 y_tab_nodot="no" 85 if test -f y_tab.c || test -f y_tab.h; then 86 y_tab_nodot="yes" 87 fi 88 89 # The directory holding the input. 90 input_dir=`echo "$input" | sed -e 's,\([\\/]\)[^\\/]*$,\1,'` 91 # Quote $INPUT_DIR so we can use it in a regexp. 92 # FIXME: really we should care about more than `.' and `\'. 93 input_rx=`echo "$input_dir" | sed 's,\\\\,\\\\\\\\,g;s,\\.,\\\\.,g'` 94 95 while test "$#" -ne 0; do 96 from="$1" 97 # Handle y_tab.c and y_tab.h output by DOS 98 if test $y_tab_nodot = "yes"; then 99 if test $from = "y.tab.c"; then 100 from="y_tab.c" 101 else 102 if test $from = "y.tab.h"; then 103 from="y_tab.h" 104 fi 105 fi 106 fi 107 if test -f "$from"; then 108 # If $2 is an absolute path name, then just use that, 109 # otherwise prepend `../'. 110 case "$2" in 111 [\\/]* | ?:[\\/]*) target="$2";; 112 *) target="../$2";; 113 esac 114 115 # Edit out `#line' or `#' directives. 116 # 117 # We don't want the resulting debug information to point at 118 # an absolute srcdir; it is better for it to just mention the 119 # .y file with no path. 120 # 121 # We want to use the real output file name, not yy.lex.c for 122 # instance. 123 # 124 # We want the include guards to be adjusted too. 125 FROM=`echo "$from" | sed \ 126 -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'\ 127 -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'` 128 TARGET=`echo "$2" | sed \ 129 -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'\ 130 -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'` 131 sed "/^#/{s,$input_rx,,;s,$from,$2,;s,$FORM,$TO,;}" "$from" >"$target" || 132 status=$? 133 else 134 # A missing file is only an error for the first file. This 135 # is a blatant hack to let us support using "yacc -d". If -d 136 # is not specified, we don't want an error when the header 137 # file is "missing". 138 if test $first = yes; then 139 status=1 140 fi 141 fi 142 shift 143 shift 144 first=no 145 done 146else 147 status=$? 148fi 149 150# Remove the directory. 151cd .. 152rm -rf $dirname 153 154exit $status 155