Blame ylwrap

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