xref: /netbsd-src/external/gpl3/gcc/dist/ylwrap (revision 4d5abbe83f525258eb479e5fca29f25cb943f379)
14fee23f9Smrg#! /bin/sh
24fee23f9Smrg# ylwrap - wrapper for lex/yacc invocations.
34fee23f9Smrg
4*4d5abbe8Smrgscriptversion=2013-01-12.17; # UTC
54fee23f9Smrg
6*4d5abbe8Smrg# Copyright (C) 1996-2014 Free Software Foundation, Inc.
74fee23f9Smrg#
84fee23f9Smrg# Written by Tom Tromey <tromey@cygnus.com>.
94fee23f9Smrg#
104fee23f9Smrg# This program is free software; you can redistribute it and/or modify
114fee23f9Smrg# it under the terms of the GNU General Public License as published by
124fee23f9Smrg# the Free Software Foundation; either version 2, or (at your option)
134fee23f9Smrg# any later version.
144fee23f9Smrg#
154fee23f9Smrg# This program is distributed in the hope that it will be useful,
164fee23f9Smrg# but WITHOUT ANY WARRANTY; without even the implied warranty of
174fee23f9Smrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
184fee23f9Smrg# GNU General Public License for more details.
194fee23f9Smrg#
204fee23f9Smrg# You should have received a copy of the GNU General Public License
214fee23f9Smrg# along with this program.  If not, see <http://www.gnu.org/licenses/>.
224fee23f9Smrg
234fee23f9Smrg# As a special exception to the GNU General Public License, if you
244fee23f9Smrg# distribute this file as part of a program that contains a
254fee23f9Smrg# configuration script generated by Autoconf, you may include it under
264fee23f9Smrg# the same distribution terms that you use for the rest of that program.
274fee23f9Smrg
284fee23f9Smrg# This file is maintained in Automake, please report
294fee23f9Smrg# bugs to <bug-automake@gnu.org> or send patches to
304fee23f9Smrg# <automake-patches@gnu.org>.
314fee23f9Smrg
32*4d5abbe8Smrgget_dirname ()
33*4d5abbe8Smrg{
34*4d5abbe8Smrg  case $1 in
35*4d5abbe8Smrg    */*|*\\*) printf '%s\n' "$1" | sed -e 's|\([\\/]\)[^\\/]*$|\1|';;
36*4d5abbe8Smrg    # Otherwise,  we want the empty string (not ".").
37*4d5abbe8Smrg  esac
38*4d5abbe8Smrg}
39*4d5abbe8Smrg
40*4d5abbe8Smrg# guard FILE
41*4d5abbe8Smrg# ----------
42*4d5abbe8Smrg# The CPP macro used to guard inclusion of FILE.
43*4d5abbe8Smrgguard ()
44*4d5abbe8Smrg{
45*4d5abbe8Smrg  printf '%s\n' "$1"                                                    \
46*4d5abbe8Smrg    | sed                                                               \
47*4d5abbe8Smrg        -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'   \
48*4d5abbe8Smrg        -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'                        \
49*4d5abbe8Smrg        -e 's/__*/_/g'
50*4d5abbe8Smrg}
51*4d5abbe8Smrg
52*4d5abbe8Smrg# quote_for_sed [STRING]
53*4d5abbe8Smrg# ----------------------
54*4d5abbe8Smrg# Return STRING (or stdin) quoted to be used as a sed pattern.
55*4d5abbe8Smrgquote_for_sed ()
56*4d5abbe8Smrg{
57*4d5abbe8Smrg  case $# in
58*4d5abbe8Smrg    0) cat;;
59*4d5abbe8Smrg    1) printf '%s\n' "$1";;
60*4d5abbe8Smrg  esac \
61*4d5abbe8Smrg    | sed -e 's|[][\\.*]|\\&|g'
62*4d5abbe8Smrg}
63*4d5abbe8Smrg
644fee23f9Smrgcase "$1" in
654fee23f9Smrg  '')
66*4d5abbe8Smrg    echo "$0: No files given.  Try '$0 --help' for more information." 1>&2
674fee23f9Smrg    exit 1
684fee23f9Smrg    ;;
694fee23f9Smrg  --basedir)
704fee23f9Smrg    basedir=$2
714fee23f9Smrg    shift 2
724fee23f9Smrg    ;;
734fee23f9Smrg  -h|--h*)
744fee23f9Smrg    cat <<\EOF
754fee23f9SmrgUsage: ylwrap [--help|--version] INPUT [OUTPUT DESIRED]... -- PROGRAM [ARGS]...
764fee23f9Smrg
774fee23f9SmrgWrapper for lex/yacc invocations, renaming files as desired.
784fee23f9Smrg
794fee23f9Smrg  INPUT is the input file
804fee23f9Smrg  OUTPUT is one file PROG generates
814fee23f9Smrg  DESIRED is the file we actually want instead of OUTPUT
824fee23f9Smrg  PROGRAM is program to run
834fee23f9Smrg  ARGS are passed to PROG
844fee23f9Smrg
854fee23f9SmrgAny number of OUTPUT,DESIRED pairs may be used.
864fee23f9Smrg
874fee23f9SmrgReport bugs to <bug-automake@gnu.org>.
884fee23f9SmrgEOF
894fee23f9Smrg    exit $?
904fee23f9Smrg    ;;
914fee23f9Smrg  -v|--v*)
924fee23f9Smrg    echo "ylwrap $scriptversion"
934fee23f9Smrg    exit $?
944fee23f9Smrg    ;;
954fee23f9Smrgesac
964fee23f9Smrg
974fee23f9Smrg
984fee23f9Smrg# The input.
99*4d5abbe8Smrginput=$1
1004fee23f9Smrgshift
101*4d5abbe8Smrg# We'll later need for a correct munging of "#line" directives.
102*4d5abbe8Smrginput_sub_rx=`get_dirname "$input" | quote_for_sed`
103*4d5abbe8Smrgcase $input in
1044fee23f9Smrg  [\\/]* | ?:[\\/]*)
1054fee23f9Smrg    # Absolute path; do nothing.
1064fee23f9Smrg    ;;
1074fee23f9Smrg  *)
1084fee23f9Smrg    # Relative path.  Make it absolute.
109*4d5abbe8Smrg    input=`pwd`/$input
1104fee23f9Smrg    ;;
1114fee23f9Smrgesac
112*4d5abbe8Smrginput_rx=`get_dirname "$input" | quote_for_sed`
1134fee23f9Smrg
114*4d5abbe8Smrg# The parser itself, the first file, is the destination of the .y.c
115*4d5abbe8Smrg# rule in the Makefile.
116*4d5abbe8Smrgparser=$1
117*4d5abbe8Smrg
118*4d5abbe8Smrg# A sed program to s/FROM/TO/g for all the FROM/TO so that, for
119*4d5abbe8Smrg# instance, we rename #include "y.tab.h" into #include "parse.h"
120*4d5abbe8Smrg# during the conversion from y.tab.c to parse.c.
121*4d5abbe8Smrgsed_fix_filenames=
122*4d5abbe8Smrg
123*4d5abbe8Smrg# Also rename header guards, as Bison 2.7 for instance uses its header
124*4d5abbe8Smrg# guard in its implementation file.
125*4d5abbe8Smrgsed_fix_header_guards=
126*4d5abbe8Smrg
127*4d5abbe8Smrgwhile test $# -ne 0; do
128*4d5abbe8Smrg  if test x"$1" = x"--"; then
1294fee23f9Smrg    shift
1304fee23f9Smrg    break
1314fee23f9Smrg  fi
132*4d5abbe8Smrg  from=$1
1334fee23f9Smrg  shift
134*4d5abbe8Smrg  to=$1
135*4d5abbe8Smrg  shift
136*4d5abbe8Smrg  sed_fix_filenames="${sed_fix_filenames}s|"`quote_for_sed "$from"`"|$to|g;"
137*4d5abbe8Smrg  sed_fix_header_guards="${sed_fix_header_guards}s|"`guard "$from"`"|"`guard "$to"`"|g;"
1384fee23f9Smrgdone
1394fee23f9Smrg
1404fee23f9Smrg# The program to run.
141*4d5abbe8Smrgprog=$1
1424fee23f9Smrgshift
1434fee23f9Smrg# Make any relative path in $prog absolute.
144*4d5abbe8Smrgcase $prog in
1454fee23f9Smrg  [\\/]* | ?:[\\/]*) ;;
146*4d5abbe8Smrg  *[\\/]*) prog=`pwd`/$prog ;;
1474fee23f9Smrgesac
1484fee23f9Smrg
1494fee23f9Smrgdirname=ylwrap$$
150*4d5abbe8Smrgdo_exit="cd '`pwd`' && rm -rf $dirname > /dev/null 2>&1;"' (exit $ret); exit $ret'
151*4d5abbe8Smrgtrap "ret=129; $do_exit" 1
152*4d5abbe8Smrgtrap "ret=130; $do_exit" 2
153*4d5abbe8Smrgtrap "ret=141; $do_exit" 13
154*4d5abbe8Smrgtrap "ret=143; $do_exit" 15
1554fee23f9Smrgmkdir $dirname || exit 1
1564fee23f9Smrg
1574fee23f9Smrgcd $dirname
1584fee23f9Smrg
1594fee23f9Smrgcase $# in
1604fee23f9Smrg  0) "$prog" "$input" ;;
1614fee23f9Smrg  *) "$prog" "$@" "$input" ;;
1624fee23f9Smrgesac
1634fee23f9Smrgret=$?
1644fee23f9Smrg
1654fee23f9Smrgif test $ret -eq 0; then
166*4d5abbe8Smrg  for from in *
167*4d5abbe8Smrg  do
168*4d5abbe8Smrg    to=`printf '%s\n' "$from" | sed "$sed_fix_filenames"`
1694fee23f9Smrg    if test -f "$from"; then
1704fee23f9Smrg      # If $2 is an absolute path name, then just use that,
171*4d5abbe8Smrg      # otherwise prepend '../'.
172*4d5abbe8Smrg      case $to in
173*4d5abbe8Smrg        [\\/]* | ?:[\\/]*) target=$to;;
174*4d5abbe8Smrg        *) target=../$to;;
1754fee23f9Smrg      esac
1764fee23f9Smrg
177*4d5abbe8Smrg      # Do not overwrite unchanged header files to avoid useless
178*4d5abbe8Smrg      # recompilations.  Always update the parser itself: it is the
179*4d5abbe8Smrg      # destination of the .y.c rule in the Makefile.  Divert the
180*4d5abbe8Smrg      # output of all other files to a temporary file so we can
181*4d5abbe8Smrg      # compare them to existing versions.
182*4d5abbe8Smrg      if test $from != $parser; then
183*4d5abbe8Smrg        realtarget=$target
184*4d5abbe8Smrg        target=tmp-`printf '%s\n' "$target" | sed 's|.*[\\/]||g'`
1854fee23f9Smrg      fi
1864fee23f9Smrg
187*4d5abbe8Smrg      # Munge "#line" or "#" directives.  Don't let the resulting
188*4d5abbe8Smrg      # debug information point at an absolute srcdir.  Use the real
189*4d5abbe8Smrg      # output file name, not yy.lex.c for instance.  Adjust the
190*4d5abbe8Smrg      # include guards too.
191*4d5abbe8Smrg      sed -e "/^#/!b"                           \
192*4d5abbe8Smrg          -e "s|$input_rx|$input_sub_rx|"       \
193*4d5abbe8Smrg          -e "$sed_fix_filenames"               \
194*4d5abbe8Smrg          -e "$sed_fix_header_guards"           \
195*4d5abbe8Smrg        "$from" >"$target" || ret=$?
1964fee23f9Smrg
197*4d5abbe8Smrg      # Check whether files must be updated.
198*4d5abbe8Smrg      if test "$from" != "$parser"; then
1994fee23f9Smrg        if test -f "$realtarget" && cmp -s "$realtarget" "$target"; then
200*4d5abbe8Smrg          echo "$to is unchanged"
2014fee23f9Smrg          rm -f "$target"
2024fee23f9Smrg        else
203*4d5abbe8Smrg          echo "updating $to"
2044fee23f9Smrg          mv -f "$target" "$realtarget"
2054fee23f9Smrg        fi
2064fee23f9Smrg      fi
2074fee23f9Smrg    else
208*4d5abbe8Smrg      # A missing file is only an error for the parser.  This is a
209*4d5abbe8Smrg      # blatant hack to let us support using "yacc -d".  If -d is not
210*4d5abbe8Smrg      # specified, don't fail when the header file is "missing".
211*4d5abbe8Smrg      if test "$from" = "$parser"; then
2124fee23f9Smrg        ret=1
2134fee23f9Smrg      fi
2144fee23f9Smrg    fi
2154fee23f9Smrg  done
2164fee23f9Smrgfi
2174fee23f9Smrg
2184fee23f9Smrg# Remove the directory.
2194fee23f9Smrgcd ..
2204fee23f9Smrgrm -rf $dirname
2214fee23f9Smrg
2224fee23f9Smrgexit $ret
2234fee23f9Smrg
2244fee23f9Smrg# Local Variables:
2254fee23f9Smrg# mode: shell-script
2264fee23f9Smrg# sh-indentation: 2
2274fee23f9Smrg# eval: (add-hook 'write-file-hooks 'time-stamp)
2284fee23f9Smrg# time-stamp-start: "scriptversion="
2294fee23f9Smrg# time-stamp-format: "%:y-%02m-%02d.%02H"
2304fee23f9Smrg# time-stamp-time-zone: "UTC"
2314fee23f9Smrg# time-stamp-end: "; # UTC"
2324fee23f9Smrg# End:
233