Blame build-aux/ylwrap

Packit 549fdc
#! /bin/sh
Packit 549fdc
# ylwrap - wrapper for lex/yacc invocations.
Packit 549fdc
Packit 549fdc
scriptversion=2013-01-12.17; # UTC
Packit 549fdc
Packit 549fdc
# Copyright (C) 1996-2014 Free Software Foundation, Inc.
Packit 549fdc
#
Packit 549fdc
# Written by Tom Tromey <tromey@cygnus.com>.
Packit 549fdc
#
Packit 549fdc
# This program is free software; you can redistribute it and/or modify
Packit 549fdc
# it under the terms of the GNU General Public License as published by
Packit 549fdc
# the Free Software Foundation; either version 2, or (at your option)
Packit 549fdc
# any later version.
Packit 549fdc
#
Packit 549fdc
# This program is distributed in the hope that it will be useful,
Packit 549fdc
# but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 549fdc
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit 549fdc
# GNU General Public License for more details.
Packit 549fdc
#
Packit 549fdc
# You should have received a copy of the GNU General Public License
Packit 549fdc
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
Packit 549fdc
Packit 549fdc
# As a special exception to the GNU General Public License, if you
Packit 549fdc
# distribute this file as part of a program that contains a
Packit 549fdc
# configuration script generated by Autoconf, you may include it under
Packit 549fdc
# the same distribution terms that you use for the rest of that program.
Packit 549fdc
Packit 549fdc
# This file is maintained in Automake, please report
Packit 549fdc
# bugs to <bug-automake@gnu.org> or send patches to
Packit 549fdc
# <automake-patches@gnu.org>.
Packit 549fdc
Packit 549fdc
get_dirname ()
Packit 549fdc
{
Packit 549fdc
  case $1 in
Packit 549fdc
    */*|*\\*) printf '%s\n' "$1" | sed -e 's|\([\\/]\)[^\\/]*$|\1|';;
Packit 549fdc
    # Otherwise,  we want the empty string (not ".").
Packit 549fdc
  esac
Packit 549fdc
}
Packit 549fdc
Packit 549fdc
# guard FILE
Packit 549fdc
# ----------
Packit 549fdc
# The CPP macro used to guard inclusion of FILE.
Packit 549fdc
guard ()
Packit 549fdc
{
Packit 549fdc
  printf '%s\n' "$1"                                                    \
Packit 549fdc
    | sed                                                               \
Packit 549fdc
        -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'   \
Packit 549fdc
        -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'                        \
Packit 549fdc
        -e 's/__*/_/g'
Packit 549fdc
}
Packit 549fdc
Packit 549fdc
# quote_for_sed [STRING]
Packit 549fdc
# ----------------------
Packit 549fdc
# Return STRING (or stdin) quoted to be used as a sed pattern.
Packit 549fdc
quote_for_sed ()
Packit 549fdc
{
Packit 549fdc
  case $# in
Packit 549fdc
    0) cat;;
Packit 549fdc
    1) printf '%s\n' "$1";;
Packit 549fdc
  esac \
Packit 549fdc
    | sed -e 's|[][\\.*]|\\&|g'
Packit 549fdc
}
Packit 549fdc
Packit 549fdc
case "$1" in
Packit 549fdc
  '')
Packit 549fdc
    echo "$0: No files given.  Try '$0 --help' for more information." 1>&2
Packit 549fdc
    exit 1
Packit 549fdc
    ;;
Packit 549fdc
  --basedir)
Packit 549fdc
    basedir=$2
Packit 549fdc
    shift 2
Packit 549fdc
    ;;
Packit 549fdc
  -h|--h*)
Packit 549fdc
    cat <<\EOF
Packit 549fdc
Usage: ylwrap [--help|--version] INPUT [OUTPUT DESIRED]... -- PROGRAM [ARGS]...
Packit 549fdc
Packit 549fdc
Wrapper for lex/yacc invocations, renaming files as desired.
Packit 549fdc
Packit 549fdc
  INPUT is the input file
Packit 549fdc
  OUTPUT is one file PROG generates
Packit 549fdc
  DESIRED is the file we actually want instead of OUTPUT
Packit 549fdc
  PROGRAM is program to run
Packit 549fdc
  ARGS are passed to PROG
