Blame ylwrap

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