Home | History | Annotate | Download | only in src
      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 (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., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, 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 pairlist=
     48 while test "$#" -ne 0; do
     49    if test "$1" = "--"; then
     50       shift
     51       break
     52    fi
     53    pairlist="$pairlist $1"
     54    shift
     55 done
     56 
     57 # The program to run.
     58 prog="$1"
     59 shift
     60 # Make any relative path in $prog absolute.
     61 case "$prog" in
     62  [\\/]* | ?:[\\/]*) ;;
     63  *[\\/]*) prog="`pwd`/$prog" ;;
     64 esac
     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.
     68 dirname=ylwrap$$
     69 trap "cd `pwd`; rm -rf $dirname > /dev/null 2>&1" 1 2 3 15
     70 mkdir $dirname || exit 1
     71 
     72 cd $dirname
     73 
     74 $prog ${1+"$@"} "$input"
     75 status=$?
     76 
     77 if 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
    146 else
    147    status=$?
    148 fi
    149 
    150 # Remove the directory.
    151 cd ..
    152 rm -rf $dirname
    153 
    154 exit $status
    155