lac : 7c2d927f7f67970737afa04378850c0c9859688f
1: #! /bin/sh
2: # ylwrap - wrapper for lex/yacc invocations.
3:
4: scriptversion=2013-01-12.17; # UTC
5:
6: # Copyright (C) 1996-2014 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 x"$1" = x"--"; 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: dirname=ylwrap$$
165: do_exit="cd '`pwd`' && rm -rf $dirname > /dev/null 2>&1;"' (exit $ret); exit $ret'
166: trap "ret=129; $do_exit" 1
167: trap "ret=130; $do_exit" 2
168: trap "ret=141; $do_exit" 13
169: trap "ret=143; $do_exit" 15
170: mkdir $dirname || exit 1
171:
172: cd $dirname
173:
174: case $# in
175: 0) "$prog" "$input" ;;
176: *) "$prog" "$@" "$input" ;;
177: esac
178: ret=$?
179:
180: if test $ret -eq 0; then
181: for from in *
182: do
183: to=`printf '%s\n' "$from" | sed "$sed_fix_filenames"`
184: if test -f "$from"; then
185: # If $2 is an absolute path name, then just use that,
186: # otherwise prepend '../'.
187: case $to in
188: [\\/]* | ?:[\\/]*) target=$to;;
189: *) target=../$to;;
190: esac
191:
192: # Do not overwrite unchanged header files to avoid useless
193: # recompilations. Always update the parser itself: it is the
194: # destination of the .y.c rule in the Makefile. Divert the
195: # output of all other files to a temporary file so we can
196: # compare them to existing versions.
197: if test $from != $parser; then
198: realtarget=$target
199: target=tmp-`printf '%s\n' "$target" | sed 's|.*[\\/]||g'`
200: fi
201:
202: # Munge "#line" or "#" directives. Don't let the resulting
203: # debug information point at an absolute srcdir. Use the real
204: # output file name, not yy.lex.c for instance. Adjust the
205: # include guards too.
206: sed -e "/^#/!b" \
207: -e "s|$input_rx|$input_sub_rx|" \
208: -e "$sed_fix_filenames" \
209: -e "$sed_fix_header_guards" \
210: "$from" >"$target" || ret=$?
211:
212: # Check whether files must be updated.
213: if test "$from" != "$parser"; then
214: if test -f "$realtarget" && cmp -s "$realtarget" "$target"; then
215: echo "$to is unchanged"
216: rm -f "$target"
217: else
218: echo "updating $to"
219: mv -f "$target" "$realtarget"
220: fi
221: fi
222: else
223: # A missing file is only an error for the parser. This is a
224: # blatant hack to let us support using "yacc -d". If -d is not
225: # specified, don't fail when the header file is "missing".
226: if test "$from" = "$parser"; then
227: ret=1
228: fi
229: fi
230: done
231: fi
232:
233: # Remove the directory.
234: cd ..
235: rm -rf $dirname
236:
237: exit $ret
238:
239: # Local Variables:
240: # mode: shell-script
241: # sh-indentation: 2
242: # eval: (add-hook 'write-file-hooks 'time-stamp)
243: # time-stamp-start: "scriptversion="
244: # time-stamp-format: "%:y-%02m-%02d.%02H"
245: # time-stamp-time-zone: "UTC"
246: # time-stamp-end: "; # UTC"
247: # End:
Generated by git2html.