Blame ylwrap

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