Blame ylwrap

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