xref: /netbsd-src/external/gpl3/gcc.old/dist/ylwrap (revision 1debfc3d3fad8af6f31804271c18e67f77b4d718)
1*1debfc3dSmrg#! /bin/sh
2*1debfc3dSmrg# ylwrap - wrapper for lex/yacc invocations.
3*1debfc3dSmrg
4*1debfc3dSmrgscriptversion=2013-01-12.17; # UTC
5*1debfc3dSmrg
6*1debfc3dSmrg# Copyright (C) 1996-2014 Free Software Foundation, Inc.
7*1debfc3dSmrg#
8*1debfc3dSmrg# Written by Tom Tromey <tromey@cygnus.com>.
9*1debfc3dSmrg#
10*1debfc3dSmrg# This program is free software; you can redistribute it and/or modify
11*1debfc3dSmrg# it under the terms of the GNU General Public License as published by
12*1debfc3dSmrg# the Free Software Foundation; either version 2, or (at your option)
13*1debfc3dSmrg# any later version.
14*1debfc3dSmrg#
15*1debfc3dSmrg# This program is distributed in the hope that it will be useful,
16*1debfc3dSmrg# but WITHOUT ANY WARRANTY; without even the implied warranty of
17*1debfc3dSmrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*1debfc3dSmrg# GNU General Public License for more details.
19*1debfc3dSmrg#
20*1debfc3dSmrg# You should have received a copy of the GNU General Public License
21*1debfc3dSmrg# along with this program.  If not, see <http://www.gnu.org/licenses/>.
22*1debfc3dSmrg
23*1debfc3dSmrg# As a special exception to the GNU General Public License, if you
24*1debfc3dSmrg# distribute this file as part of a program that contains a
25*1debfc3dSmrg# configuration script generated by Autoconf, you may include it under
26*1debfc3dSmrg# the same distribution terms that you use for the rest of that program.
27*1debfc3dSmrg
28*1debfc3dSmrg# This file is maintained in Automake, please report
29*1debfc3dSmrg# bugs to <bug-automake@gnu.org> or send patches to
30*1debfc3dSmrg# <automake-patches@gnu.org>.
31*1debfc3dSmrg
32*1debfc3dSmrgget_dirname ()
33*1debfc3dSmrg{
34*1debfc3dSmrg  case $1 in
35*1debfc3dSmrg    */*|*\\*) printf '%s\n' "$1" | sed -e 's|\([\\/]\)[^\\/]*$|\1|';;
36*1debfc3dSmrg    # Otherwise,  we want the empty string (not ".").
37*1debfc3dSmrg  esac
38*1debfc3dSmrg}
39*1debfc3dSmrg
40*1debfc3dSmrg# guard FILE
41*1debfc3dSmrg# ----------
42*1debfc3dSmrg# The CPP macro used to guard inclusion of FILE.
43*1debfc3dSmrgguard ()
44*1debfc3dSmrg{
45*1debfc3dSmrg  printf '%s\n' "$1"                                                    \
46*1debfc3dSmrg    | sed                                                               \
47*1debfc3dSmrg        -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'   \
48*1debfc3dSmrg        -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'                        \
49*1debfc3dSmrg        -e 's/__*/_/g'
50*1debfc3dSmrg}
51*1debfc3dSmrg
52*1debfc3dSmrg# quote_for_sed [STRING]
53*1debfc3dSmrg# ----------------------
54*1debfc3dSmrg# Return STRING (or stdin) quoted to be used as a sed pattern.
55*1debfc3dSmrgquote_for_sed ()
56*1debfc3dSmrg{
57*1debfc3dSmrg  case $# in
58*1debfc3dSmrg    0) cat;;
59*1debfc3dSmrg    1) printf '%s\n' "$1";;
60*1debfc3dSmrg  esac \
61*1debfc3dSmrg    | sed -e 's|[][\\.*]|\\&|g'
62*1debfc3dSmrg}
63*1debfc3dSmrg
64*1debfc3dSmrgcase "$1" in
65*1debfc3dSmrg  '')
66*1debfc3dSmrg    echo "$0: No files given.  Try '$0 --help' for more information." 1>&2
67*1debfc3dSmrg    exit 1
68*1debfc3dSmrg    ;;
69*1debfc3dSmrg  --basedir)
70*1debfc3dSmrg    basedir=$2
71*1debfc3dSmrg    shift 2
72*1debfc3dSmrg    ;;
73*1debfc3dSmrg  -h|--h*)
74*1debfc3dSmrg    cat <<\EOF
75*1debfc3dSmrgUsage: ylwrap [--help|--version] INPUT [OUTPUT DESIRED]... -- PROGRAM [ARGS]...
76*1debfc3dSmrg
77*1debfc3dSmrgWrapper for lex/yacc invocations, renaming files as desired.
78*1debfc3dSmrg
79*1debfc3dSmrg  INPUT is the input file
80*1debfc3dSmrg  OUTPUT is one file PROG generates
81*1debfc3dSmrg  DESIRED is the file we actually want instead of OUTPUT
82*1debfc3dSmrg  PROGRAM is program to run
83*1debfc3dSmrg  ARGS are passed to PROG
84*1debfc3dSmrg
85*1debfc3dSmrgAny number of OUTPUT,DESIRED pairs may be used.
86*1debfc3dSmrg
87*1debfc3dSmrgReport bugs to <bug-automake@gnu.org>.
88*1debfc3dSmrgEOF
89*1debfc3dSmrg    exit $?
90*1debfc3dSmrg    ;;
91*1debfc3dSmrg  -v|--v*)
92*1debfc3dSmrg    echo "ylwrap $scriptversion"
93*1debfc3dSmrg    exit $?
94*1debfc3dSmrg    ;;
95*1debfc3dSmrgesac
96*1debfc3dSmrg
97*1debfc3dSmrg
98*1debfc3dSmrg# The input.
99*1debfc3dSmrginput=$1
100*1debfc3dSmrgshift
101*1debfc3dSmrg# We'll later need for a correct munging of "#line" directives.
102*1debfc3dSmrginput_sub_rx=`get_dirname "$input" | quote_for_sed`
103*1debfc3dSmrgcase $input in
104*1debfc3dSmrg  [\\/]* | ?:[\\/]*)
105*1debfc3dSmrg    # Absolute path; do nothing.
106*1debfc3dSmrg    ;;
107*1debfc3dSmrg  *)
108*1debfc3dSmrg    # Relative path.  Make it absolute.
109*1debfc3dSmrg    input=`pwd`/$input
110*1debfc3dSmrg    ;;
111*1debfc3dSmrgesac
112*1debfc3dSmrginput_rx=`get_dirname "$input" | quote_for_sed`
113*1debfc3dSmrg
114*1debfc3dSmrg# The parser itself, the first file, is the destination of the .y.c
115*1debfc3dSmrg# rule in the Makefile.
116*1debfc3dSmrgparser=$1
117*1debfc3dSmrg
118*1debfc3dSmrg# A sed program to s/FROM/TO/g for all the FROM/TO so that, for
119*1debfc3dSmrg# instance, we rename #include "y.tab.h" into #include "parse.h"
120*1debfc3dSmrg# during the conversion from y.tab.c to parse.c.
121*1debfc3dSmrgsed_fix_filenames=
122*1debfc3dSmrg
123*1debfc3dSmrg# Also rename header guards, as Bison 2.7 for instance uses its header
124*1debfc3dSmrg# guard in its implementation file.
125*1debfc3dSmrgsed_fix_header_guards=
126*1debfc3dSmrg
127*1debfc3dSmrgwhile test $# -ne 0; do
128*1debfc3dSmrg  if test x"$1" = x"--"; then
129*1debfc3dSmrg    shift
130*1debfc3dSmrg    break
131*1debfc3dSmrg  fi
132*1debfc3dSmrg  from=$1
133*1debfc3dSmrg  shift
134*1debfc3dSmrg  to=$1
135*1debfc3dSmrg  shift
136*1debfc3dSmrg  sed_fix_filenames="${sed_fix_filenames}s|"`quote_for_sed "$from"`"|$to|g;"
137*1debfc3dSmrg  sed_fix_header_guards="${sed_fix_header_guards}s|"`guard "$from"`"|"`guard "$to"`"|g;"
138*1debfc3dSmrgdone
139*1debfc3dSmrg
140*1debfc3dSmrg# The program to run.
141*1debfc3dSmrgprog=$1
142*1debfc3dSmrgshift
143*1debfc3dSmrg# Make any relative path in $prog absolute.
144*1debfc3dSmrgcase $prog in
145*1debfc3dSmrg  [\\/]* | ?:[\\/]*) ;;
146*1debfc3dSmrg  *[\\/]*) prog=`pwd`/$prog ;;
147*1debfc3dSmrgesac
148*1debfc3dSmrg
149*1debfc3dSmrgdirname=ylwrap$$
150*1debfc3dSmrgdo_exit="cd '`pwd`' && rm -rf $dirname > /dev/null 2>&1;"' (exit $ret); exit $ret'
151*1debfc3dSmrgtrap "ret=129; $do_exit" 1
152*1debfc3dSmrgtrap "ret=130; $do_exit" 2
153*1debfc3dSmrgtrap "ret=141; $do_exit" 13
154*1debfc3dSmrgtrap "ret=143; $do_exit" 15
155*1debfc3dSmrgmkdir $dirname || exit 1
156*1debfc3dSmrg
157*1debfc3dSmrgcd $dirname
158*1debfc3dSmrg
159*1debfc3dSmrgcase $# in
160*1debfc3dSmrg  0) "$prog" "$input" ;;
161*1debfc3dSmrg  *) "$prog" "$@" "$input" ;;
162*1debfc3dSmrgesac
163*1debfc3dSmrgret=$?
164*1debfc3dSmrg
165*1debfc3dSmrgif test $ret -eq 0; then
166*1debfc3dSmrg  for from in *
167*1debfc3dSmrg  do
168*1debfc3dSmrg    to=`printf '%s\n' "$from" | sed "$sed_fix_filenames"`
169*1debfc3dSmrg    if test -f "$from"; then
170*1debfc3dSmrg      # If $2 is an absolute path name, then just use that,
171*1debfc3dSmrg      # otherwise prepend '../'.
172*1debfc3dSmrg      case $to in
173*1debfc3dSmrg        [\\/]* | ?:[\\/]*) target=$to;;
174*1debfc3dSmrg        *) target=../$to;;
175*1debfc3dSmrg      esac
176*1debfc3dSmrg
177*1debfc3dSmrg      # Do not overwrite unchanged header files to avoid useless
178*1debfc3dSmrg      # recompilations.  Always update the parser itself: it is the
179*1debfc3dSmrg      # destination of the .y.c rule in the Makefile.  Divert the
180*1debfc3dSmrg      # output of all other files to a temporary file so we can
181*1debfc3dSmrg      # compare them to existing versions.
182*1debfc3dSmrg      if test $from != $parser; then
183*1debfc3dSmrg        realtarget=$target
184*1debfc3dSmrg        target=tmp-`printf '%s\n' "$target" | sed 's|.*[\\/]||g'`
185*1debfc3dSmrg      fi
186*1debfc3dSmrg
187*1debfc3dSmrg      # Munge "#line" or "#" directives.  Don't let the resulting
188*1debfc3dSmrg      # debug information point at an absolute srcdir.  Use the real
189*1debfc3dSmrg      # output file name, not yy.lex.c for instance.  Adjust the
190*1debfc3dSmrg      # include guards too.
191*1debfc3dSmrg      sed -e "/^#/!b"                           \
192*1debfc3dSmrg          -e "s|$input_rx|$input_sub_rx|"       \
193*1debfc3dSmrg          -e "$sed_fix_filenames"               \
194*1debfc3dSmrg          -e "$sed_fix_header_guards"           \
195*1debfc3dSmrg        "$from" >"$target" || ret=$?
196*1debfc3dSmrg
197*1debfc3dSmrg      # Check whether files must be updated.
198*1debfc3dSmrg      if test "$from" != "$parser"; then
199*1debfc3dSmrg        if test -f "$realtarget" && cmp -s "$realtarget" "$target"; then
200*1debfc3dSmrg          echo "$to is unchanged"
201*1debfc3dSmrg          rm -f "$target"
202*1debfc3dSmrg        else
203*1debfc3dSmrg          echo "updating $to"
204*1debfc3dSmrg          mv -f "$target" "$realtarget"
205*1debfc3dSmrg        fi
206*1debfc3dSmrg      fi
207*1debfc3dSmrg    else
208*1debfc3dSmrg      # A missing file is only an error for the parser.  This is a
209*1debfc3dSmrg      # blatant hack to let us support using "yacc -d".  If -d is not
210*1debfc3dSmrg      # specified, don't fail when the header file is "missing".
211*1debfc3dSmrg      if test "$from" = "$parser"; then
212*1debfc3dSmrg        ret=1
213*1debfc3dSmrg      fi
214*1debfc3dSmrg    fi
215*1debfc3dSmrg  done
216*1debfc3dSmrgfi
217*1debfc3dSmrg
218*1debfc3dSmrg# Remove the directory.
219*1debfc3dSmrgcd ..
220*1debfc3dSmrgrm -rf $dirname
221*1debfc3dSmrg
222*1debfc3dSmrgexit $ret
223*1debfc3dSmrg
224*1debfc3dSmrg# Local Variables:
225*1debfc3dSmrg# mode: shell-script
226*1debfc3dSmrg# sh-indentation: 2
227*1debfc3dSmrg# eval: (add-hook 'write-file-hooks 'time-stamp)
228*1debfc3dSmrg# time-stamp-start: "scriptversion="
229*1debfc3dSmrg# time-stamp-format: "%:y-%02m-%02d.%02H"
230*1debfc3dSmrg# time-stamp-time-zone: "UTC"
231*1debfc3dSmrg# time-stamp-end: "; # UTC"
232*1debfc3dSmrg# End:
233