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
12 # Wireshark - Network traffic analyzer
13 # By Gerald Combs <gerald@wireshark.org>
14 # Copyright 2007 Gerald Combs
16 # This program is free software; you can redistribute it and/or
17 # modify it under the terms of the GNU General Public License
18 # as published by the Free Software Foundation; either version 2
19 # of the License, or (at your option) any later version.
21 # This program is distributed in the hope that it will be useful,
22 # but WITHOUT ANY WARRANTY; without even the implied warranty of
23 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24 # GNU General Public License for more details.
26 # You should have received a copy of the GNU General Public License
27 # along with this program; if not, write to the Free Software
28 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
32 # Get the name of the command to run, and then shift to get the arguments.
36 echo "Usage: runlex <lex/flex command to run> [ arguments ]" 1>&2
43 # Check whether we have it.
47 echo "Neither lex nor flex was found" 1>&2
52 # Process the flags. We don't use getopt because we don't want to
53 # embed complete knowledge of what options are supported by Lex/Flex.
63 # Set the output file name.
65 outfile=`echo "$1" | sed 's/-o\(.*\)/\1/'`
70 # Add this to the list of flags.
88 ${LEX} -o"$outfile" $flags "$@"
96 # No. Exit with the failing exit status.
102 # Flex has the annoying habit of stripping all but the last component of
103 # the "-o" flag argument and using that as the place to put the output.
104 # This gets in the way of building in a directory different from the
105 # source directory. Try to work around this.
107 # Is the outfile where we think it is?
109 outfile_base=`basename "$outfile"`
110 if [ "$outfile_base" != "$outfile" -a \( ! -r "$outfile" \) -a -r "$outfile_base" ]
113 # No, it's not, but it is in the current directory. Put it
114 # where it's supposed to be.
116 mv "$outfile_base" "$outfile"
124 # OK, now let's generate a header file declaring the relevant functions
125 # defined by the .c file; if the .c file is .../foo.c, the header file
126 # will be .../foo_lex.h.
128 # This works around some other Flex suckage, wherein it doesn't declare
129 # the lex routine before defining it, causing compiler warnings.
130 # XXX - newer versions of Flex support --header-file=, to generate the
131 # appropriate header file. With those versions, we should use that option.
135 # Get the name of the prefix; scan the source files for a %option prefix
136 # line. We use the last one.
138 prefix=`sed -n 's/%option[ ][ ]*prefix="\(.*\)".*/\1/p' "$@" | tail -1`
139 if [ ! -z "$prefix" ]
141 prefixline="#define yylex ${prefix}lex"
145 # Construct the name of the header file.
147 header_file=`dirname "$outfile"`/`basename "$outfile" .c`_lex.h
150 # Spew out the declaration.
152 cat <<EOF >$header_file
153 /* This is generated by runlex.sh. Do not edit it. */
156 #define YY_DECL int yylex(void)