Blame build-aux/ylwrap

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