xref: /aosp_15_r20/external/libpcap/scanner.l (revision 8b26181f966a6af5cf6981a6f474313de533bb28)
1*8b26181fSAndroid Build Coastguard Worker %top {
2*8b26181fSAndroid Build Coastguard Worker /* Must come first for _LARGE_FILE_API on AIX. */
3*8b26181fSAndroid Build Coastguard Worker #ifdef HAVE_CONFIG_H
4*8b26181fSAndroid Build Coastguard Worker #include <config.h>
5*8b26181fSAndroid Build Coastguard Worker #endif
6*8b26181fSAndroid Build Coastguard Worker 
7*8b26181fSAndroid Build Coastguard Worker /*
8*8b26181fSAndroid Build Coastguard Worker  * Must come first to avoid warnings on Windows.
9*8b26181fSAndroid Build Coastguard Worker  *
10*8b26181fSAndroid Build Coastguard Worker  * Flex-generated scanners may only include <inttypes.h> if __STDC_VERSION__
11*8b26181fSAndroid Build Coastguard Worker  * is defined with a value >= 199901, meaning "full C99", and MSVC may not
12*8b26181fSAndroid Build Coastguard Worker  * define it with that value, because it isn't 100% C99-compliant, even
13*8b26181fSAndroid Build Coastguard Worker  * though it has an <inttypes.h> capable of defining everything the Flex
14*8b26181fSAndroid Build Coastguard Worker  * scanner needs.
15*8b26181fSAndroid Build Coastguard Worker  *
16*8b26181fSAndroid Build Coastguard Worker  * We, however, will include it if we know we have an MSVC version that has
17*8b26181fSAndroid Build Coastguard Worker  * it; this means that we may define the INTn_MAX and UINTn_MAX values in
18*8b26181fSAndroid Build Coastguard Worker  * scanner.c, and then include <stdint.h>, which may define them differently
19*8b26181fSAndroid Build Coastguard Worker  * (same value, but different string of characters), causing compiler warnings.
20*8b26181fSAndroid Build Coastguard Worker  *
21*8b26181fSAndroid Build Coastguard Worker  * If we include it here, and they're defined, that'll prevent scanner.c
22*8b26181fSAndroid Build Coastguard Worker  * from defining them.  So we include <pcap/pcap-inttypes.h>, to get
23*8b26181fSAndroid Build Coastguard Worker  * <inttypes.h> if we have it.
24*8b26181fSAndroid Build Coastguard Worker  */
25*8b26181fSAndroid Build Coastguard Worker #include <pcap/pcap-inttypes.h>
26*8b26181fSAndroid Build Coastguard Worker 
27*8b26181fSAndroid Build Coastguard Worker /*
28*8b26181fSAndroid Build Coastguard Worker  * grammar.h requires gencode.h and sometimes breaks in a polluted namespace
29*8b26181fSAndroid Build Coastguard Worker  * (see ftmacros.h), so include it early.
30*8b26181fSAndroid Build Coastguard Worker  */
31*8b26181fSAndroid Build Coastguard Worker #include "gencode.h"
32*8b26181fSAndroid Build Coastguard Worker #include "grammar.h"
33*8b26181fSAndroid Build Coastguard Worker 
34*8b26181fSAndroid Build Coastguard Worker #include "diag-control.h"
35*8b26181fSAndroid Build Coastguard Worker }
36*8b26181fSAndroid Build Coastguard Worker 
37*8b26181fSAndroid Build Coastguard Worker /*
38*8b26181fSAndroid Build Coastguard Worker  * We want a reentrant scanner.
39*8b26181fSAndroid Build Coastguard Worker  */
40*8b26181fSAndroid Build Coastguard Worker %option reentrant
41*8b26181fSAndroid Build Coastguard Worker 
42*8b26181fSAndroid Build Coastguard Worker /*
43*8b26181fSAndroid Build Coastguard Worker  * And we need to pass the compiler state to the scanner.
44*8b26181fSAndroid Build Coastguard Worker  */
45*8b26181fSAndroid Build Coastguard Worker %option extra-type="compiler_state_t *"
46*8b26181fSAndroid Build Coastguard Worker 
47*8b26181fSAndroid Build Coastguard Worker /*
48*8b26181fSAndroid Build Coastguard Worker  * We don't use input, so don't generate code for it.
49*8b26181fSAndroid Build Coastguard Worker  */
50*8b26181fSAndroid Build Coastguard Worker %option noinput
51*8b26181fSAndroid Build Coastguard Worker 
52*8b26181fSAndroid Build Coastguard Worker /*
53*8b26181fSAndroid Build Coastguard Worker  * We don't use unput, so don't generate code for it.
54*8b26181fSAndroid Build Coastguard Worker  */
55*8b26181fSAndroid Build Coastguard Worker %option nounput
56*8b26181fSAndroid Build Coastguard Worker 
57*8b26181fSAndroid Build Coastguard Worker /*
58*8b26181fSAndroid Build Coastguard Worker  * We don't read from the terminal.
59*8b26181fSAndroid Build Coastguard Worker  */
60*8b26181fSAndroid Build Coastguard Worker %option never-interactive
61*8b26181fSAndroid Build Coastguard Worker 
62*8b26181fSAndroid Build Coastguard Worker /*
63*8b26181fSAndroid Build Coastguard Worker  * We want to stop processing when we get to the end of the input.
64*8b26181fSAndroid Build Coastguard Worker  */
65*8b26181fSAndroid Build Coastguard Worker %option noyywrap
66*8b26181fSAndroid Build Coastguard Worker 
67*8b26181fSAndroid Build Coastguard Worker /*
68*8b26181fSAndroid Build Coastguard Worker  * We want to generate code that can be used by a reentrant parser
69*8b26181fSAndroid Build Coastguard Worker  * generated by Bison or Berkeley YACC.
70*8b26181fSAndroid Build Coastguard Worker  */
71*8b26181fSAndroid Build Coastguard Worker %option bison-bridge
72*8b26181fSAndroid Build Coastguard Worker 
73*8b26181fSAndroid Build Coastguard Worker %{
74*8b26181fSAndroid Build Coastguard Worker /*
75*8b26181fSAndroid Build Coastguard Worker  * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997
76*8b26181fSAndroid Build Coastguard Worker  *	The Regents of the University of California.  All rights reserved.
77*8b26181fSAndroid Build Coastguard Worker  *
78*8b26181fSAndroid Build Coastguard Worker  * Redistribution and use in source and binary forms, with or without
79*8b26181fSAndroid Build Coastguard Worker  * modification, are permitted provided that: (1) source code distributions
80*8b26181fSAndroid Build Coastguard Worker  * retain the above copyright notice and this paragraph in its entirety, (2)
81*8b26181fSAndroid Build Coastguard Worker  * distributions including binary code include the above copyright notice and
82*8b26181fSAndroid Build Coastguard Worker  * this paragraph in its entirety in the documentation or other materials
83*8b26181fSAndroid Build Coastguard Worker  * provided with the distribution, and (3) all advertising materials mentioning
84*8b26181fSAndroid Build Coastguard Worker  * features or use of this software display the following acknowledgement:
85*8b26181fSAndroid Build Coastguard Worker  * ``This product includes software developed by the University of California,
86*8b26181fSAndroid Build Coastguard Worker  * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
87*8b26181fSAndroid Build Coastguard Worker  * the University nor the names of its contributors may be used to endorse
88*8b26181fSAndroid Build Coastguard Worker  * or promote products derived from this software without specific prior
89*8b26181fSAndroid Build Coastguard Worker  * written permission.
90*8b26181fSAndroid Build Coastguard Worker  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
91*8b26181fSAndroid Build Coastguard Worker  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
92*8b26181fSAndroid Build Coastguard Worker  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
93*8b26181fSAndroid Build Coastguard Worker  */
94*8b26181fSAndroid Build Coastguard Worker 
95*8b26181fSAndroid Build Coastguard Worker #include <string.h>
96*8b26181fSAndroid Build Coastguard Worker 
97*8b26181fSAndroid Build Coastguard Worker #include "pcap-int.h"
98*8b26181fSAndroid Build Coastguard Worker 
99*8b26181fSAndroid Build Coastguard Worker /*
100*8b26181fSAndroid Build Coastguard Worker  * Earlier versions of Flex don't declare these, so we declare them
101*8b26181fSAndroid Build Coastguard Worker  * ourselves to squelch warnings.
102*8b26181fSAndroid Build Coastguard Worker  */
103*8b26181fSAndroid Build Coastguard Worker int pcap_get_column(yyscan_t);
104*8b26181fSAndroid Build Coastguard Worker void pcap_set_column(int, yyscan_t);
105*8b26181fSAndroid Build Coastguard Worker 
106*8b26181fSAndroid Build Coastguard Worker #ifdef INET6
107*8b26181fSAndroid Build Coastguard Worker 
108*8b26181fSAndroid Build Coastguard Worker #ifdef _WIN32
109*8b26181fSAndroid Build Coastguard Worker #include <winsock2.h>
110*8b26181fSAndroid Build Coastguard Worker #include <ws2tcpip.h>
111*8b26181fSAndroid Build Coastguard Worker /*
112*8b26181fSAndroid Build Coastguard Worker  * To quote the MSDN page for getaddrinfo() at
113*8b26181fSAndroid Build Coastguard Worker  *
114*8b26181fSAndroid Build Coastguard Worker  *    https://msdn.microsoft.com/en-us/library/windows/desktop/ms738520(v=vs.85).aspx
115*8b26181fSAndroid Build Coastguard Worker  *
116*8b26181fSAndroid Build Coastguard Worker  * "Support for getaddrinfo on Windows 2000 and older versions
117*8b26181fSAndroid Build Coastguard Worker  * The getaddrinfo function was added to the Ws2_32.dll on Windows XP and
118*8b26181fSAndroid Build Coastguard Worker  * later. To execute an application that uses this function on earlier
119*8b26181fSAndroid Build Coastguard Worker  * versions of Windows, then you need to include the Ws2tcpip.h and
120*8b26181fSAndroid Build Coastguard Worker  * Wspiapi.h files. When the Wspiapi.h include file is added, the
121*8b26181fSAndroid Build Coastguard Worker  * getaddrinfo function is defined to the WspiapiGetAddrInfo inline
122*8b26181fSAndroid Build Coastguard Worker  * function in the Wspiapi.h file. At runtime, the WspiapiGetAddrInfo
123*8b26181fSAndroid Build Coastguard Worker  * function is implemented in such a way that if the Ws2_32.dll or the
124*8b26181fSAndroid Build Coastguard Worker  * Wship6.dll (the file containing getaddrinfo in the IPv6 Technology
125*8b26181fSAndroid Build Coastguard Worker  * Preview for Windows 2000) does not include getaddrinfo, then a
126*8b26181fSAndroid Build Coastguard Worker  * version of getaddrinfo is implemented inline based on code in the
127*8b26181fSAndroid Build Coastguard Worker  * Wspiapi.h header file. This inline code will be used on older Windows
128*8b26181fSAndroid Build Coastguard Worker  * platforms that do not natively support the getaddrinfo function."
129*8b26181fSAndroid Build Coastguard Worker  *
130*8b26181fSAndroid Build Coastguard Worker  * We use getaddrinfo(), so we include Wspiapi.h here.
131*8b26181fSAndroid Build Coastguard Worker  */
132*8b26181fSAndroid Build Coastguard Worker #include <wspiapi.h>
133*8b26181fSAndroid Build Coastguard Worker #else /* _WIN32 */
134*8b26181fSAndroid Build Coastguard Worker #include <sys/socket.h>	/* for "struct sockaddr" in "struct addrinfo" */
135*8b26181fSAndroid Build Coastguard Worker #include <netdb.h>	/* for "struct addrinfo" */
136*8b26181fSAndroid Build Coastguard Worker #endif /* _WIN32 */
137*8b26181fSAndroid Build Coastguard Worker 
138*8b26181fSAndroid Build Coastguard Worker /* Workaround for AIX 4.3 */
139*8b26181fSAndroid Build Coastguard Worker #if !defined(AI_NUMERICHOST)
140*8b26181fSAndroid Build Coastguard Worker #define AI_NUMERICHOST 0x04
141*8b26181fSAndroid Build Coastguard Worker #endif
142*8b26181fSAndroid Build Coastguard Worker 
143*8b26181fSAndroid Build Coastguard Worker #endif /*INET6*/
144*8b26181fSAndroid Build Coastguard Worker 
145*8b26181fSAndroid Build Coastguard Worker #include <pcap/namedb.h>
146*8b26181fSAndroid Build Coastguard Worker #include "grammar.h"
147*8b26181fSAndroid Build Coastguard Worker 
148*8b26181fSAndroid Build Coastguard Worker #ifdef HAVE_OS_PROTO_H
149*8b26181fSAndroid Build Coastguard Worker #include "os-proto.h"
150*8b26181fSAndroid Build Coastguard Worker #endif
151*8b26181fSAndroid Build Coastguard Worker 
152*8b26181fSAndroid Build Coastguard Worker static int stou(char *, YYSTYPE *, compiler_state_t *);
153*8b26181fSAndroid Build Coastguard Worker 
154*8b26181fSAndroid Build Coastguard Worker /*
155*8b26181fSAndroid Build Coastguard Worker  * Disable diagnostics in the code generated by Flex.
156*8b26181fSAndroid Build Coastguard Worker  */
157*8b26181fSAndroid Build Coastguard Worker DIAG_OFF_FLEX
158*8b26181fSAndroid Build Coastguard Worker 
159*8b26181fSAndroid Build Coastguard Worker %}
160*8b26181fSAndroid Build Coastguard Worker 
161*8b26181fSAndroid Build Coastguard Worker N		([0-9]+|(0X|0x)[0-9A-Fa-f]+)
162*8b26181fSAndroid Build Coastguard Worker B		([0-9A-Fa-f][0-9A-Fa-f]?)
163*8b26181fSAndroid Build Coastguard Worker B2		([0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f])
164*8b26181fSAndroid Build Coastguard Worker W		([0-9A-Fa-f][0-9A-Fa-f]?[0-9A-Fa-f]?[0-9A-Fa-f]?)
165*8b26181fSAndroid Build Coastguard Worker 
166*8b26181fSAndroid Build Coastguard Worker %a 18400
167*8b26181fSAndroid Build Coastguard Worker %o 21500
168*8b26181fSAndroid Build Coastguard Worker %e 7600
169*8b26181fSAndroid Build Coastguard Worker %k 4550
170*8b26181fSAndroid Build Coastguard Worker %p 27600
171*8b26181fSAndroid Build Coastguard Worker %n 2000
172*8b26181fSAndroid Build Coastguard Worker 
173*8b26181fSAndroid Build Coastguard Worker V680		{W}:{W}:{W}:{W}:{W}:{W}:{W}:{W}
174*8b26181fSAndroid Build Coastguard Worker 
175*8b26181fSAndroid Build Coastguard Worker V670		::{W}:{W}:{W}:{W}:{W}:{W}:{W}
176*8b26181fSAndroid Build Coastguard Worker V671		{W}::{W}:{W}:{W}:{W}:{W}:{W}
177*8b26181fSAndroid Build Coastguard Worker V672		{W}:{W}::{W}:{W}:{W}:{W}:{W}
178*8b26181fSAndroid Build Coastguard Worker V673		{W}:{W}:{W}::{W}:{W}:{W}:{W}
179*8b26181fSAndroid Build Coastguard Worker V674		{W}:{W}:{W}:{W}::{W}:{W}:{W}
180*8b26181fSAndroid Build Coastguard Worker V675		{W}:{W}:{W}:{W}:{W}::{W}:{W}
181*8b26181fSAndroid Build Coastguard Worker V676		{W}:{W}:{W}:{W}:{W}:{W}::{W}
182*8b26181fSAndroid Build Coastguard Worker V677		{W}:{W}:{W}:{W}:{W}:{W}:{W}::
183*8b26181fSAndroid Build Coastguard Worker 
184*8b26181fSAndroid Build Coastguard Worker V660		::{W}:{W}:{W}:{W}:{W}:{W}
185*8b26181fSAndroid Build Coastguard Worker V661		{W}::{W}:{W}:{W}:{W}:{W}
186*8b26181fSAndroid Build Coastguard Worker V662		{W}:{W}::{W}:{W}:{W}:{W}
187*8b26181fSAndroid Build Coastguard Worker V663		{W}:{W}:{W}::{W}:{W}:{W}
188*8b26181fSAndroid Build Coastguard Worker V664		{W}:{W}:{W}:{W}::{W}:{W}
189*8b26181fSAndroid Build Coastguard Worker V665		{W}:{W}:{W}:{W}:{W}::{W}
190*8b26181fSAndroid Build Coastguard Worker V666		{W}:{W}:{W}:{W}:{W}:{W}::
191*8b26181fSAndroid Build Coastguard Worker 
192*8b26181fSAndroid Build Coastguard Worker V650		::{W}:{W}:{W}:{W}:{W}
193*8b26181fSAndroid Build Coastguard Worker V651		{W}::{W}:{W}:{W}:{W}
194*8b26181fSAndroid Build Coastguard Worker V652		{W}:{W}::{W}:{W}:{W}
195*8b26181fSAndroid Build Coastguard Worker V653		{W}:{W}:{W}::{W}:{W}
196*8b26181fSAndroid Build Coastguard Worker V654		{W}:{W}:{W}:{W}::{W}
197*8b26181fSAndroid Build Coastguard Worker V655		{W}:{W}:{W}:{W}:{W}::
198*8b26181fSAndroid Build Coastguard Worker 
199*8b26181fSAndroid Build Coastguard Worker V640		::{W}:{W}:{W}:{W}
200*8b26181fSAndroid Build Coastguard Worker V641		{W}::{W}:{W}:{W}
201*8b26181fSAndroid Build Coastguard Worker V642		{W}:{W}::{W}:{W}
202*8b26181fSAndroid Build Coastguard Worker V643		{W}:{W}:{W}::{W}
203*8b26181fSAndroid Build Coastguard Worker V644		{W}:{W}:{W}:{W}::
204*8b26181fSAndroid Build Coastguard Worker 
205*8b26181fSAndroid Build Coastguard Worker V630		::{W}:{W}:{W}
206*8b26181fSAndroid Build Coastguard Worker V631		{W}::{W}:{W}
207*8b26181fSAndroid Build Coastguard Worker V632		{W}:{W}::{W}
208*8b26181fSAndroid Build Coastguard Worker V633		{W}:{W}:{W}::
209*8b26181fSAndroid Build Coastguard Worker 
210*8b26181fSAndroid Build Coastguard Worker V620		::{W}:{W}
211*8b26181fSAndroid Build Coastguard Worker V621		{W}::{W}
212*8b26181fSAndroid Build Coastguard Worker V622		{W}:{W}::
213*8b26181fSAndroid Build Coastguard Worker 
214*8b26181fSAndroid Build Coastguard Worker V610		::{W}
215*8b26181fSAndroid Build Coastguard Worker V611		{W}::
216*8b26181fSAndroid Build Coastguard Worker 
217*8b26181fSAndroid Build Coastguard Worker V600		::
218*8b26181fSAndroid Build Coastguard Worker 
219*8b26181fSAndroid Build Coastguard Worker V6604		{W}:{W}:{W}:{W}:{W}:{W}:{N}\.{N}\.{N}\.{N}
220*8b26181fSAndroid Build Coastguard Worker 
221*8b26181fSAndroid Build Coastguard Worker V6504		::{W}:{W}:{W}:{W}:{W}:{N}\.{N}\.{N}\.{N}
222*8b26181fSAndroid Build Coastguard Worker V6514		{W}::{W}:{W}:{W}:{W}:{N}\.{N}\.{N}\.{N}
223*8b26181fSAndroid Build Coastguard Worker V6524		{W}:{W}::{W}:{W}:{W}:{N}\.{N}\.{N}\.{N}
224*8b26181fSAndroid Build Coastguard Worker V6534		{W}:{W}:{W}::{W}:{W}:{N}\.{N}\.{N}\.{N}
225*8b26181fSAndroid Build Coastguard Worker V6544		{W}:{W}:{W}:{W}::{W}:{N}\.{N}\.{N}\.{N}
226*8b26181fSAndroid Build Coastguard Worker V6554		{W}:{W}:{W}:{W}:{W}::{N}\.{N}\.{N}\.{N}
227*8b26181fSAndroid Build Coastguard Worker 
228*8b26181fSAndroid Build Coastguard Worker V6404		::{W}:{W}:{W}:{W}:{N}\.{N}\.{N}\.{N}
229*8b26181fSAndroid Build Coastguard Worker V6414		{W}::{W}:{W}:{W}:{N}\.{N}\.{N}\.{N}
230*8b26181fSAndroid Build Coastguard Worker V6424		{W}:{W}::{W}:{W}:{N}\.{N}\.{N}\.{N}
231*8b26181fSAndroid Build Coastguard Worker V6434		{W}:{W}:{W}::{W}:{N}\.{N}\.{N}\.{N}
232*8b26181fSAndroid Build Coastguard Worker V6444		{W}:{W}:{W}:{W}::{N}\.{N}\.{N}\.{N}
233*8b26181fSAndroid Build Coastguard Worker 
234*8b26181fSAndroid Build Coastguard Worker V6304		::{W}:{W}:{W}:{N}\.{N}\.{N}\.{N}
235*8b26181fSAndroid Build Coastguard Worker V6314		{W}::{W}:{W}:{N}\.{N}\.{N}\.{N}
236*8b26181fSAndroid Build Coastguard Worker V6324		{W}:{W}::{W}:{N}\.{N}\.{N}\.{N}
237*8b26181fSAndroid Build Coastguard Worker V6334		{W}:{W}:{W}::{N}\.{N}\.{N}\.{N}
238*8b26181fSAndroid Build Coastguard Worker 
239*8b26181fSAndroid Build Coastguard Worker V6204		::{W}:{W}:{N}\.{N}\.{N}\.{N}
240*8b26181fSAndroid Build Coastguard Worker V6214		{W}::{W}:{N}\.{N}\.{N}\.{N}
241*8b26181fSAndroid Build Coastguard Worker V6224		{W}:{W}::{N}\.{N}\.{N}\.{N}
242*8b26181fSAndroid Build Coastguard Worker 
243*8b26181fSAndroid Build Coastguard Worker V6104		::{W}:{N}\.{N}\.{N}\.{N}
244*8b26181fSAndroid Build Coastguard Worker V6114		{W}::{N}\.{N}\.{N}\.{N}
245*8b26181fSAndroid Build Coastguard Worker 
246*8b26181fSAndroid Build Coastguard Worker V6004		::{N}\.{N}\.{N}\.{N}
247*8b26181fSAndroid Build Coastguard Worker 
248*8b26181fSAndroid Build Coastguard Worker 
249*8b26181fSAndroid Build Coastguard Worker V6		({V680}|{V670}|{V671}|{V672}|{V673}|{V674}|{V675}|{V676}|{V677}|{V660}|{V661}|{V662}|{V663}|{V664}|{V665}|{V666}|{V650}|{V651}|{V652}|{V653}|{V654}|{V655}|{V640}|{V641}|{V642}|{V643}|{V644}|{V630}|{V631}|{V632}|{V633}|{V620}|{V621}|{V622}|{V610}|{V611}|{V600}|{V6604}|{V6504}|{V6514}|{V6524}|{V6534}|{V6544}|{V6554}|{V6404}|{V6414}|{V6424}|{V6434}|{V6444}|{V6304}|{V6314}|{V6324}|{V6334}|{V6204}|{V6214}|{V6224}|{V6104}|{V6114}|{V6004})
250*8b26181fSAndroid Build Coastguard Worker 
251*8b26181fSAndroid Build Coastguard Worker MAC		({B}:{B}:{B}:{B}:{B}:{B}|{B}\-{B}\-{B}\-{B}\-{B}\-{B}|{B}\.{B}\.{B}\.{B}\.{B}\.{B}|{B2}\.{B2}\.{B2}|{B2}{3})
252*8b26181fSAndroid Build Coastguard Worker 
253*8b26181fSAndroid Build Coastguard Worker 
254*8b26181fSAndroid Build Coastguard Worker 
255*8b26181fSAndroid Build Coastguard Worker %%
256*8b26181fSAndroid Build Coastguard Worker dst		return DST;
257*8b26181fSAndroid Build Coastguard Worker src		return SRC;
258*8b26181fSAndroid Build Coastguard Worker 
259*8b26181fSAndroid Build Coastguard Worker link|ether|ppp|slip  return LINK;
260*8b26181fSAndroid Build Coastguard Worker fddi|tr|wlan	return LINK;
261*8b26181fSAndroid Build Coastguard Worker arp		return ARP;
262*8b26181fSAndroid Build Coastguard Worker rarp		return RARP;
263*8b26181fSAndroid Build Coastguard Worker ip		return IP;
264*8b26181fSAndroid Build Coastguard Worker sctp		return SCTP;
265*8b26181fSAndroid Build Coastguard Worker tcp		return TCP;
266*8b26181fSAndroid Build Coastguard Worker udp		return UDP;
267*8b26181fSAndroid Build Coastguard Worker icmp		return ICMP;
268*8b26181fSAndroid Build Coastguard Worker igmp		return IGMP;
269*8b26181fSAndroid Build Coastguard Worker igrp		return IGRP;
270*8b26181fSAndroid Build Coastguard Worker pim		return PIM;
271*8b26181fSAndroid Build Coastguard Worker vrrp		return VRRP;
272*8b26181fSAndroid Build Coastguard Worker carp		return CARP;
273*8b26181fSAndroid Build Coastguard Worker radio		return RADIO;
274*8b26181fSAndroid Build Coastguard Worker 
275*8b26181fSAndroid Build Coastguard Worker ip6		return IPV6;
276*8b26181fSAndroid Build Coastguard Worker icmp6		return ICMPV6;
277*8b26181fSAndroid Build Coastguard Worker ah		return AH;
278*8b26181fSAndroid Build Coastguard Worker esp		return ESP;
279*8b26181fSAndroid Build Coastguard Worker 
280*8b26181fSAndroid Build Coastguard Worker atalk		return ATALK;
281*8b26181fSAndroid Build Coastguard Worker aarp		return AARP;
282*8b26181fSAndroid Build Coastguard Worker decnet		return DECNET;
283*8b26181fSAndroid Build Coastguard Worker lat		return LAT;
284*8b26181fSAndroid Build Coastguard Worker sca		return SCA;
285*8b26181fSAndroid Build Coastguard Worker moprc		return MOPRC;
286*8b26181fSAndroid Build Coastguard Worker mopdl		return MOPDL;
287*8b26181fSAndroid Build Coastguard Worker 
288*8b26181fSAndroid Build Coastguard Worker iso		return ISO;
289*8b26181fSAndroid Build Coastguard Worker esis		return ESIS;
290*8b26181fSAndroid Build Coastguard Worker es-is		return ESIS;
291*8b26181fSAndroid Build Coastguard Worker isis		return ISIS;
292*8b26181fSAndroid Build Coastguard Worker is-is		return ISIS;
293*8b26181fSAndroid Build Coastguard Worker l1              return L1;
294*8b26181fSAndroid Build Coastguard Worker l2              return L2;
295*8b26181fSAndroid Build Coastguard Worker iih             return IIH;
296*8b26181fSAndroid Build Coastguard Worker lsp             return LSP;
297*8b26181fSAndroid Build Coastguard Worker snp             return SNP;
298*8b26181fSAndroid Build Coastguard Worker csnp            return CSNP;
299*8b26181fSAndroid Build Coastguard Worker psnp            return PSNP;
300*8b26181fSAndroid Build Coastguard Worker 
301*8b26181fSAndroid Build Coastguard Worker clnp		return CLNP;
302*8b26181fSAndroid Build Coastguard Worker 
303*8b26181fSAndroid Build Coastguard Worker stp		return STP;
304*8b26181fSAndroid Build Coastguard Worker 
305*8b26181fSAndroid Build Coastguard Worker ipx		return IPX;
306*8b26181fSAndroid Build Coastguard Worker 
307*8b26181fSAndroid Build Coastguard Worker netbeui		return NETBEUI;
308*8b26181fSAndroid Build Coastguard Worker 
309*8b26181fSAndroid Build Coastguard Worker host		return HOST;
310*8b26181fSAndroid Build Coastguard Worker net		return NET;
311*8b26181fSAndroid Build Coastguard Worker mask		return NETMASK;
312*8b26181fSAndroid Build Coastguard Worker port		return PORT;
313*8b26181fSAndroid Build Coastguard Worker portrange	return PORTRANGE;
314*8b26181fSAndroid Build Coastguard Worker proto		return PROTO;
315*8b26181fSAndroid Build Coastguard Worker protochain	return PROTOCHAIN;
316*8b26181fSAndroid Build Coastguard Worker 
317*8b26181fSAndroid Build Coastguard Worker gateway		return GATEWAY;
318*8b26181fSAndroid Build Coastguard Worker 
319*8b26181fSAndroid Build Coastguard Worker type		return TYPE;
320*8b26181fSAndroid Build Coastguard Worker subtype		return SUBTYPE;
321*8b26181fSAndroid Build Coastguard Worker direction|dir	return DIR;
322*8b26181fSAndroid Build Coastguard Worker address1|addr1	return ADDR1;
323*8b26181fSAndroid Build Coastguard Worker address2|addr2	return ADDR2;
324*8b26181fSAndroid Build Coastguard Worker address3|addr3	return ADDR3;
325*8b26181fSAndroid Build Coastguard Worker address4|addr4	return ADDR4;
326*8b26181fSAndroid Build Coastguard Worker ra		return RA;
327*8b26181fSAndroid Build Coastguard Worker ta		return TA;
328*8b26181fSAndroid Build Coastguard Worker 
329*8b26181fSAndroid Build Coastguard Worker less		return LESS;
330*8b26181fSAndroid Build Coastguard Worker greater		return GREATER;
331*8b26181fSAndroid Build Coastguard Worker byte		return CBYTE;
332*8b26181fSAndroid Build Coastguard Worker broadcast	return TK_BROADCAST;
333*8b26181fSAndroid Build Coastguard Worker multicast	return TK_MULTICAST;
334*8b26181fSAndroid Build Coastguard Worker 
335*8b26181fSAndroid Build Coastguard Worker and|"&&"	return AND;
336*8b26181fSAndroid Build Coastguard Worker or|"||"		return OR;
337*8b26181fSAndroid Build Coastguard Worker not		return '!';
338*8b26181fSAndroid Build Coastguard Worker 
339*8b26181fSAndroid Build Coastguard Worker len|length	return LEN;
340*8b26181fSAndroid Build Coastguard Worker inbound		return INBOUND;
341*8b26181fSAndroid Build Coastguard Worker outbound	return OUTBOUND;
342*8b26181fSAndroid Build Coastguard Worker 
343*8b26181fSAndroid Build Coastguard Worker ifindex		return IFINDEX;
344*8b26181fSAndroid Build Coastguard Worker 
345*8b26181fSAndroid Build Coastguard Worker vlan		return VLAN;
346*8b26181fSAndroid Build Coastguard Worker mpls		return MPLS;
347*8b26181fSAndroid Build Coastguard Worker pppoed		return PPPOED;
348*8b26181fSAndroid Build Coastguard Worker pppoes		return PPPOES;
349*8b26181fSAndroid Build Coastguard Worker geneve		return GENEVE;
350*8b26181fSAndroid Build Coastguard Worker 
351*8b26181fSAndroid Build Coastguard Worker lane		return LANE;
352*8b26181fSAndroid Build Coastguard Worker llc		return LLC;
353*8b26181fSAndroid Build Coastguard Worker metac		return METAC;
354*8b26181fSAndroid Build Coastguard Worker bcc		return BCC;
355*8b26181fSAndroid Build Coastguard Worker oam		return OAM;
356*8b26181fSAndroid Build Coastguard Worker oamf4		return OAMF4;
357*8b26181fSAndroid Build Coastguard Worker oamf4ec		return OAMF4EC;
358*8b26181fSAndroid Build Coastguard Worker oamf4sc		return OAMF4SC;
359*8b26181fSAndroid Build Coastguard Worker sc		return SC;
360*8b26181fSAndroid Build Coastguard Worker ilmic		return ILMIC;
361*8b26181fSAndroid Build Coastguard Worker vpi		return VPI;
362*8b26181fSAndroid Build Coastguard Worker vci		return VCI;
363*8b26181fSAndroid Build Coastguard Worker connectmsg	return CONNECTMSG;
364*8b26181fSAndroid Build Coastguard Worker metaconnect	return METACONNECT;
365*8b26181fSAndroid Build Coastguard Worker 
366*8b26181fSAndroid Build Coastguard Worker on|ifname	return PF_IFNAME;
367*8b26181fSAndroid Build Coastguard Worker rset|ruleset	return PF_RSET;
368*8b26181fSAndroid Build Coastguard Worker rnr|rulenum	return PF_RNR;
369*8b26181fSAndroid Build Coastguard Worker srnr|subrulenum	return PF_SRNR;
370*8b26181fSAndroid Build Coastguard Worker reason		return PF_REASON;
371*8b26181fSAndroid Build Coastguard Worker action		return PF_ACTION;
372*8b26181fSAndroid Build Coastguard Worker 
373*8b26181fSAndroid Build Coastguard Worker fisu		return FISU;
374*8b26181fSAndroid Build Coastguard Worker lssu		return LSSU;
375*8b26181fSAndroid Build Coastguard Worker lsu		return LSSU;
376*8b26181fSAndroid Build Coastguard Worker msu		return MSU;
377*8b26181fSAndroid Build Coastguard Worker hfisu		return HFISU;
378*8b26181fSAndroid Build Coastguard Worker hlssu		return HLSSU;
379*8b26181fSAndroid Build Coastguard Worker hmsu		return HMSU;
380*8b26181fSAndroid Build Coastguard Worker sio		return SIO;
381*8b26181fSAndroid Build Coastguard Worker opc		return OPC;
382*8b26181fSAndroid Build Coastguard Worker dpc		return DPC;
383*8b26181fSAndroid Build Coastguard Worker sls		return SLS;
384*8b26181fSAndroid Build Coastguard Worker hsio		return HSIO;
385*8b26181fSAndroid Build Coastguard Worker hopc		return HOPC;
386*8b26181fSAndroid Build Coastguard Worker hdpc		return HDPC;
387*8b26181fSAndroid Build Coastguard Worker hsls		return HSLS;
388*8b26181fSAndroid Build Coastguard Worker 
389*8b26181fSAndroid Build Coastguard Worker [ \r\n\t]		;
390*8b26181fSAndroid Build Coastguard Worker [+\-*/%:\[\]!<>()&|\^=]	return yytext[0];
391*8b26181fSAndroid Build Coastguard Worker ">="			return GEQ;
392*8b26181fSAndroid Build Coastguard Worker "<="			return LEQ;
393*8b26181fSAndroid Build Coastguard Worker "!="			return NEQ;
394*8b26181fSAndroid Build Coastguard Worker "=="			return '=';
395*8b26181fSAndroid Build Coastguard Worker "<<"			return LSH;
396*8b26181fSAndroid Build Coastguard Worker ">>"			return RSH;
397*8b26181fSAndroid Build Coastguard Worker ${B}			{ yylval->s = sdup(yyextra, yytext); return AID; }
398*8b26181fSAndroid Build Coastguard Worker {MAC}			{ yylval->s = sdup(yyextra, yytext); return EID; }
399*8b26181fSAndroid Build Coastguard Worker {N}			{ return stou(yytext, yylval, yyextra); }
400*8b26181fSAndroid Build Coastguard Worker ({N}\.{N})|({N}\.{N}\.{N})|({N}\.{N}\.{N}\.{N})	{
401*8b26181fSAndroid Build Coastguard Worker 			yylval->s = sdup(yyextra, (char *)yytext); return HID; }
402*8b26181fSAndroid Build Coastguard Worker {V6}			{
403*8b26181fSAndroid Build Coastguard Worker #ifdef INET6
404*8b26181fSAndroid Build Coastguard Worker 			  struct addrinfo hints, *res;
405*8b26181fSAndroid Build Coastguard Worker 			  memset(&hints, 0, sizeof(hints));
406*8b26181fSAndroid Build Coastguard Worker 			  hints.ai_family = AF_INET6;
407*8b26181fSAndroid Build Coastguard Worker 			  hints.ai_flags = AI_NUMERICHOST;
408*8b26181fSAndroid Build Coastguard Worker 			  if (getaddrinfo(yytext, NULL, &hints, &res)) {
409*8b26181fSAndroid Build Coastguard Worker 				bpf_set_error(yyextra, "bogus IPv6 address %s", yytext);
410*8b26181fSAndroid Build Coastguard Worker 				yylval->s = NULL;
411*8b26181fSAndroid Build Coastguard Worker 			  } else {
412*8b26181fSAndroid Build Coastguard Worker 				freeaddrinfo(res);
413*8b26181fSAndroid Build Coastguard Worker 				yylval->s = sdup(yyextra, (char *)yytext);
414*8b26181fSAndroid Build Coastguard Worker 			  }
415*8b26181fSAndroid Build Coastguard Worker #else
416*8b26181fSAndroid Build Coastguard Worker 			  bpf_set_error(yyextra, "IPv6 address %s not supported", yytext);
417*8b26181fSAndroid Build Coastguard Worker 			  yylval->s = NULL;
418*8b26181fSAndroid Build Coastguard Worker #endif /*INET6*/
419*8b26181fSAndroid Build Coastguard Worker 			  return HID6;
420*8b26181fSAndroid Build Coastguard Worker 			}
421*8b26181fSAndroid Build Coastguard Worker {B}:+({B}:+)+		{ bpf_set_error(yyextra, "bogus ethernet address %s", yytext); yylval->s = NULL; return EID; }
422*8b26181fSAndroid Build Coastguard Worker icmptype		{ yylval->h = 0; return NUM; }
423*8b26181fSAndroid Build Coastguard Worker icmpcode		{ yylval->h = 1; return NUM; }
424*8b26181fSAndroid Build Coastguard Worker icmp-echoreply		{ yylval->h = 0; return NUM; }
425*8b26181fSAndroid Build Coastguard Worker icmp-unreach		{ yylval->h = 3; return NUM; }
426*8b26181fSAndroid Build Coastguard Worker icmp-sourcequench	{ yylval->h = 4; return NUM; }
427*8b26181fSAndroid Build Coastguard Worker icmp-redirect		{ yylval->h = 5; return NUM; }
428*8b26181fSAndroid Build Coastguard Worker icmp-echo		{ yylval->h = 8; return NUM; }
429*8b26181fSAndroid Build Coastguard Worker icmp-routeradvert	{ yylval->h = 9; return NUM; }
430*8b26181fSAndroid Build Coastguard Worker icmp-routersolicit	{ yylval->h = 10; return NUM; }
431*8b26181fSAndroid Build Coastguard Worker icmp-timxceed		{ yylval->h = 11; return NUM; }
432*8b26181fSAndroid Build Coastguard Worker icmp-paramprob		{ yylval->h = 12; return NUM; }
433*8b26181fSAndroid Build Coastguard Worker icmp-tstamp		{ yylval->h = 13; return NUM; }
434*8b26181fSAndroid Build Coastguard Worker icmp-tstampreply	{ yylval->h = 14; return NUM; }
435*8b26181fSAndroid Build Coastguard Worker icmp-ireq		{ yylval->h = 15; return NUM; }
436*8b26181fSAndroid Build Coastguard Worker icmp-ireqreply		{ yylval->h = 16; return NUM; }
437*8b26181fSAndroid Build Coastguard Worker icmp-maskreq		{ yylval->h = 17; return NUM; }
438*8b26181fSAndroid Build Coastguard Worker icmp-maskreply		{ yylval->h = 18; return NUM; }
439*8b26181fSAndroid Build Coastguard Worker 
440*8b26181fSAndroid Build Coastguard Worker icmp6type       { yylval->h = 0; return NUM; }
441*8b26181fSAndroid Build Coastguard Worker icmp6code       { yylval->h = 1; return NUM; }
442*8b26181fSAndroid Build Coastguard Worker 
443*8b26181fSAndroid Build Coastguard Worker icmp6-destinationunreach	{ yylval->h = 1; return NUM; }
444*8b26181fSAndroid Build Coastguard Worker icmp6-packettoobig		{ yylval->h = 2; return NUM; }
445*8b26181fSAndroid Build Coastguard Worker icmp6-timeexceeded		{ yylval->h = 3; return NUM; }
446*8b26181fSAndroid Build Coastguard Worker icmp6-parameterproblem		{ yylval->h = 4; return NUM; }
447*8b26181fSAndroid Build Coastguard Worker icmp6-echo      { yylval->h = 128; return NUM; }
448*8b26181fSAndroid Build Coastguard Worker icmp6-echoreply { yylval->h = 129; return NUM; }
449*8b26181fSAndroid Build Coastguard Worker icmp6-multicastlistenerquery    { yylval->h = 130; return NUM; }
450*8b26181fSAndroid Build Coastguard Worker icmp6-multicastlistenerreportv1 { yylval->h = 131; return NUM; }
451*8b26181fSAndroid Build Coastguard Worker icmp6-multicastlistenerdone     { yylval->h = 132; return NUM; }
452*8b26181fSAndroid Build Coastguard Worker icmp6-routersolicit   { yylval->h = 133; return NUM; }
453*8b26181fSAndroid Build Coastguard Worker icmp6-routeradvert    { yylval->h = 134; return NUM; }
454*8b26181fSAndroid Build Coastguard Worker icmp6-neighborsolicit { yylval->h = 135; return NUM; }
455*8b26181fSAndroid Build Coastguard Worker icmp6-neighboradvert  { yylval->h = 136; return NUM; }
456*8b26181fSAndroid Build Coastguard Worker icmp6-redirect    { yylval->h = 137; return NUM; }
457*8b26181fSAndroid Build Coastguard Worker icmp6-routerrenum { yylval->h = 138; return NUM; }
458*8b26181fSAndroid Build Coastguard Worker icmp6-nodeinformationquery      { yylval->h = 139; return NUM; }
459*8b26181fSAndroid Build Coastguard Worker icmp6-nodeinformationresponse   { yylval->h = 140; return NUM; }
460*8b26181fSAndroid Build Coastguard Worker icmp6-ineighbordiscoverysolicit { yylval->h = 141; return NUM; }
461*8b26181fSAndroid Build Coastguard Worker icmp6-ineighbordiscoveryadvert  { yylval->h = 142; return NUM; }
462*8b26181fSAndroid Build Coastguard Worker icmp6-multicastlistenerreportv2 { yylval->h = 143; return NUM; }
463*8b26181fSAndroid Build Coastguard Worker icmp6-homeagentdiscoveryrequest { yylval->h = 144; return NUM; }
464*8b26181fSAndroid Build Coastguard Worker icmp6-homeagentdiscoveryreply   { yylval->h = 145; return NUM; }
465*8b26181fSAndroid Build Coastguard Worker icmp6-mobileprefixsolicit       { yylval->h = 146; return NUM; }
466*8b26181fSAndroid Build Coastguard Worker icmp6-mobileprefixadvert        { yylval->h = 147; return NUM; }
467*8b26181fSAndroid Build Coastguard Worker icmp6-certpathsolicit           { yylval->h = 148; return NUM; }
468*8b26181fSAndroid Build Coastguard Worker icmp6-certpathadvert            { yylval->h = 149; return NUM; }
469*8b26181fSAndroid Build Coastguard Worker icmp6-multicastrouteradvert     { yylval->h = 151; return NUM; }
470*8b26181fSAndroid Build Coastguard Worker icmp6-multicastroutersolicit    { yylval->h = 152; return NUM; }
471*8b26181fSAndroid Build Coastguard Worker icmp6-multicastrouterterm       { yylval->h = 153; return NUM; }
472*8b26181fSAndroid Build Coastguard Worker 
473*8b26181fSAndroid Build Coastguard Worker tcpflags		{ yylval->h = 13; return NUM; }
474*8b26181fSAndroid Build Coastguard Worker tcp-fin			{ yylval->h = 0x01; return NUM; }
475*8b26181fSAndroid Build Coastguard Worker tcp-syn			{ yylval->h = 0x02; return NUM; }
476*8b26181fSAndroid Build Coastguard Worker tcp-rst			{ yylval->h = 0x04; return NUM; }
477*8b26181fSAndroid Build Coastguard Worker tcp-push		{ yylval->h = 0x08; return NUM; }
478*8b26181fSAndroid Build Coastguard Worker tcp-ack			{ yylval->h = 0x10; return NUM; }
479*8b26181fSAndroid Build Coastguard Worker tcp-urg			{ yylval->h = 0x20; return NUM; }
480*8b26181fSAndroid Build Coastguard Worker tcp-ece			{ yylval->h = 0x40; return NUM; }
481*8b26181fSAndroid Build Coastguard Worker tcp-cwr			{ yylval->h = 0x80; return NUM; }
482*8b26181fSAndroid Build Coastguard Worker [A-Za-z0-9]([-_.A-Za-z0-9]*[.A-Za-z0-9])? {
483*8b26181fSAndroid Build Coastguard Worker 			 yylval->s = sdup(yyextra, (char *)yytext); return ID; }
484*8b26181fSAndroid Build Coastguard Worker "\\"[^ !()\n\t]+	{ yylval->s = sdup(yyextra, (char *)yytext + 1); return ID; }
485*8b26181fSAndroid Build Coastguard Worker .			{ return LEX_ERROR; }
486*8b26181fSAndroid Build Coastguard Worker %%
487*8b26181fSAndroid Build Coastguard Worker 
488*8b26181fSAndroid Build Coastguard Worker /*
489*8b26181fSAndroid Build Coastguard Worker  * Turn diagnostics back on, so we check the code that we've written.
490*8b26181fSAndroid Build Coastguard Worker  */
491*8b26181fSAndroid Build Coastguard Worker DIAG_ON_FLEX
492*8b26181fSAndroid Build Coastguard Worker 
493*8b26181fSAndroid Build Coastguard Worker /*
494*8b26181fSAndroid Build Coastguard Worker  * Convert string to 32-bit unsigned integer.  Just like atoi(), but checks for
495*8b26181fSAndroid Build Coastguard Worker  * preceding 0x or 0 and uses hex or octal instead of decimal.
496*8b26181fSAndroid Build Coastguard Worker  *
497*8b26181fSAndroid Build Coastguard Worker  * On success, sets yylval->h to the value and returns NUM.
498*8b26181fSAndroid Build Coastguard Worker  * On failure, sets the BPF error string and returns LEX_ERROR, to force
499*8b26181fSAndroid Build Coastguard Worker  * the parse to stop.
500*8b26181fSAndroid Build Coastguard Worker  */
501*8b26181fSAndroid Build Coastguard Worker static int
502*8b26181fSAndroid Build Coastguard Worker stou(char *yytext_arg, YYSTYPE *yylval_arg, compiler_state_t *yyextra_arg)
503*8b26181fSAndroid Build Coastguard Worker {
504*8b26181fSAndroid Build Coastguard Worker 	bpf_u_int32 n = 0;
505*8b26181fSAndroid Build Coastguard Worker 	unsigned int digit;
506*8b26181fSAndroid Build Coastguard Worker 	char *s = yytext_arg;
507*8b26181fSAndroid Build Coastguard Worker 
508*8b26181fSAndroid Build Coastguard Worker 	/*
509*8b26181fSAndroid Build Coastguard Worker 	 * yytext_arg is guaranteed either to be a string of decimal digits
510*8b26181fSAndroid Build Coastguard Worker 	 * or 0[xX] followed by a string of hex digits.
511*8b26181fSAndroid Build Coastguard Worker 	 */
512*8b26181fSAndroid Build Coastguard Worker 	if (*s == '0') {
513*8b26181fSAndroid Build Coastguard Worker 		if (s[1] == 'x' || s[1] == 'X') {
514*8b26181fSAndroid Build Coastguard Worker 			/*
515*8b26181fSAndroid Build Coastguard Worker 			 * Begins with 0x or 0X, so hex.
516*8b26181fSAndroid Build Coastguard Worker 			 * Guaranteed to be all hex digits following the
517*8b26181fSAndroid Build Coastguard Worker 			 * prefix, so anything that's not 0-9 or a-f is
518*8b26181fSAndroid Build Coastguard Worker 			 * A-F.
519*8b26181fSAndroid Build Coastguard Worker 			 */
520*8b26181fSAndroid Build Coastguard Worker 			s += 2;	/* skip the prefix */
521*8b26181fSAndroid Build Coastguard Worker 			while ((digit = *s++) != '\0') {
522*8b26181fSAndroid Build Coastguard Worker 				if (digit >= '0' && digit <= '9')
523*8b26181fSAndroid Build Coastguard Worker 					digit = digit - '0';
524*8b26181fSAndroid Build Coastguard Worker 				else if (digit >= 'a' && digit <= 'f')
525*8b26181fSAndroid Build Coastguard Worker 					digit = digit - 'a' + 10;
526*8b26181fSAndroid Build Coastguard Worker 				else
527*8b26181fSAndroid Build Coastguard Worker 					digit = digit - 'A' + 10;
528*8b26181fSAndroid Build Coastguard Worker 
529*8b26181fSAndroid Build Coastguard Worker 				/*
530*8b26181fSAndroid Build Coastguard Worker 				 * Check for overflow.
531*8b26181fSAndroid Build Coastguard Worker 				 */
532*8b26181fSAndroid Build Coastguard Worker 				if (n > 0xFFFFFFFU) {
533*8b26181fSAndroid Build Coastguard Worker 					/*
534*8b26181fSAndroid Build Coastguard Worker 					 * We have more than 28 bits of
535*8b26181fSAndroid Build Coastguard Worker 					 * number, and are about to
536*8b26181fSAndroid Build Coastguard Worker 					 * add 4 more; that won't fit
537*8b26181fSAndroid Build Coastguard Worker 					 * in 32 bits.
538*8b26181fSAndroid Build Coastguard Worker 					 */
539*8b26181fSAndroid Build Coastguard Worker 					bpf_set_error(yyextra_arg,
540*8b26181fSAndroid Build Coastguard Worker 					    "number %s overflows 32 bits",
541*8b26181fSAndroid Build Coastguard Worker 					    yytext_arg);
542*8b26181fSAndroid Build Coastguard Worker 					return LEX_ERROR;
543*8b26181fSAndroid Build Coastguard Worker 				}
544*8b26181fSAndroid Build Coastguard Worker 				n = (n << 4) + digit;
545*8b26181fSAndroid Build Coastguard Worker 			}
546*8b26181fSAndroid Build Coastguard Worker 		} else {
547*8b26181fSAndroid Build Coastguard Worker 			/*
548*8b26181fSAndroid Build Coastguard Worker 			 * Begins with 0, but not 0x or 0X, so octal.
549*8b26181fSAndroid Build Coastguard Worker 			 * Guaranteed to be all *decimal* digits following
550*8b26181fSAndroid Build Coastguard Worker 			 * the prefix, so we need to catch 8 and 9 and
551*8b26181fSAndroid Build Coastguard Worker 			 * report an error.
552*8b26181fSAndroid Build Coastguard Worker 			 */
553*8b26181fSAndroid Build Coastguard Worker 			s += 1;
554*8b26181fSAndroid Build Coastguard Worker 			while ((digit = *s++) != '\0') {
555*8b26181fSAndroid Build Coastguard Worker 				if (digit >= '0' && digit <= '7')
556*8b26181fSAndroid Build Coastguard Worker 					digit = digit - '0';
557*8b26181fSAndroid Build Coastguard Worker 				else {
558*8b26181fSAndroid Build Coastguard Worker 					bpf_set_error(yyextra_arg,
559*8b26181fSAndroid Build Coastguard Worker 					    "number %s contains non-octal digit",
560*8b26181fSAndroid Build Coastguard Worker 					    yytext_arg);
561*8b26181fSAndroid Build Coastguard Worker 					return LEX_ERROR;
562*8b26181fSAndroid Build Coastguard Worker 				}
563*8b26181fSAndroid Build Coastguard Worker 				if (n > 03777777777U) {
564*8b26181fSAndroid Build Coastguard Worker 					/*
565*8b26181fSAndroid Build Coastguard Worker 					 * We have more than 29 bits of
566*8b26181fSAndroid Build Coastguard Worker 					 * number, and are about to add
567*8b26181fSAndroid Build Coastguard Worker 					 * 3 more; that won't fit in
568*8b26181fSAndroid Build Coastguard Worker 					 * 32 bits.
569*8b26181fSAndroid Build Coastguard Worker 					 */
570*8b26181fSAndroid Build Coastguard Worker 					bpf_set_error(yyextra_arg,
571*8b26181fSAndroid Build Coastguard Worker 					    "number %s overflows 32 bits",
572*8b26181fSAndroid Build Coastguard Worker 					    yytext_arg);
573*8b26181fSAndroid Build Coastguard Worker 					return LEX_ERROR;
574*8b26181fSAndroid Build Coastguard Worker 				}
575*8b26181fSAndroid Build Coastguard Worker 				n = (n << 3) + digit;
576*8b26181fSAndroid Build Coastguard Worker 			}
577*8b26181fSAndroid Build Coastguard Worker 		}
578*8b26181fSAndroid Build Coastguard Worker 	} else {
579*8b26181fSAndroid Build Coastguard Worker 		/*
580*8b26181fSAndroid Build Coastguard Worker 		 * Decimal.
581*8b26181fSAndroid Build Coastguard Worker 		 */
582*8b26181fSAndroid Build Coastguard Worker 		while ((digit = *s++) != '\0') {
583*8b26181fSAndroid Build Coastguard Worker 			digit = digit - '0';
584*8b26181fSAndroid Build Coastguard Worker #define CUTOFF_DEC	(0xFFFFFFFFU / 10U)
585*8b26181fSAndroid Build Coastguard Worker #define CUTLIM_DEC	(0xFFFFFFFFU % 10U)
586*8b26181fSAndroid Build Coastguard Worker 			if (n > CUTOFF_DEC ||
587*8b26181fSAndroid Build Coastguard Worker 			    (n == CUTOFF_DEC && digit > CUTLIM_DEC)) {
588*8b26181fSAndroid Build Coastguard Worker 				bpf_set_error(yyextra_arg,
589*8b26181fSAndroid Build Coastguard Worker 				    "number %s overflows 32 bits",
590*8b26181fSAndroid Build Coastguard Worker 				    yytext_arg);
591*8b26181fSAndroid Build Coastguard Worker 				return LEX_ERROR;
592*8b26181fSAndroid Build Coastguard Worker 			}
593*8b26181fSAndroid Build Coastguard Worker 			n = (n * 10) + digit;
594*8b26181fSAndroid Build Coastguard Worker 		}
595*8b26181fSAndroid Build Coastguard Worker 	}
596*8b26181fSAndroid Build Coastguard Worker 
597*8b26181fSAndroid Build Coastguard Worker 	yylval_arg->h = n;
598*8b26181fSAndroid Build Coastguard Worker 	return NUM;
599*8b26181fSAndroid Build Coastguard Worker }
600