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 (at] 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. 35 input="$1" 36 shift 37 case "$input" in 38 [\\/]* | ?:[\\/]*) 39 # Absolute path; do nothing. 40 ;; 41 *) 42 # Relative path. Make it absolute. 43 input="`pwd`/$input" 44 ;; 45 esac 46 47 # The directory holding the input. 48 input_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 `\'. 51 input_rx=`echo "$input_dir" | sed -e 's,\\\\,\\\\\\\\,g' -e 's,\\.,\\\\.,g'` 52 53 echo "got $input_rx" 54 55 pairlist= 56 while test "$#" -ne 0; do 57 if test "$1" = "--"; then 58 shift 59 break 60 fi 61 pairlist="$pairlist $1" 62 shift 63 done 64 65 # The program to run. 66 prog="$1" 67 shift 68 # Make any relative path in $prog absolute. 69 case "$prog" in 70 [\\/]* | ?:[\\/]*) ;; 71 *[\\/]*) prog="`pwd`/$prog" ;; 72 esac 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. 76 dirname=ylwrap$$ 77 trap "cd `pwd`; rm -rf $dirname > /dev/null 2>&1" 1 2 3 15 78 mkdir $dirname || exit 1 79 80 cd $dirname 81 82 $prog ${1+"$@"} "$input" 83 status=$? 84 85 if 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 135 else 136 status=$? 137 fi 138 139 # Remove the directory. 140 cd .. 141 rm -rf $dirname 142 143 exit $status 144