ylwrap revision 9ff100ac
1db17cd6dSmrg#! /bin/sh
2db17cd6dSmrg# ylwrap - wrapper for lex/yacc invocations.
3db17cd6dSmrg
49ff100acSmrgscriptversion=2013-01-12.17; # UTC
5db17cd6dSmrg
69ff100acSmrg# Copyright (C) 1996-2014 Free Software Foundation, Inc.
7db17cd6dSmrg#
8db17cd6dSmrg# Written by Tom Tromey <tromey@cygnus.com>.
9db17cd6dSmrg#
10db17cd6dSmrg# This program is free software; you can redistribute it and/or modify
11db17cd6dSmrg# it under the terms of the GNU General Public License as published by
12db17cd6dSmrg# the Free Software Foundation; either version 2, or (at your option)
13db17cd6dSmrg# any later version.
14db17cd6dSmrg#
15db17cd6dSmrg# This program is distributed in the hope that it will be useful,
16db17cd6dSmrg# but WITHOUT ANY WARRANTY; without even the implied warranty of
17db17cd6dSmrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18db17cd6dSmrg# GNU General Public License for more details.
19db17cd6dSmrg#
20db17cd6dSmrg# You should have received a copy of the GNU General Public License
21db17cd6dSmrg# along with this program.  If not, see <http://www.gnu.org/licenses/>.
22db17cd6dSmrg
23db17cd6dSmrg# As a special exception to the GNU General Public License, if you
24db17cd6dSmrg# distribute this file as part of a program that contains a
25db17cd6dSmrg# configuration script generated by Autoconf, you may include it under
26db17cd6dSmrg# the same distribution terms that you use for the rest of that program.
27db17cd6dSmrg
28db17cd6dSmrg# This file is maintained in Automake, please report
29db17cd6dSmrg# bugs to <bug-automake@gnu.org> or send patches to
30db17cd6dSmrg# <automake-patches@gnu.org>.
31db17cd6dSmrg
329ff100acSmrgget_dirname ()
339ff100acSmrg{
349ff100acSmrg  case $1 in
359ff100acSmrg    */*|*\\*) printf '%s\n' "$1" | sed -e 's|\([\\/]\)[^\\/]*$|\1|';;
369ff100acSmrg    # Otherwise,  we want the empty string (not ".").
379ff100acSmrg  esac
389ff100acSmrg}
399ff100acSmrg
409ff100acSmrg# guard FILE
419ff100acSmrg# ----------
429ff100acSmrg# The CPP macro used to guard inclusion of FILE.
439ff100acSmrgguard ()
449ff100acSmrg{
459ff100acSmrg  printf '%s\n' "$1"                                                    \
469ff100acSmrg    | sed                                                               \
479ff100acSmrg        -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'   \
489ff100acSmrg        -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'                        \
499ff100acSmrg        -e 's/__*/_/g'
509ff100acSmrg}
519ff100acSmrg
529ff100acSmrg# quote_for_sed [STRING]
539ff100acSmrg# ----------------------
549ff100acSmrg# Return STRING (or stdin) quoted to be used as a sed pattern.
559ff100acSmrgquote_for_sed ()
569ff100acSmrg{
579ff100acSmrg  case $# in
589ff100acSmrg    0) cat;;
599ff100acSmrg    1) printf '%s\n' "$1";;
609ff100acSmrg  esac \
619ff100acSmrg    | sed -e 's|[][\\.*]|\\&|g'
629ff100acSmrg}
639ff100acSmrg
64db17cd6dSmrgcase "$1" in
65db17cd6dSmrg  '')
669ff100acSmrg    echo "$0: No files given.  Try '$0 --help' for more information." 1>&2
67db17cd6dSmrg    exit 1
68db17cd6dSmrg    ;;
69db17cd6dSmrg  --basedir)
70db17cd6dSmrg    basedir=$2
71db17cd6dSmrg    shift 2
72db17cd6dSmrg    ;;
73db17cd6dSmrg  -h|--h*)
74db17cd6dSmrg    cat <<\EOF
75db17cd6dSmrgUsage: ylwrap [--help|--version] INPUT [OUTPUT DESIRED]... -- PROGRAM [ARGS]...
76db17cd6dSmrg
77db17cd6dSmrgWrapper for lex/yacc invocations, renaming files as desired.
78db17cd6dSmrg
79db17cd6dSmrg  INPUT is the input file
80db17cd6dSmrg  OUTPUT is one file PROG generates
81db17cd6dSmrg  DESIRED is the file we actually want instead of OUTPUT
82db17cd6dSmrg  PROGRAM is program to run
83db17cd6dSmrg  ARGS are passed to PROG
84db17cd6dSmrg
85db17cd6dSmrgAny number of OUTPUT,DESIRED pairs may be used.
86db17cd6dSmrg
87db17cd6dSmrgReport bugs to <bug-automake@gnu.org>.
88db17cd6dSmrgEOF
89db17cd6dSmrg    exit $?
90db17cd6dSmrg    ;;
91db17cd6dSmrg  -v|--v*)
92db17cd6dSmrg    echo "ylwrap $scriptversion"
93db17cd6dSmrg    exit $?
94db17cd6dSmrg    ;;
95db17cd6dSmrgesac
96db17cd6dSmrg
97db17cd6dSmrg
98db17cd6dSmrg# The input.
999ff100acSmrginput=$1
100db17cd6dSmrgshift
1019ff100acSmrg# We'll later need for a correct munging of "#line" directives.
1029ff100acSmrginput_sub_rx=`get_dirname "$input" | quote_for_sed`
1039ff100acSmrgcase $input in
104db17cd6dSmrg  [\\/]* | ?:[\\/]*)
105db17cd6dSmrg    # Absolute path; do nothing.
106db17cd6dSmrg    ;;
107db17cd6dSmrg  *)
108db17cd6dSmrg    # Relative path.  Make it absolute.
1099ff100acSmrg    input=`pwd`/$input
110db17cd6dSmrg    ;;
111db17cd6dSmrgesac
1129ff100acSmrginput_rx=`get_dirname "$input" | quote_for_sed`
1139ff100acSmrg
1149ff100acSmrg# Since DOS filename conventions don't allow two dots,
1159ff100acSmrg# the DOS version of Bison writes out y_tab.c instead of y.tab.c
1169ff100acSmrg# and y_tab.h instead of y.tab.h. Test to see if this is the case.
1179ff100acSmrgy_tab_nodot=false
1189ff100acSmrgif test -f y_tab.c || test -f y_tab.h; then
1199ff100acSmrg  y_tab_nodot=true
1209ff100acSmrgfi
1219ff100acSmrg
1229ff100acSmrg# The parser itself, the first file, is the destination of the .y.c
1239ff100acSmrg# rule in the Makefile.
1249ff100acSmrgparser=$1
1259ff100acSmrg
1269ff100acSmrg# A sed program to s/FROM/TO/g for all the FROM/TO so that, for
1279ff100acSmrg# instance, we rename #include "y.tab.h" into #include "parse.h"
1289ff100acSmrg# during the conversion from y.tab.c to parse.c.
1299ff100acSmrgsed_fix_filenames=
130db17cd6dSmrg
1319ff100acSmrg# Also rename header guards, as Bison 2.7 for instance uses its header
1329ff100acSmrg# guard in its implementation file.
1339ff100acSmrgsed_fix_header_guards=
1349ff100acSmrg
1359ff100acSmrgwhile test $# -ne 0; do
1369ff100acSmrg  if test x"$1" = x"--"; then
137db17cd6dSmrg    shift
138db17cd6dSmrg    break
139db17cd6dSmrg  fi
1409ff100acSmrg  from=$1
1419ff100acSmrg  # Handle y_tab.c and y_tab.h output by DOS
1429ff100acSmrg  if $y_tab_nodot; then
1439ff100acSmrg    case $from in
1449ff100acSmrg      "y.tab.c") from=y_tab.c;;
1459ff100acSmrg      "y.tab.h") from=y_tab.h;;
1469ff100acSmrg    esac
1479ff100acSmrg  fi
148db17cd6dSmrg  shift
1499ff100acSmrg  to=$1
1509ff100acSmrg  shift
1519ff100acSmrg  sed_fix_filenames="${sed_fix_filenames}s|"`quote_for_sed "$from"`"|$to|g;"
1529ff100acSmrg  sed_fix_header_guards="${sed_fix_header_guards}s|"`guard "$from"`"|"`guard "$to"`"|g;"
153db17cd6dSmrgdone
154db17cd6dSmrg
155db17cd6dSmrg# The program to run.
1569ff100acSmrgprog=$1
157db17cd6dSmrgshift
158db17cd6dSmrg# Make any relative path in $prog absolute.
1599ff100acSmrgcase $prog in
160db17cd6dSmrg  [\\/]* | ?:[\\/]*) ;;
1619ff100acSmrg  *[\\/]*) prog=`pwd`/$prog ;;
162db17cd6dSmrgesac
163db17cd6dSmrg
164db17cd6dSmrgdirname=ylwrap$$
1659ff100acSmrgdo_exit="cd '`pwd`' && rm -rf $dirname > /dev/null 2>&1;"' (exit $ret); exit $ret'
1669ff100acSmrgtrap "ret=129; $do_exit" 1
1679ff100acSmrgtrap "ret=130; $do_exit" 2
1689ff100acSmrgtrap "ret=141; $do_exit" 13
1699ff100acSmrgtrap "ret=143; $do_exit" 15
170db17cd6dSmrgmkdir $dirname || exit 1
171db17cd6dSmrg
172db17cd6dSmrgcd $dirname
173db17cd6dSmrg
174db17cd6dSmrgcase $# in
175db17cd6dSmrg  0) "$prog" "$input" ;;
176db17cd6dSmrg  *) "$prog" "$@" "$input" ;;
177db17cd6dSmrgesac
178db17cd6dSmrgret=$?
179db17cd6dSmrg
180db17cd6dSmrgif test $ret -eq 0; then
1819ff100acSmrg  for from in *
1829ff100acSmrg  do
1839ff100acSmrg    to=`printf '%s\n' "$from" | sed "$sed_fix_filenames"`
184db17cd6dSmrg    if test -f "$from"; then
185db17cd6dSmrg      # If $2 is an absolute path name, then just use that,
1869ff100acSmrg      # otherwise prepend '../'.
1879ff100acSmrg      case $to in
1889ff100acSmrg        [\\/]* | ?:[\\/]*) target=$to;;
1899ff100acSmrg        *) target=../$to;;
190db17cd6dSmrg      esac
191db17cd6dSmrg
1929ff100acSmrg      # Do not overwrite unchanged header files to avoid useless
1939ff100acSmrg      # recompilations.  Always update the parser itself: it is the
1949ff100acSmrg      # destination of the .y.c rule in the Makefile.  Divert the
1959ff100acSmrg      # output of all other files to a temporary file so we can
1969ff100acSmrg      # compare them to existing versions.
1979ff100acSmrg      if test $from != $parser; then
1989ff100acSmrg        realtarget=$target
1999ff100acSmrg        target=tmp-`printf '%s\n' "$target" | sed 's|.*[\\/]||g'`
200db17cd6dSmrg      fi
2019ff100acSmrg
2029ff100acSmrg      # Munge "#line" or "#" directives.  Don't let the resulting
2039ff100acSmrg      # debug information point at an absolute srcdir.  Use the real
2049ff100acSmrg      # output file name, not yy.lex.c for instance.  Adjust the
2059ff100acSmrg      # include guards too.
2069ff100acSmrg      sed -e "/^#/!b"                           \
2079ff100acSmrg          -e "s|$input_rx|$input_sub_rx|"       \
2089ff100acSmrg          -e "$sed_fix_filenames"               \
2099ff100acSmrg          -e "$sed_fix_header_guards"           \
2109ff100acSmrg        "$from" >"$target" || ret=$?
2119ff100acSmrg
2129ff100acSmrg      # Check whether files must be updated.
2139ff100acSmrg      if test "$from" != "$parser"; then
2149ff100acSmrg        if test -f "$realtarget" && cmp -s "$realtarget" "$target"; then
2159ff100acSmrg          echo "$to is unchanged"
2169ff100acSmrg          rm -f "$target"
2179ff100acSmrg        else
2189ff100acSmrg          echo "updating $to"
219db17cd6dSmrg          mv -f "$target" "$realtarget"
220db17cd6dSmrg        fi
221db17cd6dSmrg      fi
222db17cd6dSmrg    else
2239ff100acSmrg      # A missing file is only an error for the parser.  This is a
2249ff100acSmrg      # blatant hack to let us support using "yacc -d".  If -d is not
2259ff100acSmrg      # specified, don't fail when the header file is "missing".
2269ff100acSmrg      if test "$from" = "$parser"; then
227db17cd6dSmrg        ret=1
228db17cd6dSmrg      fi
229db17cd6dSmrg    fi
230db17cd6dSmrg  done
231db17cd6dSmrgfi
232db17cd6dSmrg
233db17cd6dSmrg# Remove the directory.
234db17cd6dSmrgcd ..
235db17cd6dSmrgrm -rf $dirname
236db17cd6dSmrg
237db17cd6dSmrgexit $ret
238db17cd6dSmrg
239db17cd6dSmrg# Local Variables:
240db17cd6dSmrg# mode: shell-script
241db17cd6dSmrg# sh-indentation: 2
242db17cd6dSmrg# eval: (add-hook 'write-file-hooks 'time-stamp)
243db17cd6dSmrg# time-stamp-start: "scriptversion="
244db17cd6dSmrg# time-stamp-format: "%:y-%02m-%02d.%02H"
245db17cd6dSmrg# time-stamp-time-zone: "UTC"
246db17cd6dSmrg# time-stamp-end: "; # UTC"
247db17cd6dSmrg# End:
248