Packit 549fdc
Packit 549fdc
Any number of OUTPUT,DESIRED pairs may be used.
Packit 549fdc
Packit 549fdc
Report bugs to <bug-automake@gnu.org>.
Packit 549fdc
EOF
Packit 549fdc
    exit $?
Packit 549fdc
    ;;
Packit 549fdc
  -v|--v*)
Packit 549fdc
    echo "ylwrap $scriptversion"
Packit 549fdc
    exit $?
Packit 549fdc
    ;;
Packit 549fdc
esac
Packit 549fdc
Packit 549fdc
Packit 549fdc
# The input.
Packit 549fdc
input=$1
Packit 549fdc
shift
Packit 549fdc
# We'll later need for a correct munging of "#line" directives.
Packit 549fdc
input_sub_rx=`get_dirname "$input" | quote_for_sed`
Packit 549fdc
case $input in
Packit 549fdc
  [\\/]* | ?:[\\/]*)
Packit 549fdc
    # Absolute path; do nothing.
Packit 549fdc
    ;;
Packit 549fdc
  *)
Packit 549fdc
    # Relative path.  Make it absolute.
Packit 549fdc
    input=`pwd`/$input
Packit 549fdc
    ;;
Packit 549fdc
esac
Packit 549fdc
input_rx=`get_dirname "$input" | quote_for_sed`
Packit 549fdc
Packit 549fdc
# Since DOS filename conventions don't allow two dots,
Packit 549fdc
# the DOS version of Bison writes out y_tab.c instead of y.tab.c
Packit 549fdc
# and y_tab.h instead of y.tab.h. Test to see if this is the case.
Packit 549fdc
y_tab_nodot=false
Packit 549fdc
if test -f y_tab.c || test -f y_tab.h; then
Packit 549fdc
  y_tab_nodot=true
Packit 549fdc
fi
Packit 549fdc
Packit 549fdc
# The parser itself, the first file, is the destination of the .y.c
Packit 549fdc
# rule in the Makefile.
Packit 549fdc
parser=$1
Packit 549fdc
Packit 549fdc
# A sed program to s/FROM/TO/g for all the FROM/TO so that, for
Packit 549fdc
# instance, we rename #include "y.tab.h" into #include "parse.h"
Packit 549fdc
# during the conversion from y.tab.c to parse.c.
Packit 549fdc
sed_fix_filenames=
Packit 549fdc
Packit 549fdc
# Also rename header guards, as Bison 2.7 for instance uses its header
Packit 549fdc
# guard in its implementation file.
Packit 549fdc
sed_fix_header_guards=
Packit 549fdc
Packit 549fdc
while test $# -ne 0; do
Packit 549fdc
  if test x"$1" = x"--"; then
Packit 549fdc
    shift
Packit 549fdc
    break
Packit 549fdc
  fi
Packit 549fdc
  from=$1
Packit 549fdc
  # Handle y_tab.c and y_tab.h output by DOS
Packit 549fdc
  if $y_tab_nodot; then
Packit 549fdc
    case $from in
Packit 549fdc
      "y.tab.c") from=y_tab.c;;
Packit 549fdc
      "y.tab.h") from=y_tab.h;;
Packit 549fdc
    esac
Packit 549fdc
  fi
Packit 549fdc
  shift
Packit 549fdc
  to=$1
Packit 549fdc
  shift
Packit 549fdc
  sed_fix_filenames="${sed_fix_filenames}s|"`quote_for_sed "$from"`"|$to|g;"
Packit 549fdc
  sed_fix_header_guards="${sed_fix_header_guards}s|"`guard "$from"`"|"`guard "$to"`"|g;"
Packit 549fdc
done
Packit 549fdc
Packit 549fdc
# The program to run.
Packit 549fdc
prog=$1
Packit 549fdc
shift
Packit 549fdc
# Make any relative path in $prog absolute.
Packit 549fdc
case $prog in
Packit 549fdc
  [\\/]* | ?:[\\/]*) ;;
Packit 549fdc
  *[\\/]*) prog=`pwd`/$prog ;;
