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