diff options
-rwxr-xr-x | scripts/ylwrap | 170 |
1 files changed, 170 insertions, 0 deletions
diff --git a/scripts/ylwrap b/scripts/ylwrap new file mode 100755 index 000000000..ff26af9f5 --- /dev/null +++ b/scripts/ylwrap @@ -0,0 +1,170 @@ +#! /bin/sh +# ylwrap - wrapper for lex/yacc invocations. +# Copyright 1996, 1997, 1998, 1999 Free Software Foundation, Inc. +# Written by Tom Tromey <tromey@cygnus.com>. +# -yy modification by Sergey Poznyakoff <gray@farlep.net> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Usage: +# ylwrap PROGRAM [ARGS] INPUT [OUTPUT DESIRED]... -- [-yy repl] [ARGS]... +# * PROGRAM is program to run; options can follow but must start with `-'. +# * INPUT is the input file +# * OUTPUT is file PROG generates +# * DESIRED is file we actually want +# * ARGS are passed to PROG +# * Optional -yy introduces the sequence to replace yy prefixes with. +# Any number of OUTPUT,DESIRED pairs may be used. + +# The program to run. +prog="$1" +shift +# Make any relative path in $prog absolute. +case "$prog" in + /* | [A-Za-z]:*) ;; + */*) prog="`pwd`/$prog" ;; +esac + +# We also have to accept options here and append them to the program. +# Why? Suppose YACC is set to `bison -y'. Clearly nobody uses +# ylwrap, or this would have been discovered earlier! +while :; do + case "$1" in + -*) + prog="$prog $1" + shift + ;; + *) + break + ;; + esac +done + +# The input. +input="$1" +shift +case "$input" in + /* | [A-Za-z]:*) + # Absolute path; do nothing. + ;; + *) + # Relative path. Make it absolute. + input="`pwd`/$input" + ;; +esac + +# The directory holding the input. +input_dir="`echo $input | sed -e 's,/[^/]*$,,'`" +# Quote $INPUT_DIR so we can use it in a regexp. +# FIXME: really we should care about more than `.'. +input_rx="`echo $input_dir | sed -e 's,\.,\\\.,g'`" + +pairlist= +while test "$#" -ne 0; do + if test "$1" = "--"; then + shift + break + fi + pairlist="$pairlist $1" + shift +done + +if [ $# -ne 0 ]; then + if [ "x$1" = "x-yy" ]; then + shift + if [ $# -eq 0 ]; then + echo "ylwrap: -yy requires an argument" + exit 1 + fi + YYREPL=$1 + shift + fi +fi + +# FIXME: add hostname here for parallel makes that run commands on +# other machines. But that might take us over the 14-char limit. +dirname=ylwrap$$ +trap "cd `pwd`; rm -rf $dirname > /dev/null 2>&1" 1 2 3 15 +mkdir $dirname || exit 1 + +cd $dirname + +$prog ${1+"$@"} "$input" +status=$? + +if test $status -eq 0; then + set X $pairlist + shift + first=yes + # Since DOS filename conventions don't allow two dots, + # the DOS version of Bison writes out y_tab.c instead of y.tab.c + # and y_tab.h instead of y.tab.h. Test to see if this is the case. + y_tab_nodot="no" + if test -f y_tab.c || test -f y_tab.h; then + y_tab_nodot="yes" + fi + + while test "$#" -ne 0; do + from="$1" + # Handle y_tab.c and y_tab.h output by DOS + if test $y_tab_nodot = "yes"; then + if test $from = "y.tab.c"; then + from="y_tab.c" + else + if test $from = "y.tab.h"; then + from="y_tab.h" + fi + fi + fi + if test -f "$from"; then + # If $2 is an absolute path name, then just use that, + # otherwise prepend `../'. + case "$2" in + /* | [A-Za-z]:*) target="$2";; + *) target="../$2";; + esac + + # Edit out `#line' or `#' directives. We don't want the + # resulting debug information to point at an absolute srcdir; + # it is better for it to just mention the .y file with no + # path. + EXPR="/^#/ s,$input_rx/,," + if [ ! -z "$YYREPL" ]; then + EXPR="$EXPR;s/yy/$YYREPL/g" + fi + sed -e "$EXPR" "$from" > "$target" || status=$? + else + # A missing file is only an error for the first file. This + # is a blatant hack to let us support using "yacc -d". If -d + # is not specified, we don't want an error when the header + # file is "missing". + if test $first = yes; then + status=1 + fi + fi + shift + shift + first=no + done +else + status=$? +fi + +# Remove the directory. +cd .. +rm -rf $dirname + +exit $status + |