Blame config/ylwrap

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