Blame ylwrap

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