Blame ylwrap

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