Packit 549fdc
esac
Packit 549fdc
Packit 549fdc
dirname=ylwrap$$
Packit 549fdc
do_exit="cd '`pwd`' && rm -rf $dirname > /dev/null 2>&1;"' (exit $ret); exit $ret'
Packit 549fdc
trap "ret=129; $do_exit" 1
Packit 549fdc
trap "ret=130; $do_exit" 2
Packit 549fdc
trap "ret=141; $do_exit" 13
Packit 549fdc
trap "ret=143; $do_exit" 15
Packit 549fdc
mkdir $dirname || exit 1
Packit 549fdc
Packit 549fdc
cd $dirname
Packit 549fdc
Packit 549fdc
case $# in
Packit 549fdc
  0) "$prog" "$input" ;;
Packit 549fdc
  *) "$prog" "$@" "$input" ;;
Packit 549fdc
esac
Packit 549fdc
ret=$?
Packit 549fdc
Packit 549fdc
if test $ret -eq 0; then
Packit 549fdc
  for from in *
Packit 549fdc
  do
Packit 549fdc
    to=`printf '%s\n' "$from" | sed "$sed_fix_filenames"`
Packit 549fdc
    if test -f "$from"; then
Packit 549fdc
      # If $2 is an absolute path name, then just use that,
Packit 549fdc
      # otherwise prepend '../'.
Packit 549fdc
      case $to in
Packit 549fdc
        [\\/]* | ?:[\\/]*) target=$to;;
Packit 549fdc
        *) target=../$to;;
Packit 549fdc
      esac
Packit 549fdc
Packit 549fdc
      # Do not overwrite unchanged header files to avoid useless
Packit 549fdc
      # recompilations.  Always update the parser itself: it is the
Packit 549fdc
      # destination of the .y.c rule in the Makefile.  Divert the
Packit 549fdc
      # output of all other files to a temporary file so we can
Packit 549fdc
      # compare them to existing versions.
Packit 549fdc
      if test $from != $parser; then
Packit 549fdc
        realtarget=$target
Packit 549fdc
        target=tmp-`printf '%s\n' "$target" | sed 's|.*[\\/]||g'`
Packit 549fdc
      fi
Packit 549fdc
Packit 549fdc
      # Munge "#line" or "#" directives.  Don't let the resulting
Packit 549fdc
      # debug information point at an absolute srcdir.  Use the real
Packit 549fdc
      # output file name, not yy.lex.c for instance.  Adjust the
Packit 549fdc
      # include guards too.
Packit 549fdc
      sed -e "/^#/!b"                           \
Packit 549fdc
          -e "s|$input_rx|$input_sub_rx|"       \
Packit 549fdc
          -e "$sed_fix_filenames"               \
Packit 549fdc
          -e "$sed_fix_header_guards"           \
Packit 549fdc
        "$from" >"$target" || ret=$?
Packit 549fdc
Packit 549fdc
      # Check whether files must be updated.
Packit 549fdc
      if test "$from" != "$parser"; then
Packit 549fdc
        if test -f "$realtarget" && cmp -s "$realtarget" "$target"; then
Packit 549fdc
          echo "$to is unchanged"
Packit 549fdc
          rm -f "$target"
Packit 549fdc
        else
Packit 549fdc
          echo "updating $to"
Packit 549fdc
          mv -f "$target" "$realtarget"
Packit 549fdc
        fi
Packit 549fdc
      fi
Packit 549fdc
    else
Packit 549fdc
      # A missing file is only an error for the parser.  This is a
Packit 549fdc
      # blatant hack to let us support using "yacc -d".  If -d is not
Packit 549fdc
      # specified, don't fail when the header file is "missing".
Packit 549fdc
      if test "$from" = "$parser"; then
Packit 549fdc
        ret=1
Packit 549fdc
      fi
Packit 549fdc
    fi
Packit 549fdc
  done
Packit 549fdc
fi
Packit 549fdc
Packit 549fdc
# Remove the directory.
Packit 549fdc
cd ..
Packit 549fdc
rm -rf $dirname
Packit 549fdc
Packit 549fdc
exit $ret
Packit 549fdc
Packit 549fdc
# Local Variables:
Packit 549fdc
# mode: shell-script
Packit 549fdc
# sh-indentation: 2
Packit 549fdc
# eval: (add-hook 'write-file-hooks 'time-stamp)
Packit 549fdc
# time-stamp-start: "scriptversion="
Packit 549fdc
# time-stamp-format: "%:y-%02m-%02d.%02H"
Packit 549fdc
# time-stamp-time-zone: "UTC"
Packit 549fdc
# time-stamp-end: "; # UTC"
Packit 549fdc
# End: