Blame ylwrap

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