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