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