Stuart Stanley's ISIS dissection support.
[obnox/wireshark/wip.git] / dfilter-scanner.l
index b6bab0d9e2cbc693390a31f6f2d4ffa4d5919526..9f60e72deff52bfb68bb66187b533c35d7c4bcbc 100644 (file)
@@ -3,7 +3,7 @@
 /* dfilter-scanner.l
  * Scanner for display filters
  *
- * $Id: dfilter-scanner.l,v 1.18 1999/10/11 17:04:33 deniel Exp $
+ * $Id: dfilter-scanner.l,v 1.26 1999/10/19 05:45:45 gram Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@zing.org>
@@ -88,6 +88,8 @@ static char *in_buffer;
 whitespace     [\t ]
 hex            [A-Fa-f0-9]{1,2}
 hexsep         [-:\.]
+minus          [-]
+plus           [+]
 
 %%
 
@@ -132,6 +134,25 @@ le|\<\=            { dfilter_lval.operand = TOK_LE; return TOK_LE; }
        return T_VAL_BYTE_RANGE;
 }
 
+\[{whitespace}*-?[0-9]+{whitespace}*\] { /* range [ x  ] */
+
+       char    *byterange_string = g_strdup(yytext);
+       char    *s = byterange_string + 1; /* I don't want the first '[' */
+       char    *p;
+
+       /* Get the offset from the string */
+       if ((p = strtok(s, "]"))) {
+               dfilter_lval.byte_range.offset = strtol(p, NULL, 10);
+       }
+       else {
+               g_free(byterange_string);
+               return 0;
+       }
+
+       dfilter_lval.byte_range.length = 0;
+       g_free(byterange_string);
+       return T_VAL_BYTE_RANGE;
+}
 
 {hex}({hexsep}{hex})+ {                        /* byte string, any length */
        dfilter_lval.string = g_strdup(yytext);
@@ -139,7 +160,13 @@ le|\<\=            { dfilter_lval.operand = TOK_LE; return TOK_LE; }
 }
 
 
-[A-Za-z][A-Za-z0-9\.\_\-]+     { /* looks like a protocol, field name, or hostname */
+0[xX][A-Fa-f0-9]+ {                    /* hex values */
+       dfilter_lval.string = g_strdup(yytext);
+       return T_VAL_UNQUOTED_STRING;
+}
+
+[A-Za-z0-9\:][A-Za-z0-9\.\_\-\:]+ {
+       /* looks like a protocol, field name, or hostname */
 
        int retval = 0;
        enum ftenum ftype;
@@ -158,22 +185,25 @@ le|\<\=           { dfilter_lval.operand = TOK_LE; return TOK_LE; }
                        retval = T_FT_BOOLEAN;
                        break;
                case FT_UINT8:
-               case FT_VALS_UINT8:
                        retval = T_FT_UINT8;
                        break;
                case FT_UINT16:
-               case FT_VALS_UINT16:
                        retval = T_FT_UINT16;
                        break;
                case FT_UINT32:
-               case FT_VALS_UINT32:
-               case FT_VALS_UINT24:
                        retval = T_FT_UINT32;
                        break;
+               case FT_INT8:
+                       retval = T_FT_INT8;
+                       break;
+               case FT_INT16:
+                       retval = T_FT_INT16;
+                       break;
+               case FT_INT32:
+                       retval = T_FT_INT32;
+                       break;
                case FT_DOUBLE:
-                       dfilter_fail("Sorry, you can't filter on field \"%s\", as we don't yet support filtering on floating-point values.",
-                           yytext);
-                       retval = 0;
+                       retval = T_FT_DOUBLE;
                        break;
                case FT_ABSOLUTE_TIME:
                        dfilter_fail("Sorry, you can't filter on field \"%s\", as we don't yet support filtering on time-of-day values.",
@@ -186,9 +216,7 @@ le|\<\=             { dfilter_lval.operand = TOK_LE; return TOK_LE; }
                        retval = 0;
                        break;
                case FT_STRING:
-                       dfilter_fail("Sorry, you can't filter on field \"%s\", as we don't yet support filtering on string values.",
-                           yytext);
-                       retval = 0;
+                       retval = T_FT_STRING;
                        break;
                case FT_ETHER:
                        retval = T_FT_ETHER;
@@ -206,6 +234,7 @@ le|\<\=             { dfilter_lval.operand = TOK_LE; return TOK_LE; }
                        retval = T_FT_IPXNET;
                        break;
                default:
+                       printf("ftype for %s is %d\n", yytext, ftype);
                        g_assert_not_reached();
                        retval = 0;
                        break;
@@ -214,15 +243,17 @@ le|\<\=           { dfilter_lval.operand = TOK_LE; return TOK_LE; }
        return retval;
 }
 
-[0-9]+ {                               /* decimal or octal values */
+({plus}|{minus})?[0-9]+ {                      /* decimal and octal integers */
        dfilter_lval.string = g_strdup(yytext);
-       return T_VAL_NUMBER_STRING;
+       return T_VAL_UNQUOTED_STRING;
 }
 
-
-0[xX][A-Fa-f0-9]+ {                    /* hex values */
+({plus}|{minus})?([0-9]+|[0-9]+\.[0-9]+|\.[0-9]+)([eE]({plus}|{minus})?[0-9]+)? {
+       /* I'm trying to capture all floating points here, and
+        * am using the strtod manpage as the description of
+        * valid formats */
        dfilter_lval.string = g_strdup(yytext);
-       return T_VAL_NUMBER_STRING;
+       return T_VAL_UNQUOTED_STRING;
 }
 
 [0-9\:\.]+ {