Blame ylwrap

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