1 1.1 mrg #! /bin/sh 2 1.1 mrg # ylwrap - wrapper for lex/yacc invocations. 3 1.1 mrg 4 1.5 mrg scriptversion=2013-01-12.17; # UTC 5 1.1 mrg 6 1.5 mrg # Copyright (C) 1996-2014 Free Software Foundation, Inc. 7 1.1 mrg # 8 1.1 mrg # Written by Tom Tromey <tromey (at] cygnus.com>. 9 1.1 mrg # 10 1.1 mrg # This program is free software; you can redistribute it and/or modify 11 1.1 mrg # it under the terms of the GNU General Public License as published by 12 1.1 mrg # the Free Software Foundation; either version 2, or (at your option) 13 1.1 mrg # any later version. 14 1.1 mrg # 15 1.1 mrg # This program is distributed in the hope that it will be useful, 16 1.1 mrg # but WITHOUT ANY WARRANTY; without even the implied warranty of 17 1.1 mrg # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 1.1 mrg # GNU General Public License for more details. 19 1.1 mrg # 20 1.1 mrg # You should have received a copy of the GNU General Public License 21 1.1 mrg # along with this program. If not, see <http://www.gnu.org/licenses/>. 22 1.1 mrg 23 1.1 mrg # As a special exception to the GNU General Public License, if you 24 1.1 mrg # distribute this file as part of a program that contains a 25 1.1 mrg # configuration script generated by Autoconf, you may include it under 26 1.1 mrg # the same distribution terms that you use for the rest of that program. 27 1.1 mrg 28 1.1 mrg # This file is maintained in Automake, please report 29 1.1 mrg # bugs to <bug-automake (at] gnu.org> or send patches to 30 1.1 mrg # <automake-patches (at] gnu.org>. 31 1.1 mrg 32 1.5 mrg get_dirname () 33 1.5 mrg { 34 1.5 mrg case $1 in 35 1.5 mrg */*|*\\*) printf '%s\n' "$1" | sed -e 's|\([\\/]\)[^\\/]*$|\1|';; 36 1.5 mrg # Otherwise, we want the empty string (not "."). 37 1.5 mrg esac 38 1.5 mrg } 39 1.5 mrg 40 1.5 mrg # guard FILE 41 1.5 mrg # ---------- 42 1.5 mrg # The CPP macro used to guard inclusion of FILE. 43 1.5 mrg guard () 44 1.5 mrg { 45 1.5 mrg printf '%s\n' "$1" \ 46 1.5 mrg | sed \ 47 1.5 mrg -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' \ 48 1.5 mrg -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g' \ 49 1.5 mrg -e 's/__*/_/g' 50 1.5 mrg } 51 1.5 mrg 52 1.5 mrg # quote_for_sed [STRING] 53 1.5 mrg # ---------------------- 54 1.5 mrg # Return STRING (or stdin) quoted to be used as a sed pattern. 55 1.5 mrg quote_for_sed () 56 1.5 mrg { 57 1.5 mrg case $# in 58 1.5 mrg 0) cat;; 59 1.5 mrg 1) printf '%s\n' "$1";; 60 1.5 mrg esac \ 61 1.5 mrg | sed -e 's|[][\\.*]|\\&|g' 62 1.5 mrg } 63 1.5 mrg 64 1.1 mrg case "$1" in 65 1.1 mrg '') 66 1.5 mrg echo "$0: No files given. Try '$0 --help' for more information." 1>&2 67 1.1 mrg exit 1 68 1.1 mrg ;; 69 1.1 mrg --basedir) 70 1.1 mrg basedir=$2 71 1.1 mrg shift 2 72 1.1 mrg ;; 73 1.1 mrg -h|--h*) 74 1.1 mrg cat <<\EOF 75 1.1 mrg Usage: ylwrap [--help|--version] INPUT [OUTPUT DESIRED]... -- PROGRAM [ARGS]... 76 1.1 mrg 77 1.1 mrg Wrapper for lex/yacc invocations, renaming files as desired. 78 1.1 mrg 79 1.1 mrg INPUT is the input file 80 1.1 mrg OUTPUT is one file PROG generates 81 1.1 mrg DESIRED is the file we actually want instead of OUTPUT 82 1.1 mrg PROGRAM is program to run 83 1.1 mrg ARGS are passed to PROG 84 1.1 mrg 85 1.1 mrg Any number of OUTPUT,DESIRED pairs may be used. 86 1.1 mrg 87 1.1 mrg Report bugs to <bug-automake@gnu.org>. 88 1.1 mrg EOF 89 1.1 mrg exit $? 90 1.1 mrg ;; 91 1.1 mrg -v|--v*) 92 1.1 mrg echo "ylwrap $scriptversion" 93 1.1 mrg exit $? 94 1.1 mrg ;; 95 1.1 mrg esac 96 1.1 mrg 97 1.1 mrg 98 1.1 mrg # The input. 99 1.5 mrg input=$1 100 1.1 mrg shift 101 1.5 mrg # We'll later need for a correct munging of "#line" directives. 102 1.5 mrg input_sub_rx=`get_dirname "$input" | quote_for_sed` 103 1.5 mrg case $input in 104 1.1 mrg [\\/]* | ?:[\\/]*) 105 1.1 mrg # Absolute path; do nothing. 106 1.1 mrg ;; 107 1.1 mrg *) 108 1.1 mrg # Relative path. Make it absolute. 109 1.5 mrg input=`pwd`/$input 110 1.1 mrg ;; 111 1.1 mrg esac 112 1.5 mrg input_rx=`get_dirname "$input" | quote_for_sed` 113 1.5 mrg 114 1.5 mrg # The parser itself, the first file, is the destination of the .y.c 115 1.5 mrg # rule in the Makefile. 116 1.5 mrg parser=$1 117 1.5 mrg 118 1.5 mrg # A sed program to s/FROM/TO/g for all the FROM/TO so that, for 119 1.5 mrg # instance, we rename #include "y.tab.h" into #include "parse.h" 120 1.5 mrg # during the conversion from y.tab.c to parse.c. 121 1.5 mrg sed_fix_filenames= 122 1.5 mrg 123 1.5 mrg # Also rename header guards, as Bison 2.7 for instance uses its header 124 1.5 mrg # guard in its implementation file. 125 1.5 mrg sed_fix_header_guards= 126 1.1 mrg 127 1.5 mrg while test $# -ne 0; do 128 1.5 mrg if test x"$1" = x"--"; then 129 1.1 mrg shift 130 1.1 mrg break 131 1.1 mrg fi 132 1.5 mrg from=$1 133 1.5 mrg shift 134 1.5 mrg to=$1 135 1.1 mrg shift 136 1.5 mrg sed_fix_filenames="${sed_fix_filenames}s|"`quote_for_sed "$from"`"|$to|g;" 137 1.5 mrg sed_fix_header_guards="${sed_fix_header_guards}s|"`guard "$from"`"|"`guard "$to"`"|g;" 138 1.1 mrg done 139 1.1 mrg 140 1.1 mrg # The program to run. 141 1.5 mrg prog=$1 142 1.1 mrg shift 143 1.1 mrg # Make any relative path in $prog absolute. 144 1.5 mrg case $prog in 145 1.1 mrg [\\/]* | ?:[\\/]*) ;; 146 1.5 mrg *[\\/]*) prog=`pwd`/$prog ;; 147 1.1 mrg esac 148 1.1 mrg 149 1.1 mrg dirname=ylwrap$$ 150 1.5 mrg do_exit="cd '`pwd`' && rm -rf $dirname > /dev/null 2>&1;"' (exit $ret); exit $ret' 151 1.5 mrg trap "ret=129; $do_exit" 1 152 1.5 mrg trap "ret=130; $do_exit" 2 153 1.5 mrg trap "ret=141; $do_exit" 13 154 1.5 mrg trap "ret=143; $do_exit" 15 155 1.1 mrg mkdir $dirname || exit 1 156 1.1 mrg 157 1.1 mrg cd $dirname 158 1.1 mrg 159 1.1 mrg case $# in 160 1.1 mrg 0) "$prog" "$input" ;; 161 1.1 mrg *) "$prog" "$@" "$input" ;; 162 1.1 mrg esac 163 1.1 mrg ret=$? 164 1.1 mrg 165 1.1 mrg if test $ret -eq 0; then 166 1.5 mrg for from in * 167 1.5 mrg do 168 1.5 mrg to=`printf '%s\n' "$from" | sed "$sed_fix_filenames"` 169 1.1 mrg if test -f "$from"; then 170 1.1 mrg # If $2 is an absolute path name, then just use that, 171 1.5 mrg # otherwise prepend '../'. 172 1.5 mrg case $to in 173 1.5 mrg [\\/]* | ?:[\\/]*) target=$to;; 174 1.5 mrg *) target=../$to;; 175 1.1 mrg esac 176 1.1 mrg 177 1.5 mrg # Do not overwrite unchanged header files to avoid useless 178 1.5 mrg # recompilations. Always update the parser itself: it is the 179 1.5 mrg # destination of the .y.c rule in the Makefile. Divert the 180 1.5 mrg # output of all other files to a temporary file so we can 181 1.5 mrg # compare them to existing versions. 182 1.5 mrg if test $from != $parser; then 183 1.5 mrg realtarget=$target 184 1.5 mrg target=tmp-`printf '%s\n' "$target" | sed 's|.*[\\/]||g'` 185 1.1 mrg fi 186 1.5 mrg 187 1.5 mrg # Munge "#line" or "#" directives. Don't let the resulting 188 1.5 mrg # debug information point at an absolute srcdir. Use the real 189 1.5 mrg # output file name, not yy.lex.c for instance. Adjust the 190 1.5 mrg # include guards too. 191 1.5 mrg sed -e "/^#/!b" \ 192 1.5 mrg -e "s|$input_rx|$input_sub_rx|" \ 193 1.5 mrg -e "$sed_fix_filenames" \ 194 1.5 mrg -e "$sed_fix_header_guards" \ 195 1.5 mrg "$from" >"$target" || ret=$? 196 1.5 mrg 197 1.5 mrg # Check whether files must be updated. 198 1.5 mrg if test "$from" != "$parser"; then 199 1.5 mrg if test -f "$realtarget" && cmp -s "$realtarget" "$target"; then 200 1.5 mrg echo "$to is unchanged" 201 1.5 mrg rm -f "$target" 202 1.5 mrg else 203 1.5 mrg echo "updating $to" 204 1.1 mrg mv -f "$target" "$realtarget" 205 1.1 mrg fi 206 1.1 mrg fi 207 1.1 mrg else 208 1.5 mrg # A missing file is only an error for the parser. This is a 209 1.5 mrg # blatant hack to let us support using "yacc -d". If -d is not 210 1.5 mrg # specified, don't fail when the header file is "missing". 211 1.5 mrg if test "$from" = "$parser"; then 212 1.1 mrg ret=1 213 1.1 mrg fi 214 1.1 mrg fi 215 1.1 mrg done 216 1.1 mrg fi 217 1.1 mrg 218 1.1 mrg # Remove the directory. 219 1.1 mrg cd .. 220 1.1 mrg rm -rf $dirname 221 1.1 mrg 222 1.1 mrg exit $ret 223 1.1 mrg 224 1.1 mrg # Local Variables: 225 1.1 mrg # mode: shell-script 226 1.1 mrg # sh-indentation: 2 227 1.1 mrg # eval: (add-hook 'write-file-hooks 'time-stamp) 228 1.1 mrg # time-stamp-start: "scriptversion=" 229 1.1 mrg # time-stamp-format: "%:y-%02m-%02d.%02H" 230 1.1 mrg # time-stamp-time-zone: "UTC" 231 1.1 mrg # time-stamp-end: "; # UTC" 232 1.1 mrg # End: 233