Blame build-aux/ylwrap

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