Blame build-aux/ylwrap

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