Blame config/ylwrap

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