1 1.1 mrg #! /bin/sh 2 1.1 mrg # ylwrap - wrapper for lex/yacc invocations. 3 1.1 mrg 4 1.1.1.5 mrg scriptversion=2018-03-07.03; # UTC 5 1.1 mrg 6 1.1.1.5 mrg # Copyright (C) 1996-2021 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.1.5 mrg # along with this program. If not, see <https://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.1.1.3 mrg get_dirname () 33 1.1.1.3 mrg { 34 1.1.1.3 mrg case $1 in 35 1.1.1.3 mrg */*|*\\*) printf '%s\n' "$1" | sed -e 's|\([\\/]\)[^\\/]*$|\1|';; 36 1.1.1.3 mrg # Otherwise, we want the empty string (not "."). 37 1.1.1.3 mrg esac 38 1.1.1.3 mrg } 39 1.1.1.3 mrg 40 1.1.1.3 mrg # guard FILE 41 1.1.1.3 mrg # ---------- 42 1.1.1.3 mrg # The CPP macro used to guard inclusion of FILE. 43 1.1.1.3 mrg guard () 44 1.1.1.3 mrg { 45 1.1.1.3 mrg printf '%s\n' "$1" \ 46 1.1.1.3 mrg | sed \ 47 1.1.1.3 mrg -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' \ 48 1.1.1.3 mrg -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g' \ 49 1.1.1.3 mrg -e 's/__*/_/g' 50 1.1.1.3 mrg } 51 1.1.1.3 mrg 52 1.1.1.3 mrg # quote_for_sed [STRING] 53 1.1.1.3 mrg # ---------------------- 54 1.1.1.3 mrg # Return STRING (or stdin) quoted to be used as a sed pattern. 55 1.1.1.3 mrg quote_for_sed () 56 1.1.1.3 mrg { 57 1.1.1.3 mrg case $# in 58 1.1.1.3 mrg 0) cat;; 59 1.1.1.3 mrg 1) printf '%s\n' "$1";; 60 1.1.1.3 mrg esac \ 61 1.1.1.3 mrg | sed -e 's|[][\\.*]|\\&|g' 62 1.1.1.3 mrg } 63 1.1.1.3 mrg 64 1.1 mrg case "$1" in 65 1.1 mrg '') 66 1.1.1.3 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.1.1.3 mrg input=$1 100 1.1 mrg shift 101 1.1.1.3 mrg # We'll later need for a correct munging of "#line" directives. 102 1.1.1.3 mrg input_sub_rx=`get_dirname "$input" | quote_for_sed` 103 1.1.1.3 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.1.1.3 mrg input=`pwd`/$input 110 1.1 mrg ;; 111 1.1 mrg esac 112 1.1.1.3 mrg input_rx=`get_dirname "$input" | quote_for_sed` 113 1.1.1.3 mrg 114 1.1.1.3 mrg # Since DOS filename conventions don't allow two dots, 115 1.1.1.3 mrg # the DOS version of Bison writes out y_tab.c instead of y.tab.c 116 1.1.1.3 mrg # and y_tab.h instead of y.tab.h. Test to see if this is the case. 117 1.1.1.3 mrg y_tab_nodot=false 118 1.1.1.3 mrg if test -f y_tab.c || test -f y_tab.h; then 119 1.1.1.3 mrg y_tab_nodot=true 120 1.1.1.3 mrg fi 121 1.1.1.3 mrg 122 1.1.1.3 mrg # The parser itself, the first file, is the destination of the .y.c 123 1.1.1.3 mrg # rule in the Makefile. 124 1.1.1.3 mrg parser=$1 125 1.1.1.3 mrg 126 1.1.1.3 mrg # A sed program to s/FROM/TO/g for all the FROM/TO so that, for 127 1.1.1.3 mrg # instance, we rename #include "y.tab.h" into #include "parse.h" 128 1.1.1.3 mrg # during the conversion from y.tab.c to parse.c. 129 1.1.1.3 mrg sed_fix_filenames= 130 1.1.1.3 mrg 131 1.1.1.3 mrg # Also rename header guards, as Bison 2.7 for instance uses its header 132 1.1.1.3 mrg # guard in its implementation file. 133 1.1.1.3 mrg sed_fix_header_guards= 134 1.1 mrg 135 1.1.1.3 mrg while test $# -ne 0; do 136 1.1.1.3 mrg if test x"$1" = x"--"; then 137 1.1 mrg shift 138 1.1 mrg break 139 1.1 mrg fi 140 1.1.1.3 mrg from=$1 141 1.1.1.3 mrg # Handle y_tab.c and y_tab.h output by DOS 142 1.1.1.3 mrg if $y_tab_nodot; then 143 1.1.1.3 mrg case $from in 144 1.1.1.3 mrg "y.tab.c") from=y_tab.c;; 145 1.1.1.3 mrg "y.tab.h") from=y_tab.h;; 146 1.1.1.3 mrg esac 147 1.1.1.3 mrg fi 148 1.1.1.3 mrg shift 149 1.1.1.3 mrg to=$1 150 1.1 mrg shift 151 1.1.1.3 mrg sed_fix_filenames="${sed_fix_filenames}s|"`quote_for_sed "$from"`"|$to|g;" 152 1.1.1.3 mrg sed_fix_header_guards="${sed_fix_header_guards}s|"`guard "$from"`"|"`guard "$to"`"|g;" 153 1.1 mrg done 154 1.1 mrg 155 1.1 mrg # The program to run. 156 1.1.1.3 mrg prog=$1 157 1.1 mrg shift 158 1.1 mrg # Make any relative path in $prog absolute. 159 1.1.1.3 mrg case $prog in 160 1.1 mrg [\\/]* | ?:[\\/]*) ;; 161 1.1.1.3 mrg *[\\/]*) prog=`pwd`/$prog ;; 162 1.1 mrg esac 163 1.1 mrg 164 1.1 mrg dirname=ylwrap$$ 165 1.1.1.3 mrg do_exit="cd '`pwd`' && rm -rf $dirname > /dev/null 2>&1;"' (exit $ret); exit $ret' 166 1.1.1.3 mrg trap "ret=129; $do_exit" 1 167 1.1.1.3 mrg trap "ret=130; $do_exit" 2 168 1.1.1.3 mrg trap "ret=141; $do_exit" 13 169 1.1.1.3 mrg trap "ret=143; $do_exit" 15 170 1.1 mrg mkdir $dirname || exit 1 171 1.1 mrg 172 1.1 mrg cd $dirname 173 1.1 mrg 174 1.1 mrg case $# in 175 1.1 mrg 0) "$prog" "$input" ;; 176 1.1 mrg *) "$prog" "$@" "$input" ;; 177 1.1 mrg esac 178 1.1 mrg ret=$? 179 1.1 mrg 180 1.1 mrg if test $ret -eq 0; then 181 1.1.1.3 mrg for from in * 182 1.1.1.3 mrg do 183 1.1.1.3 mrg to=`printf '%s\n' "$from" | sed "$sed_fix_filenames"` 184 1.1 mrg if test -f "$from"; then 185 1.1 mrg # If $2 is an absolute path name, then just use that, 186 1.1.1.3 mrg # otherwise prepend '../'. 187 1.1.1.3 mrg case $to in 188 1.1.1.3 mrg [\\/]* | ?:[\\/]*) target=$to;; 189 1.1.1.3 mrg *) target=../$to;; 190 1.1 mrg esac 191 1.1 mrg 192 1.1.1.3 mrg # Do not overwrite unchanged header files to avoid useless 193 1.1.1.3 mrg # recompilations. Always update the parser itself: it is the 194 1.1.1.3 mrg # destination of the .y.c rule in the Makefile. Divert the 195 1.1.1.3 mrg # output of all other files to a temporary file so we can 196 1.1.1.3 mrg # compare them to existing versions. 197 1.1.1.3 mrg if test $from != $parser; then 198 1.1.1.3 mrg realtarget=$target 199 1.1.1.3 mrg target=tmp-`printf '%s\n' "$target" | sed 's|.*[\\/]||g'` 200 1.1 mrg fi 201 1.1.1.3 mrg 202 1.1.1.3 mrg # Munge "#line" or "#" directives. Don't let the resulting 203 1.1.1.3 mrg # debug information point at an absolute srcdir. Use the real 204 1.1.1.3 mrg # output file name, not yy.lex.c for instance. Adjust the 205 1.1.1.3 mrg # include guards too. 206 1.1.1.3 mrg sed -e "/^#/!b" \ 207 1.1.1.3 mrg -e "s|$input_rx|$input_sub_rx|" \ 208 1.1.1.3 mrg -e "$sed_fix_filenames" \ 209 1.1.1.3 mrg -e "$sed_fix_header_guards" \ 210 1.1.1.3 mrg "$from" >"$target" || ret=$? 211 1.1.1.3 mrg 212 1.1.1.3 mrg # Check whether files must be updated. 213 1.1.1.3 mrg if test "$from" != "$parser"; then 214 1.1.1.3 mrg if test -f "$realtarget" && cmp -s "$realtarget" "$target"; then 215 1.1.1.3 mrg echo "$to is unchanged" 216 1.1.1.3 mrg rm -f "$target" 217 1.1.1.3 mrg else 218 1.1.1.3 mrg echo "updating $to" 219 1.1 mrg mv -f "$target" "$realtarget" 220 1.1 mrg fi 221 1.1 mrg fi 222 1.1 mrg else 223 1.1.1.3 mrg # A missing file is only an error for the parser. This is a 224 1.1.1.3 mrg # blatant hack to let us support using "yacc -d". If -d is not 225 1.1.1.3 mrg # specified, don't fail when the header file is "missing". 226 1.1.1.3 mrg if test "$from" = "$parser"; then 227 1.1 mrg ret=1 228 1.1 mrg fi 229 1.1 mrg fi 230 1.1 mrg done 231 1.1 mrg fi 232 1.1 mrg 233 1.1 mrg # Remove the directory. 234 1.1 mrg cd .. 235 1.1 mrg rm -rf $dirname 236 1.1 mrg 237 1.1 mrg exit $ret 238 1.1 mrg 239 1.1 mrg # Local Variables: 240 1.1 mrg # mode: shell-script 241 1.1 mrg # sh-indentation: 2 242 1.1.1.5 mrg # eval: (add-hook 'before-save-hook 'time-stamp) 243 1.1 mrg # time-stamp-start: "scriptversion=" 244 1.1 mrg # time-stamp-format: "%:y-%02m-%02d.%02H" 245 1.1.1.5 mrg # time-stamp-time-zone: "UTC0" 246 1.1.1.2 mrg # time-stamp-end: "; # UTC" 247 1.1 mrg # End: 248