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