Drop main() prototype. Syncs with NetBSD-8
[minix.git] / external / bsd / libpcap / dist / runlex.sh
blob06b8bd4508278384f37baa2b0945f30c40511d64
1 #! /bin/sh
4 # runlex.sh
5 # Script to run Lex/Flex.
6 # First argument is the (quoted) name of the command; if it's null, that
7 # means that neither Flex nor Lex was found, so we report an error and
8 # quit.
12 # Get the name of the command to run, and then shift to get the arguments.
14 if [ $# -eq 0 ]
15 then
16 echo "Usage: runlex <lex/flex command to run> [ arguments ]" 1>&2
17 exit 1
19 LEX="$1"
20 shift
23 # Check whether we have Lex or Flex.
25 if [ -z "${LEX}" ]
26 then
27 echo "Neither lex nor flex was found" 1>&2
28 exit 1
32 # Process the flags. We don't use getopt because we don't want to
33 # embed complete knowledge of what options are supported by Lex/Flex.
35 flags=""
36 outfile=lex.yy.c
37 while [ $# -ne 0 ]
39 case "$1" in
41 -o*)
43 # Set the output file name.
45 outfile=`echo "$1" | sed 's/-o\(.*\)/\1/'`
48 -*)
50 # Add this to the list of flags.
52 flags="$flags $1"
55 --|*)
57 # End of flags.
59 break
61 esac
62 shift
63 done
66 # Is it Lex, or is it Flex?
68 if [ "${LEX}" = flex ]
69 then
71 # It's Flex.
73 have_flex=yes
76 # Does it support the --noFUNCTION options? If so, we pass
77 # --nounput, as at least some versions that support those
78 # options don't support disabling yyunput by defining
79 # YY_NO_UNPUT.
81 if flex --help | egrep noFUNCTION >/dev/null
82 then
83 flags="$flags --nounput"
86 # Does it support -R, for generating reentrant scanners?
87 # If so, we're not currently using that feature, but
88 # it'll generate some unused functions anyway - and there
89 # won't be any header file declaring them, so there'll be
90 # defined-but-not-declared warnings. Therefore, we use
91 # --noFUNCTION options to suppress generating those
92 # functions.
94 if flex --help | egrep reentrant >/dev/null
95 then
96 flags="$flags --noyyget_lineno --noyyget_in --noyyget_out --noyyget_leng --noyyget_text --noyyset_lineno --noyyset_in --noyyset_out"
99 else
101 # It's Lex.
103 have_flex=no
107 # OK, run it.
108 # If it's lex, it doesn't support -o, so we just write to
109 # lex.yy.c and, if it succeeds, rename it to the right name,
110 # otherwise we remove lex.yy.c.
111 # If it's flex, it supports -o, so we use that - flex with -P doesn't
112 # write to lex.yy.c, it writes to a lex.{prefix from -P}.c.
114 if [ $have_flex = yes ]
115 then
116 ${LEX} $flags -o"$outfile" "$@"
119 # Did it succeed?
121 status=$?
122 if [ $status -ne 0 ]
123 then
125 # No. Exit with the failing exit status.
127 exit $status
131 # Flex has the annoying habit of stripping all but the last
132 # component of the "-o" flag argument and using that as the
133 # place to put the output. This gets in the way of building
134 # in a directory different from the source directory. Try
135 # to work around this.
137 # Is the outfile where we think it is?
139 outfile_base=`basename "$outfile"`
140 if [ "$outfile_base" != "$outfile" -a \( ! -r "$outfile" \) -a -r "$outfile_base" ]
141 then
143 # No, it's not, but it is in the current directory. Put it
144 # where it's supposed to be.
146 mv "$outfile_base" "$outfile"
149 # Did that succeed?
151 status=$?
152 if [ $status -ne 0 ]
153 then
155 # No. Exit with the failing exit status.
157 exit $status
160 else
161 ${LEX} $flags "$@"
164 # Did it succeed?
166 status=$?
167 if [ $status -ne 0 ]
168 then
170 # No. Get rid of any lex.yy.c file we generated, and
171 # exit with the failing exit status.
173 rm -f lex.yy.c
174 exit $status
178 # OK, rename lex.yy.c to the right output file.
180 mv lex.yy.c "$outfile"
183 # Did that succeed?
185 status=$?
186 if [ $status -ne 0 ]
187 then
189 # No. Get rid of any lex.yy.c file we generated, and
190 # exit with the failing exit status.
192 rm -f lex.yy.c
193 exit $status
198 # OK, now let's generate a header file declaring the relevant functions
199 # defined by the .c file; if the .c file is .../foo.c, the header file
200 # will be .../foo.h.
202 # This works around some other Flex suckage, wherein it doesn't declare
203 # the lex routine before defining it, causing compiler warnings.
204 # XXX - newer versions of Flex support --header-file=, to generate the
205 # appropriate header file. With those versions, we should use that option.
209 # Get the name of the prefix; scan the source files for a %option prefix
210 # line. We use the last one.
212 prefix=`sed -n 's/%option[ ][ ]*prefix="\(.*\)".*/\1/p' "$@" | tail -1`
213 if [ ! -z "$prefix" ]
214 then
215 prefixline="#define yylex ${prefix}lex"
219 # Construct the name of the header file.
221 header_file=`dirname "$outfile"`/`basename "$outfile" .c`.h
224 # Spew out the declaration.
226 cat <<EOF >$header_file
227 /* This is generated by runlex.sh. Do not edit it. */
228 $prefixline
229 #ifndef YY_DECL
230 #define YY_DECL int yylex(void)
231 #endif
232 YY_DECL;