]> git.ozlabs.org Git - ppp.git/blobdiff - pppd/scanner.l
files added for packet filter expression compilation
[ppp.git] / pppd / scanner.l
diff --git a/pppd/scanner.l b/pppd/scanner.l
new file mode 100644 (file)
index 0000000..64ffd34
--- /dev/null
@@ -0,0 +1,173 @@
+%{
+/*     From NetBSD: scanner.l,v 1.2 1995/03/06 11:39:12 mycroft Exp */
+/*     From Header: scanner.l,v 1.40 94/06/10 17:21:44 mccanne Exp (LBL) */
+
+/*
+ * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that: (1) source code distributions
+ * retain the above copyright notice and this paragraph in its entirety, (2)
+ * distributions including binary code include the above copyright notice and
+ * this paragraph in its entirety in the documentation or other materials
+ * provided with the distribution, and (3) all advertising materials mentioning
+ * features or use of this software display the following acknowledgement:
+ * ``This product includes software developed by the University of California,
+ * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
+ * the University nor the names of its contributors may be used to endorse
+ * or promote products derived from this software without specific prior
+ * written permission.
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Id";
+#endif
+
+#include <sys/types.h>
+#include <sys/time.h>
+
+#include <ctype.h>
+
+#include <net/ppp_defs.h>
+#include "pcap.h"
+#include "pcap-namedb.h"
+
+#include "gencode.h"
+#include "y.tab.h"
+
+#ifndef __GNUC__
+#define inline
+#endif
+
+static int stoi(char *);
+static inline int xdtoi(int);
+
+#ifndef FLEX_SCANNER
+static char *in_buffer;
+
+#undef getc
+#define getc(fp)  (*in_buffer == 0 ? EOF : *in_buffer++)
+#endif
+
+extern YYSTYPE yylval;
+
+%}
+
+N              ([0-9]+|(0X|0x)[0-9A-Fa-f]+)
+B              ([0-9A-Fa-f][0-9A-Fa-f]?)
+
+%a 3000
+
+%%
+dst            return DST;
+src            return SRC;
+
+link|ppp       return LINK;
+ip             return IP;
+tcp            return TCP;
+udp            return UDP;
+icmp           return ICMP;
+
+host           return HOST;
+net            return NET;
+port           return PORT;
+proto          return PROTO;
+
+less           return LESS;
+greater                return GREATER;
+byte           return BYTE;
+broadcast      return TK_BROADCAST;
+multicast      return TK_MULTICAST;
+
+and|"&&"       return AND;
+or|"||"                return OR;
+not            return '!';
+
+len|length     return LEN;
+inbound                return INBOUND;
+outbound       return OUTBOUND;
+
+[ \n\t]                        ;
+[+\-*/:\[\]!<>()&|=]   return yytext[0];
+">="                   return GEQ;
+"<="                   return LEQ;
+"!="                   return NEQ;
+"=="                   return '=';
+"<<"                   return LSH;
+">>"                   return RSH;
+{N}                    { yylval.i = stoi((char *)yytext); return NUM; }
+({N}\.{N})|({N}\.{N}\.{N})|({N}\.{N}\.{N}\.{N})        {
+                       yylval.s = sdup((char *)yytext); return HID;
+}
+[A-Za-z][-_.A-Za-z0-9]*        { yylval.s = sdup((char *)yytext); return ID; }
+"\\"[^ !()\n\t]+       { yylval.s = sdup((char *)yytext + 1); return ID; }
+[^ \[\]\t\n\-_.A-Za-z0-9!<>()&|=]+    { bpf_error("illegal token: %s\n", yytext); }
+.                      { bpf_error("illegal char '%c'", *yytext); }
+%%
+void
+lex_init(buf)
+       char *buf;
+{
+#ifdef FLEX_SCANNER
+       if (yy_current_buffer)
+               yy_delete_buffer(yy_current_buffer);
+       yy_switch_to_buffer(yy_scan_string(buf));
+#else
+       in_buffer = buf;
+#endif
+}
+
+/*
+ * Also define a yywrap.  Note that if we're using flex, it will
+ * define a macro to map this identifier to pcap_wrap.
+ */
+int
+yywrap()
+{
+       return 1;
+}
+
+/* Hex digit to integer. */
+static inline int
+xdtoi(c)
+       register int c;
+{
+       if (isdigit(c))
+               return c - '0';
+       else if (islower(c))
+               return c - 'a' + 10;
+       else
+               return c - 'A' + 10;
+}
+
+/*
+ * Convert string to integer.  Just like atoi(), but checks for
+ * preceding 0x or 0 and uses hex or octal instead of decimal.
+ */
+static int
+stoi(s)
+       char *s;
+{
+       int base = 10;
+       int n = 0;
+
+       if (*s == '0') {
+               if (s[1] == 'x' || s[1] == 'X') {
+                       s += 2;
+                       base = 16;
+               }
+               else {
+                       base = 8;
+                       s += 1;
+               }
+       }
+       while (*s)
+               n = n * base + xdtoi(*s++);
+
+       return n;
+}
+