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