aboutsummaryrefslogtreecommitdiffstats
path: root/wiretap/rt-scanner-skel.l
diff options
context:
space:
mode:
Diffstat (limited to 'wiretap/rt-scanner-skel.l')
-rw-r--r--wiretap/rt-scanner-skel.l161
1 files changed, 161 insertions, 0 deletions
diff --git a/wiretap/rt-scanner-skel.l b/wiretap/rt-scanner-skel.l
new file mode 100644
index 0000000000..311d85a0c5
--- /dev/null
+++ b/wiretap/rt-scanner-skel.l
@@ -0,0 +1,161 @@
+%{
+#include <glib.h>
+#include "rt-tokdefs.h"
+guint8* parse_bytes(char *text);
+enum nibble_t { high, low };
+static char *in_buffer;
+
+/* from libpcap */
+#ifdef FLEX_SCANNER
+#define YY_NO_UNPUT
+#undef YY_INPUT
+#define YY_INPUT(buf, result, max)\
+ {\
+ char *src = in_buffer;\
+ int i;\
+\
+ if (*src == 0)\
+ result = YY_NULL;\
+ else {\
+ for (i = 0; *src && i < max; ++i)\
+ buf[i] = *src++;\
+ in_buffer += i;\
+ result = i;\
+ }\
+ }
+#else
+#undef getc
+#define getc(fp) (*in_buffer == 0 ? EOF : *in_buffer++)
+#endif
+
+
+%}
+
+N ([0-9]+|(0X|0x)[0-9A-Fa-f]+)
+B [0-9A-Fa-f][0-9A-Fa-f]?([-:.]?[0-9A-Fa-f][0-9A-Fa-f]?)*
+W [A-Za-z_]
+quoted \"[^"\n]*["\n]
+
+%%
+
+[\n\t ]+ /* eat whitespace */
+
+{quoted} {
+ wtap_lval.s = g_string_new(wtap_text + 1);
+ g_string_truncate(wtap_lval.s, strlen(wtap_text) - 2);
+ return QUOTED;
+}
+
+";" return ';';
+"," return ',';
+"(" return '(';
+")" return ')';
+"@" return '@';
+
+/* ct-compile: lex tokens */
+
+eq return EQ;
+ne return NE;
+
+{B} {
+ wtap_lval.b = parse_bytes(wtap_text);
+ return BYTES;
+}
+
+{N} {
+ wtap_lval.d = atoi(wtap_text);
+ return NUMBER;
+}
+
+{W}+ {
+ wtap_lval.s = g_string_new(wtap_text);
+ return TEXT;
+ }
+
+%%
+
+guint8*
+parse_bytes(char *text)
+{
+ guint8 buffer[256];
+ guint8 index = 0;
+ char *cp;
+ char character;
+ guint8 byte_val=0;
+ gchar *dup_ptr;
+ enum nibble_t nibble = high;
+
+ for (cp = text; (*cp != '\x0') && index < 256; cp++) {
+ character = *cp;
+
+ if (nibble == high) {
+ /* assumes ASCII, not EBCDIC */
+ if (character >= '0' && character <= '9') {
+ byte_val = (character - '0') << 4;
+ }
+ else if (character >= 'A' && character <= 'F') {
+ byte_val = (character - 'A' + 10) << 4;
+ }
+ else if (character >= 'a' && character <= 'f') {
+ byte_val = (character - 'a' + 10) << 4;
+ }
+ else {
+ continue;
+ }
+ nibble = low;
+ continue;
+ }
+ else {
+ /* assumes ASCII, not EBCDIC */
+ if (character >= '0' && character <= '9') {
+ byte_val += (character - '0');
+ }
+ else if (character >= 'A' && character <= 'F') {
+ byte_val += (character - 'A' + 10);
+ }
+ else if (character >= 'a' && character <= 'f') {
+ byte_val += (character - 'a' + 10);
+ }
+ else {
+ byte_val >>= 4;
+ }
+ nibble = high;
+
+ buffer[index] = byte_val;
+ index++;
+ }
+
+ }
+
+ /* did we finish mid-nibble? */
+ if (nibble == low) {
+ buffer[index] = byte_val >> 4;
+ index++;
+ }
+
+ dup_ptr = g_malloc(index + 1);
+ dup_ptr[0] = index;
+ memcpy(dup_ptr + 1, buffer, index);
+ return dup_ptr;
+}
+
+
+void wtap_error(char *string)
+{
+ g_error("%s\n",string);
+ exit(0);
+}
+
+/* from libpcap */
+void
+lex_init(char *buf)
+{
+ in_buffer = buf;
+}
+
+int
+yywrap()
+{
+ return 1;
+}
+