Blame ylwrap

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