xref: /freebsd/contrib/openbsm/config/ylwrap (revision cfe30d02adda7c3b5c76156ac52d50d8cab325d9)
1*aa772005SRobert Watson#! /bin/sh
2*aa772005SRobert Watson# ylwrap - wrapper for lex/yacc invocations.
3*aa772005SRobert Watson
4*aa772005SRobert Watsonscriptversion=2011-08-25.18; # UTC
5*aa772005SRobert Watson
6*aa772005SRobert Watson# Copyright (C) 1996-2012 Free Software Foundation, Inc.
7*aa772005SRobert Watson#
8*aa772005SRobert Watson# Written by Tom Tromey <tromey@cygnus.com>.
9*aa772005SRobert Watson#
10*aa772005SRobert Watson# This program is free software; you can redistribute it and/or modify
11*aa772005SRobert Watson# it under the terms of the GNU General Public License as published by
12*aa772005SRobert Watson# the Free Software Foundation; either version 2, or (at your option)
13*aa772005SRobert Watson# any later version.
14*aa772005SRobert Watson#
15*aa772005SRobert Watson# This program is distributed in the hope that it will be useful,
16*aa772005SRobert Watson# but WITHOUT ANY WARRANTY; without even the implied warranty of
17*aa772005SRobert Watson# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*aa772005SRobert Watson# GNU General Public License for more details.
19*aa772005SRobert Watson#
20*aa772005SRobert Watson# You should have received a copy of the GNU General Public License
21*aa772005SRobert Watson# along with this program.  If not, see <http://www.gnu.org/licenses/>.
22*aa772005SRobert Watson
23*aa772005SRobert Watson# As a special exception to the GNU General Public License, if you
24*aa772005SRobert Watson# distribute this file as part of a program that contains a
25*aa772005SRobert Watson# configuration script generated by Autoconf, you may include it under
26*aa772005SRobert Watson# the same distribution terms that you use for the rest of that program.
27*aa772005SRobert Watson
28*aa772005SRobert Watson# This file is maintained in Automake, please report
29*aa772005SRobert Watson# bugs to <bug-automake@gnu.org> or send patches to
30*aa772005SRobert Watson# <automake-patches@gnu.org>.
31*aa772005SRobert Watson
32*aa772005SRobert Watsoncase "$1" in
33*aa772005SRobert Watson  '')
34*aa772005SRobert Watson    echo "$0: No files given.  Try '$0 --help' for more information." 1>&2
35*aa772005SRobert Watson    exit 1
36*aa772005SRobert Watson    ;;
37*aa772005SRobert Watson  --basedir)
38*aa772005SRobert Watson    basedir=$2
39*aa772005SRobert Watson    shift 2
40*aa772005SRobert Watson    ;;
41*aa772005SRobert Watson  -h|--h*)
42*aa772005SRobert Watson    cat <<\EOF
43*aa772005SRobert WatsonUsage: ylwrap [--help|--version] INPUT [OUTPUT DESIRED]... -- PROGRAM [ARGS]...
44*aa772005SRobert Watson
45*aa772005SRobert WatsonWrapper for lex/yacc invocations, renaming files as desired.
46*aa772005SRobert Watson
47*aa772005SRobert Watson  INPUT is the input file
48*aa772005SRobert Watson  OUTPUT is one file PROG generates
49*aa772005SRobert Watson  DESIRED is the file we actually want instead of OUTPUT
50*aa772005SRobert Watson  PROGRAM is program to run
51*aa772005SRobert Watson  ARGS are passed to PROG
52*aa772005SRobert Watson
53*aa772005SRobert WatsonAny number of OUTPUT,DESIRED pairs may be used.
54*aa772005SRobert Watson
55*aa772005SRobert WatsonReport bugs to <bug-automake@gnu.org>.
56*aa772005SRobert WatsonEOF
57*aa772005SRobert Watson    exit $?
58*aa772005SRobert Watson    ;;
59*aa772005SRobert Watson  -v|--v*)
60*aa772005SRobert Watson    echo "ylwrap $scriptversion"
61*aa772005SRobert Watson    exit $?
62*aa772005SRobert Watson    ;;
63*aa772005SRobert Watsonesac
64*aa772005SRobert Watson
65*aa772005SRobert Watsonget_dirname ()
66*aa772005SRobert Watson{
67*aa772005SRobert Watson  case $1 in
68*aa772005SRobert Watson    */*|*\\*) printf '%s\n' "$1" | sed -e 's,\([\\/]\)[^\\/]*$,\1,';;
69*aa772005SRobert Watson    # Otherwise,  we want the empty string (not ".").
70*aa772005SRobert Watson  esac
71*aa772005SRobert Watson}
72*aa772005SRobert Watson
73*aa772005SRobert Watsonquote_for_sed ()
74*aa772005SRobert Watson{
75*aa772005SRobert Watson  # FIXME: really we should care about more than '.' and '\'.
76*aa772005SRobert Watson  sed -e 's,[\\.],\\&,g'
77*aa772005SRobert Watson}
78*aa772005SRobert Watson
79*aa772005SRobert Watson# The input.
80*aa772005SRobert Watsoninput="$1"
81*aa772005SRobert Watsonshift
82*aa772005SRobert Watson# We'll later need for a correct munging of "#line" directives.
83*aa772005SRobert Watsoninput_sub_rx=`get_dirname "$input" | quote_for_sed`
84*aa772005SRobert Watsoncase "$input" in
85*aa772005SRobert Watson  [\\/]* | ?:[\\/]*)
86*aa772005SRobert Watson    # Absolute path; do nothing.
87*aa772005SRobert Watson    ;;
88*aa772005SRobert Watson  *)
89*aa772005SRobert Watson    # Relative path.  Make it absolute.
90*aa772005SRobert Watson    input="`pwd`/$input"
91*aa772005SRobert Watson    ;;
92*aa772005SRobert Watsonesac
93*aa772005SRobert Watson
94*aa772005SRobert Watsonpairlist=
95*aa772005SRobert Watsonwhile test "$#" -ne 0; do
96*aa772005SRobert Watson  if test "$1" = "--"; then
97*aa772005SRobert Watson    shift
98*aa772005SRobert Watson    break
99*aa772005SRobert Watson  fi
100*aa772005SRobert Watson  pairlist="$pairlist $1"
101*aa772005SRobert Watson  shift
102*aa772005SRobert Watsondone
103*aa772005SRobert Watson
104*aa772005SRobert Watson# The program to run.
105*aa772005SRobert Watsonprog="$1"
106*aa772005SRobert Watsonshift
107*aa772005SRobert Watson# Make any relative path in $prog absolute.
108*aa772005SRobert Watsoncase "$prog" in
109*aa772005SRobert Watson  [\\/]* | ?:[\\/]*) ;;
110*aa772005SRobert Watson  *[\\/]*) prog="`pwd`/$prog" ;;
111*aa772005SRobert Watsonesac
112*aa772005SRobert Watson
113*aa772005SRobert Watson# FIXME: add hostname here for parallel makes that run commands on
114*aa772005SRobert Watson# other machines.  But that might take us over the 14-char limit.
115*aa772005SRobert Watsondirname=ylwrap$$
116*aa772005SRobert Watsondo_exit="cd '`pwd`' && rm -rf $dirname > /dev/null 2>&1;"' (exit $ret); exit $ret'
117*aa772005SRobert Watsontrap "ret=129; $do_exit" 1
118*aa772005SRobert Watsontrap "ret=130; $do_exit" 2
119*aa772005SRobert Watsontrap "ret=141; $do_exit" 13
120*aa772005SRobert Watsontrap "ret=143; $do_exit" 15
121*aa772005SRobert Watsonmkdir $dirname || exit 1
122*aa772005SRobert Watson
123*aa772005SRobert Watsoncd $dirname
124*aa772005SRobert Watson
125*aa772005SRobert Watsoncase $# in
126*aa772005SRobert Watson  0) "$prog" "$input" ;;
127*aa772005SRobert Watson  *) "$prog" "$@" "$input" ;;
128*aa772005SRobert Watsonesac
129*aa772005SRobert Watsonret=$?
130*aa772005SRobert Watson
131*aa772005SRobert Watsonif test $ret -eq 0; then
132*aa772005SRobert Watson  set X $pairlist
133*aa772005SRobert Watson  shift
134*aa772005SRobert Watson  first=yes
135*aa772005SRobert Watson  # Since DOS filename conventions don't allow two dots,
136*aa772005SRobert Watson  # the DOS version of Bison writes out y_tab.c instead of y.tab.c
137*aa772005SRobert Watson  # and y_tab.h instead of y.tab.h. Test to see if this is the case.
138*aa772005SRobert Watson  y_tab_nodot="no"
139*aa772005SRobert Watson  if test -f y_tab.c || test -f y_tab.h; then
140*aa772005SRobert Watson    y_tab_nodot="yes"
141*aa772005SRobert Watson  fi
142*aa772005SRobert Watson
143*aa772005SRobert Watson  input_rx=`get_dirname "$input" | quote_for_sed`
144*aa772005SRobert Watson
145*aa772005SRobert Watson  while test "$#" -ne 0; do
146*aa772005SRobert Watson    from="$1"
147*aa772005SRobert Watson    # Handle y_tab.c and y_tab.h output by DOS
148*aa772005SRobert Watson    if test $y_tab_nodot = "yes"; then
149*aa772005SRobert Watson      if test $from = "y.tab.c"; then
150*aa772005SRobert Watson        from="y_tab.c"
151*aa772005SRobert Watson      else
152*aa772005SRobert Watson        if test $from = "y.tab.h"; then
153*aa772005SRobert Watson          from="y_tab.h"
154*aa772005SRobert Watson        fi
155*aa772005SRobert Watson      fi
156*aa772005SRobert Watson    fi
157*aa772005SRobert Watson    if test -f "$from"; then
158*aa772005SRobert Watson      # If $2 is an absolute path name, then just use that,
159*aa772005SRobert Watson      # otherwise prepend '../'.
160*aa772005SRobert Watson      case "$2" in
161*aa772005SRobert Watson        [\\/]* | ?:[\\/]*) target="$2";;
162*aa772005SRobert Watson        *) target="../$2";;
163*aa772005SRobert Watson      esac
164*aa772005SRobert Watson
165*aa772005SRobert Watson      # We do not want to overwrite a header file if it hasn't
166*aa772005SRobert Watson      # changed.  This avoid useless recompilations.  However the
167*aa772005SRobert Watson      # parser itself (the first file) should always be updated,
168*aa772005SRobert Watson      # because it is the destination of the .y.c rule in the
169*aa772005SRobert Watson      # Makefile.  Divert the output of all other files to a temporary
170*aa772005SRobert Watson      # file so we can compare them to existing versions.
171*aa772005SRobert Watson      if test $first = no; then
172*aa772005SRobert Watson        realtarget="$target"
173*aa772005SRobert Watson        target="tmp-`echo $target | sed s/.*[\\/]//g`"
174*aa772005SRobert Watson      fi
175*aa772005SRobert Watson      # Munge "#line" or "#" directives.
176*aa772005SRobert Watson      # We don't want the resulting debug information to point at
177*aa772005SRobert Watson      # an absolute srcdir.
178*aa772005SRobert Watson      # We want to use the real output file name, not yy.lex.c for
179*aa772005SRobert Watson      # instance.
180*aa772005SRobert Watson      # We want the include guards to be adjusted too.
181*aa772005SRobert Watson      FROM=`echo "$from" | sed \
182*aa772005SRobert Watson            -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'\
183*aa772005SRobert Watson            -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'`
184*aa772005SRobert Watson      TARGET=`echo "$2" | sed \
185*aa772005SRobert Watson            -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'\
186*aa772005SRobert Watson            -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'`
187*aa772005SRobert Watson
188*aa772005SRobert Watson      sed -e "/^#/!b" -e "s,$input_rx,$input_sub_rx," -e "s,$from,$2," \
189*aa772005SRobert Watson          -e "s,$FROM,$TARGET," "$from" >"$target" || ret=$?
190*aa772005SRobert Watson
191*aa772005SRobert Watson      # Check whether header files must be updated.
192*aa772005SRobert Watson      if test $first = no; then
193*aa772005SRobert Watson        if test -f "$realtarget" && cmp -s "$realtarget" "$target"; then
194*aa772005SRobert Watson          echo "$2" is unchanged
195*aa772005SRobert Watson          rm -f "$target"
196*aa772005SRobert Watson        else
197*aa772005SRobert Watson          echo updating "$2"
198*aa772005SRobert Watson          mv -f "$target" "$realtarget"
199*aa772005SRobert Watson        fi
200*aa772005SRobert Watson      fi
201*aa772005SRobert Watson    else
202*aa772005SRobert Watson      # A missing file is only an error for the first file.  This
203*aa772005SRobert Watson      # is a blatant hack to let us support using "yacc -d".  If -d
204*aa772005SRobert Watson      # is not specified, we don't want an error when the header
205*aa772005SRobert Watson      # file is "missing".
206*aa772005SRobert Watson      if test $first = yes; then
207*aa772005SRobert Watson        ret=1
208*aa772005SRobert Watson      fi
209*aa772005SRobert Watson    fi
210*aa772005SRobert Watson    shift
211*aa772005SRobert Watson    shift
212*aa772005SRobert Watson    first=no
213*aa772005SRobert Watson  done
214*aa772005SRobert Watsonelse
215*aa772005SRobert Watson  ret=$?
216*aa772005SRobert Watsonfi
217*aa772005SRobert Watson
218*aa772005SRobert Watson# Remove the directory.
219*aa772005SRobert Watsoncd ..
220*aa772005SRobert Watsonrm -rf $dirname
221*aa772005SRobert Watson
222*aa772005SRobert Watsonexit $ret
223*aa772005SRobert Watson
224*aa772005SRobert Watson# Local Variables:
225*aa772005SRobert Watson# mode: shell-script
226*aa772005SRobert Watson# sh-indentation: 2
227*aa772005SRobert Watson# eval: (add-hook 'write-file-hooks 'time-stamp)
228*aa772005SRobert Watson# time-stamp-start: "scriptversion="
229*aa772005SRobert Watson# time-stamp-format: "%:y-%02m-%02d.%02H"
230*aa772005SRobert Watson# time-stamp-time-zone: "UTC"
231*aa772005SRobert Watson# time-stamp-end: "; # UTC"
232*aa772005SRobert Watson# End:
233