]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/libpcap/scanner.l
This commit was generated by cvs2svn to compensate for changes in r91586,
[FreeBSD/FreeBSD.git] / contrib / libpcap / scanner.l
1 %{
2 /*
3  * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997
4  *      The Regents of the University of California.  All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that: (1) source code distributions
8  * retain the above copyright notice and this paragraph in its entirety, (2)
9  * distributions including binary code include the above copyright notice and
10  * this paragraph in its entirety in the documentation or other materials
11  * provided with the distribution, and (3) all advertising materials mentioning
12  * features or use of this software display the following acknowledgement:
13  * ``This product includes software developed by the University of California,
14  * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
15  * the University nor the names of its contributors may be used to endorse
16  * or promote products derived from this software without specific prior
17  * written permission.
18  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
19  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
20  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
21  *
22  * $FreeBSD$
23  */
24
25 #ifndef lint
26 static const char rcsid[] =
27     "@(#) $Header: /tcpdump/master/libpcap/scanner.l,v 1.70 2000/10/28 10:18:40 guy Exp $ (LBL)";
28 #endif
29
30 #ifdef HAVE_CONFIG_H
31 #include "config.h"
32 #endif
33
34 #include <sys/types.h>
35 #include <sys/time.h>
36
37 #include <ctype.h>
38 #include <unistd.h>
39 #include <string.h>
40
41 #include "pcap-int.h"
42
43 #include "gencode.h"
44 #include <pcap-namedb.h>
45 #ifdef INET6
46 #include <netdb.h>
47 #include <sys/socket.h>
48 /* Workaround for AIX 4.3 */
49 #if !defined(AI_NUMERICHOST)
50 #define AI_NUMERICHOST 0x04
51 #endif
52 #endif /*INET6*/
53 #include "tokdefs.h"
54
55 #ifdef HAVE_OS_PROTO_H
56 #include "os-proto.h"
57 #endif
58
59 static int stoi(char *);
60 static inline int xdtoi(int);
61
62 #ifdef FLEX_SCANNER
63 #define YY_NO_UNPUT
64 static YY_BUFFER_STATE in_buffer;
65 #else
66 static char *in_buffer;
67
68 #undef getc
69 #define getc(fp)  (*in_buffer == 0 ? EOF : *in_buffer++)
70 #endif
71
72 #define yylval pcap_lval
73 extern YYSTYPE yylval;
74
75 %}
76
77 N               ([0-9]+|(0X|0x)[0-9A-Fa-f]+)
78 B               ([0-9A-Fa-f][0-9A-Fa-f]?)
79 W               ([0-9A-Fa-f][0-9A-Fa-f]?[0-9A-Fa-f]?[0-9A-Fa-f]?)
80
81 %a 15000
82 %o 17000
83 %e 6000
84 %k 4000
85 %p 19000
86 %n 2000
87
88 V680            {W}:{W}:{W}:{W}:{W}:{W}:{W}:{W}
89
90 V670            ::{W}:{W}:{W}:{W}:{W}:{W}:{W}
91 V671            {W}::{W}:{W}:{W}:{W}:{W}:{W}
92 V672            {W}:{W}::{W}:{W}:{W}:{W}:{W}
93 V673            {W}:{W}:{W}::{W}:{W}:{W}:{W}
94 V674            {W}:{W}:{W}:{W}::{W}:{W}:{W}
95 V675            {W}:{W}:{W}:{W}:{W}::{W}:{W}
96 V676            {W}:{W}:{W}:{W}:{W}:{W}::{W}
97 V677            {W}:{W}:{W}:{W}:{W}:{W}:{W}::
98
99 V660            ::{W}:{W}:{W}:{W}:{W}:{W}
100 V661            {W}::{W}:{W}:{W}:{W}:{W}
101 V662            {W}:{W}::{W}:{W}:{W}:{W}
102 V663            {W}:{W}:{W}::{W}:{W}:{W}
103 V664            {W}:{W}:{W}:{W}::{W}:{W}
104 V665            {W}:{W}:{W}:{W}:{W}::{W}
105 V666            {W}:{W}:{W}:{W}:{W}:{W}::
106
107 V650            ::{W}:{W}:{W}:{W}:{W}
108 V651            {W}::{W}:{W}:{W}:{W}
109 V652            {W}:{W}::{W}:{W}:{W}
110 V653            {W}:{W}:{W}::{W}:{W}
111 V654            {W}:{W}:{W}:{W}::{W}
112 V655            {W}:{W}:{W}:{W}:{W}::
113
114 V640            ::{W}:{W}:{W}:{W}
115 V641            {W}::{W}:{W}:{W}
116 V642            {W}:{W}::{W}:{W}
117 V643            {W}:{W}:{W}::{W}
118 V644            {W}:{W}:{W}:{W}::
119
120 V630            ::{W}:{W}:{W}
121 V631            {W}::{W}:{W}
122 V632            {W}:{W}::{W}
123 V633            {W}:{W}:{W}::
124
125 V620            ::{W}:{W}
126 V621            {W}::{W}
127 V622            {W}:{W}::
128
129 V610            ::{W}
130 V611            {W}::
131
132 V600            ::
133
134 V6604           {W}:{W}:{W}:{W}:{W}:{W}:{N}\.{N}\.{N}\.{N}
135
136 V6504           ::{W}:{W}:{W}:{W}:{W}:{N}\.{N}\.{N}\.{N}
137 V6514           {W}::{W}:{W}:{W}:{W}:{N}\.{N}\.{N}\.{N}
138 V6524           {W}:{W}::{W}:{W}:{W}:{N}\.{N}\.{N}\.{N}
139 V6534           {W}:{W}:{W}::{W}:{W}:{N}\.{N}\.{N}\.{N}
140 V6544           {W}:{W}:{W}:{W}::{W}:{N}\.{N}\.{N}\.{N}
141 V6554           {W}:{W}:{W}:{W}:{W}::{N}\.{N}\.{N}\.{N}
142
143 V6404           ::{W}:{W}:{W}:{W}:{N}\.{N}\.{N}\.{N}
144 V6414           {W}::{W}:{W}:{W}:{N}\.{N}\.{N}\.{N}
145 V6424           {W}:{W}::{W}:{W}:{N}\.{N}\.{N}\.{N}
146 V6434           {W}:{W}:{W}::{W}:{N}\.{N}\.{N}\.{N}
147 V6444           {W}:{W}:{W}:{W}::{N}\.{N}\.{N}\.{N}
148
149 V6304           ::{W}:{W}:{W}:{N}\.{N}\.{N}\.{N}
150 V6314           {W}::{W}:{W}:{N}\.{N}\.{N}\.{N}
151 V6324           {W}:{W}::{W}:{N}\.{N}\.{N}\.{N}
152 V6334           {W}:{W}:{W}::{N}\.{N}\.{N}\.{N}
153
154 V6204           ::{W}:{W}:{N}\.{N}\.{N}\.{N}
155 V6214           {W}::{W}:{N}\.{N}\.{N}\.{N}
156 V6224           {W}:{W}::{N}\.{N}\.{N}\.{N}
157
158 V6104           ::{W}:{N}\.{N}\.{N}\.{N}
159 V6114           {W}::{N}\.{N}\.{N}\.{N}
160
161 V6004           ::{N}\.{N}\.{N}\.{N}
162
163
164 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})
165
166 %%
167 dst             return DST;
168 src             return SRC;
169
170 link|ether|ppp|slip  return LINK;
171 fddi|tr         return LINK;
172 arp             return ARP;
173 rarp            return RARP;
174 ip              return IP;
175 tcp             return TCP;
176 udp             return UDP;
177 icmp            return ICMP;
178 igmp            return IGMP;
179 igrp            return IGRP;
180 pim             return PIM;
181
182 ip6             return IPV6;
183 icmp6           return ICMPV6;
184 ah              return AH;
185 esp             return ESP;
186
187 atalk           return ATALK;
188 aarp            return AARP;
189 decnet          return DECNET;
190 lat             return LAT;
191 sca             return SCA;
192 moprc           return MOPRC;
193 mopdl           return MOPDL;
194
195 iso             return ISO;
196 esis            return ESIS;
197 es-is           return ESIS;
198 isis            return ISIS;
199 is-is           return ISIS;
200 clnp            return CLNP;
201
202 host            return HOST;
203 net             return NET;
204 mask            return MASK;
205 port            return PORT;
206 proto           return PROTO;
207 protochain      {
208 #ifdef NO_PROTOCHAIN
209                   bpf_error("%s not supported", yytext);
210 #else
211                   return PROTOCHAIN;
212 #endif
213                 }
214
215 gateway         return GATEWAY;
216
217 less            return LESS;
218 greater         return GREATER;
219 byte            return BYTE;
220 broadcast       return TK_BROADCAST;
221 multicast       return TK_MULTICAST;
222
223 and|"&&"        return AND;
224 or|"||"         return OR;
225 not             return '!';
226
227 len|length      return LEN;
228 inbound         return INBOUND;
229 outbound        return OUTBOUND;
230
231 vlan            return VLAN;
232
233 [ \n\t]                 ;
234 [+\-*/:\[\]!<>()&|=]    return yytext[0];
235 ">="                    return GEQ;
236 "<="                    return LEQ;
237 "!="                    return NEQ;
238 "=="                    return '=';
239 "<<"                    return LSH;
240 ">>"                    return RSH;
241 {N}                     { yylval.i = stoi((char *)yytext); return NUM; }
242 ({N}\.{N})|({N}\.{N}\.{N})|({N}\.{N}\.{N}\.{N}) {
243                         yylval.s = sdup((char *)yytext); return HID; }
244 {B}:{B}:{B}:{B}:{B}:{B} { yylval.e = pcap_ether_aton((char *)yytext);
245                           return EID; }
246 {V6}                    {
247 #ifdef INET6
248                           struct addrinfo hints, *res;
249                           memset(&hints, 0, sizeof(hints));
250                           hints.ai_family = AF_INET6;
251                           hints.ai_flags = AI_NUMERICHOST;
252                           if (getaddrinfo(yytext, NULL, &hints, &res))
253                                 bpf_error("bogus IPv6 address %s", yytext);
254                           else {
255                                 yylval.e = sdup((char *)yytext); return HID6;
256                           }
257 #else
258                           bpf_error("IPv6 address %s not supported", yytext);
259 #endif /*INET6*/
260                         }
261 {B}:+({B}:+)+           { bpf_error("bogus ethernet address %s", yytext); }
262 [A-Za-z0-9][-_.A-Za-z0-9]*[.A-Za-z0-9] {
263                          yylval.s = sdup((char *)yytext); return ID; }
264 "\\"[^ !()\n\t]+        { yylval.s = sdup((char *)yytext + 1); return ID; }
265 [^ \[\]\t\n\-_.A-Za-z0-9!<>()&|=]+i {
266                         bpf_error("illegal token: %s\n", yytext); }
267 .                       { bpf_error("illegal char '%c'", *yytext); }
268 %%
269 void
270 lex_init(buf)
271         char *buf;
272 {
273 #ifdef FLEX_SCANNER
274         in_buffer = yy_scan_string(buf);
275 #else
276         in_buffer = buf;
277 #endif
278 }
279
280 /*
281  * Do any cleanup necessary after parsing.
282  */
283 void
284 lex_cleanup()
285 {
286 #ifdef FLEX_SCANNER
287         if (in_buffer != NULL)
288                 yy_delete_buffer(in_buffer);
289         in_buffer = NULL;
290 #endif
291 }
292
293 /*
294  * Also define a yywrap.  Note that if we're using flex, it will
295  * define a macro to map this identifier to pcap_wrap.
296  */
297 int
298 yywrap()
299 {
300         return 1;
301 }
302
303 /* Hex digit to integer. */
304 static inline int
305 xdtoi(c)
306         register int c;
307 {
308         if (isdigit(c))
309                 return c - '0';
310         else if (islower(c))
311                 return c - 'a' + 10;
312         else
313                 return c - 'A' + 10;
314 }
315
316 /*
317  * Convert string to integer.  Just like atoi(), but checks for
318  * preceding 0x or 0 and uses hex or octal instead of decimal.
319  */
320 static int
321 stoi(s)
322         char *s;
323 {
324         int base = 10;
325         int n = 0;
326
327         if (*s == '0') {
328                 if (s[1] == 'x' || s[1] == 'X') {
329                         s += 2;
330                         base = 16;
331                 }
332                 else {
333                         base = 8;
334                         s += 1;
335                 }
336         }
337         while (*s)
338                 n = n * base + xdtoi(*s++);
339
340         return n;
341 }