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