ylwrap revision 7a2631fc
13e747e6dSmrg#! /bin/sh
23e747e6dSmrg# ylwrap - wrapper for lex/yacc invocations.
33e747e6dSmrg
47a2631fcSmrgscriptversion=2009-04-28.21; # UTC
53e747e6dSmrg
63e747e6dSmrg# Copyright (C) 1996, 1997, 1998, 1999, 2001, 2002, 2003, 2004, 2005,
77a2631fcSmrg# 2007, 2009 Free Software Foundation, Inc.
83e747e6dSmrg#
93e747e6dSmrg# Written by Tom Tromey <tromey@cygnus.com>.
103e747e6dSmrg#
113e747e6dSmrg# This program is free software; you can redistribute it and/or modify
123e747e6dSmrg# it under the terms of the GNU General Public License as published by
133e747e6dSmrg# the Free Software Foundation; either version 2, or (at your option)
143e747e6dSmrg# any later version.
153e747e6dSmrg#
163e747e6dSmrg# This program is distributed in the hope that it will be useful,
173e747e6dSmrg# but WITHOUT ANY WARRANTY; without even the implied warranty of
183e747e6dSmrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
193e747e6dSmrg# GNU General Public License for more details.
203e747e6dSmrg#
213e747e6dSmrg# You should have received a copy of the GNU General Public License
227a2631fcSmrg# along with this program.  If not, see <http://www.gnu.org/licenses/>.
233e747e6dSmrg
243e747e6dSmrg# As a special exception to the GNU General Public License, if you
253e747e6dSmrg# distribute this file as part of a program that contains a
263e747e6dSmrg# configuration script generated by Autoconf, you may include it under
273e747e6dSmrg# the same distribution terms that you use for the rest of that program.
283e747e6dSmrg
293e747e6dSmrg# This file is maintained in Automake, please report
303e747e6dSmrg# bugs to <bug-automake@gnu.org> or send patches to
313e747e6dSmrg# <automake-patches@gnu.org>.
323e747e6dSmrg
333e747e6dSmrgcase "$1" in
343e747e6dSmrg  '')
353e747e6dSmrg    echo "$0: No files given.  Try \`$0 --help' for more information." 1>&2
363e747e6dSmrg    exit 1
373e747e6dSmrg    ;;
383e747e6dSmrg  --basedir)
393e747e6dSmrg    basedir=$2
403e747e6dSmrg    shift 2
413e747e6dSmrg    ;;
423e747e6dSmrg  -h|--h*)
433e747e6dSmrg    cat <<\EOF
443e747e6dSmrgUsage: ylwrap [--help|--version] INPUT [OUTPUT DESIRED]... -- PROGRAM [ARGS]...
453e747e6dSmrg
463e747e6dSmrgWrapper for lex/yacc invocations, renaming files as desired.
473e747e6dSmrg
483e747e6dSmrg  INPUT is the input file
493e747e6dSmrg  OUTPUT is one file PROG generates
503e747e6dSmrg  DESIRED is the file we actually want instead of OUTPUT
513e747e6dSmrg  PROGRAM is program to run
523e747e6dSmrg  ARGS are passed to PROG
533e747e6dSmrg
543e747e6dSmrgAny number of OUTPUT,DESIRED pairs may be used.
553e747e6dSmrg
563e747e6dSmrgReport bugs to <bug-automake@gnu.org>.
573e747e6dSmrgEOF
583e747e6dSmrg    exit $?
593e747e6dSmrg    ;;
603e747e6dSmrg  -v|--v*)
613e747e6dSmrg    echo "ylwrap $scriptversion"
623e747e6dSmrg    exit $?
633e747e6dSmrg    ;;
643e747e6dSmrgesac
653e747e6dSmrg
663e747e6dSmrg
673e747e6dSmrg# The input.
683e747e6dSmrginput="$1"
693e747e6dSmrgshift
703e747e6dSmrgcase "$input" in
713e747e6dSmrg  [\\/]* | ?:[\\/]*)
723e747e6dSmrg    # Absolute path; do nothing.
733e747e6dSmrg    ;;
743e747e6dSmrg  *)
753e747e6dSmrg    # Relative path.  Make it absolute.
763e747e6dSmrg    input="`pwd`/$input"
773e747e6dSmrg    ;;
783e747e6dSmrgesac
793e747e6dSmrg
803e747e6dSmrgpairlist=
813e747e6dSmrgwhile test "$#" -ne 0; do
823e747e6dSmrg  if test "$1" = "--"; then
833e747e6dSmrg    shift
843e747e6dSmrg    break
853e747e6dSmrg  fi
863e747e6dSmrg  pairlist="$pairlist $1"
873e747e6dSmrg  shift
883e747e6dSmrgdone
893e747e6dSmrg
903e747e6dSmrg# The program to run.
913e747e6dSmrgprog="$1"
923e747e6dSmrgshift
933e747e6dSmrg# Make any relative path in $prog absolute.
943e747e6dSmrgcase "$prog" in
953e747e6dSmrg  [\\/]* | ?:[\\/]*) ;;
963e747e6dSmrg  *[\\/]*) prog="`pwd`/$prog" ;;
973e747e6dSmrgesac
983e747e6dSmrg
993e747e6dSmrg# FIXME: add hostname here for parallel makes that run commands on
1003e747e6dSmrg# other machines.  But that might take us over the 14-char limit.
1013e747e6dSmrgdirname=ylwrap$$
1023e747e6dSmrgtrap "cd '`pwd`'; rm -rf $dirname > /dev/null 2>&1" 1 2 3 15
1033e747e6dSmrgmkdir $dirname || exit 1
1043e747e6dSmrg
1053e747e6dSmrgcd $dirname
1063e747e6dSmrg
1073e747e6dSmrgcase $# in
1083e747e6dSmrg  0) "$prog" "$input" ;;
1093e747e6dSmrg  *) "$prog" "$@" "$input" ;;
1103e747e6dSmrgesac
1113e747e6dSmrgret=$?
1123e747e6dSmrg
1133e747e6dSmrgif test $ret -eq 0; then
1143e747e6dSmrg  set X $pairlist
1153e747e6dSmrg  shift
1163e747e6dSmrg  first=yes
1173e747e6dSmrg  # Since DOS filename conventions don't allow two dots,
1183e747e6dSmrg  # the DOS version of Bison writes out y_tab.c instead of y.tab.c
1193e747e6dSmrg  # and y_tab.h instead of y.tab.h. Test to see if this is the case.
1203e747e6dSmrg  y_tab_nodot="no"
1213e747e6dSmrg  if test -f y_tab.c || test -f y_tab.h; then
1223e747e6dSmrg    y_tab_nodot="yes"
1233e747e6dSmrg  fi
1243e747e6dSmrg
1253e747e6dSmrg  # The directory holding the input.
1263e747e6dSmrg  input_dir=`echo "$input" | sed -e 's,\([\\/]\)[^\\/]*$,\1,'`
1273e747e6dSmrg  # Quote $INPUT_DIR so we can use it in a regexp.
1283e747e6dSmrg  # FIXME: really we should care about more than `.' and `\'.
1293e747e6dSmrg  input_rx=`echo "$input_dir" | sed 's,\\\\,\\\\\\\\,g;s,\\.,\\\\.,g'`
1303e747e6dSmrg
1313e747e6dSmrg  while test "$#" -ne 0; do
1323e747e6dSmrg    from="$1"
1333e747e6dSmrg    # Handle y_tab.c and y_tab.h output by DOS
1343e747e6dSmrg    if test $y_tab_nodot = "yes"; then
1353e747e6dSmrg      if test $from = "y.tab.c"; then
1363e747e6dSmrg    	from="y_tab.c"
1373e747e6dSmrg      else
1383e747e6dSmrg    	if test $from = "y.tab.h"; then
1393e747e6dSmrg    	  from="y_tab.h"
1403e747e6dSmrg    	fi
1413e747e6dSmrg      fi
1423e747e6dSmrg    fi
1433e747e6dSmrg    if test -f "$from"; then
1443e747e6dSmrg      # If $2 is an absolute path name, then just use that,
1453e747e6dSmrg      # otherwise prepend `../'.
1463e747e6dSmrg      case "$2" in
1473e747e6dSmrg    	[\\/]* | ?:[\\/]*) target="$2";;
1483e747e6dSmrg    	*) target="../$2";;
1493e747e6dSmrg      esac
1503e747e6dSmrg
1513e747e6dSmrg      # We do not want to overwrite a header file if it hasn't
1523e747e6dSmrg      # changed.  This avoid useless recompilations.  However the
1533e747e6dSmrg      # parser itself (the first file) should always be updated,
1543e747e6dSmrg      # because it is the destination of the .y.c rule in the
1553e747e6dSmrg      # Makefile.  Divert the output of all other files to a temporary
1563e747e6dSmrg      # file so we can compare them to existing versions.
1573e747e6dSmrg      if test $first = no; then
1583e747e6dSmrg	realtarget="$target"
1593e747e6dSmrg	target="tmp-`echo $target | sed s/.*[\\/]//g`"
1603e747e6dSmrg      fi
1613e747e6dSmrg      # Edit out `#line' or `#' directives.
1623e747e6dSmrg      #
1633e747e6dSmrg      # We don't want the resulting debug information to point at
1643e747e6dSmrg      # an absolute srcdir; it is better for it to just mention the
1653e747e6dSmrg      # .y file with no path.
1663e747e6dSmrg      #
1673e747e6dSmrg      # We want to use the real output file name, not yy.lex.c for
1683e747e6dSmrg      # instance.
1693e747e6dSmrg      #
1703e747e6dSmrg      # We want the include guards to be adjusted too.
1713e747e6dSmrg      FROM=`echo "$from" | sed \
1723e747e6dSmrg            -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'\
1733e747e6dSmrg            -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'`
1743e747e6dSmrg      TARGET=`echo "$2" | sed \
1753e747e6dSmrg            -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'\
1763e747e6dSmrg            -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'`
1773e747e6dSmrg
1783e747e6dSmrg      sed -e "/^#/!b" -e "s,$input_rx,," -e "s,$from,$2," \
1793e747e6dSmrg          -e "s,$FROM,$TARGET," "$from" >"$target" || ret=$?
1803e747e6dSmrg
1813e747e6dSmrg      # Check whether header files must be updated.
1823e747e6dSmrg      if test $first = no; then
1833e747e6dSmrg	if test -f "$realtarget" && cmp -s "$realtarget" "$target"; then
1843e747e6dSmrg	  echo "$2" is unchanged
1853e747e6dSmrg	  rm -f "$target"
1863e747e6dSmrg	else
1873e747e6dSmrg          echo updating "$2"
1883e747e6dSmrg          mv -f "$target" "$realtarget"
1893e747e6dSmrg        fi
1903e747e6dSmrg      fi
1913e747e6dSmrg    else
1923e747e6dSmrg      # A missing file is only an error for the first file.  This
1933e747e6dSmrg      # is a blatant hack to let us support using "yacc -d".  If -d
1943e747e6dSmrg      # is not specified, we don't want an error when the header
1953e747e6dSmrg      # file is "missing".
1963e747e6dSmrg      if test $first = yes; then
1973e747e6dSmrg        ret=1
1983e747e6dSmrg      fi
1993e747e6dSmrg    fi
2003e747e6dSmrg    shift
2013e747e6dSmrg    shift
2023e747e6dSmrg    first=no
2033e747e6dSmrg  done
2043e747e6dSmrgelse
2053e747e6dSmrg  ret=$?
2063e747e6dSmrgfi
2073e747e6dSmrg
2083e747e6dSmrg# Remove the directory.
2093e747e6dSmrgcd ..
2103e747e6dSmrgrm -rf $dirname
2113e747e6dSmrg
2123e747e6dSmrgexit $ret
2133e747e6dSmrg
2143e747e6dSmrg# Local Variables:
2153e747e6dSmrg# mode: shell-script
2163e747e6dSmrg# sh-indentation: 2
2173e747e6dSmrg# eval: (add-hook 'write-file-hooks 'time-stamp)
2183e747e6dSmrg# time-stamp-start: "scriptversion="
2193e747e6dSmrg# time-stamp-format: "%:y-%02m-%02d.%02H"
2207a2631fcSmrg# time-stamp-time-zone: "UTC"
2217a2631fcSmrg# time-stamp-end: "; # UTC"
2223e747e6dSmrg# End:
223