Huge thanks to our Platinum Members Endace and LiveAction,
and our Silver Member Veeam, for supporting the Wireshark Foundation and project.

Ethereal-dev: [Ethereal-dev] dfilter-modifications and inclusion of lib_ethereal.so

Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.

From: Håvard H Garnes <hhg@xxxxxxxxxx>
Date: Mon, 18 Jul 2005 09:00:21 +0200
Hello. As part of mapi-development (mapi.uninett.no) I have made this
patch to ethereals dfilter to extract information from packets. 

Ths patch also includes lib_ethereal, which was developed as part of the
scampi-project (ist-scampi.org) to link an ethereal-library into mapi
for packet and protocol analysis.

This patch is from my point of view not intended for inclusion into
ethereal as it is. However I would guess there are other uses for it, so
including it into ethereal might not be a bad idea if the patch is
looked over by someone with a more thorough understanding of the inner
workings of ethereal.

The new filter-addition is the keyword "return 'field'" which returns
the field-value in place of a gboolean from dfvm_apply. As I did not
have the time to find out how I could easily check if the value is a
string or an int, I had to double up the code in dfilter.c
(dfilter_apply_edt) to allow it to choose if it should return an int or
a char*.

The patch requires aclocal && automake && autoconf 

Håvard.

diff -ruN ../ethereal-0.10.11/Makefile.am ethereal/Makefile.am
--- ../ethereal-0.10.11/Makefile.am	2005-05-03 20:09:08.000000000 +0200
+++ ethereal/Makefile.am	2005-07-05 14:28:53.000000000 +0200
@@ -62,6 +62,7 @@
 #
 bin_PROGRAMS = @ethereal_bin@ @capinfos_bin@ @editcap_bin@ @mergecap_bin@ @tethereal_bin@ @dftest_bin@ @randpkt_bin@ @text2pcap_bin@
 bin_SCRIPTS = @idl2eth_bin@
+lib_LTLIBRARIES = @lib_ethereal_lib@
 man1_MANS = @ethereal_man@ @capinfos_man@ @editcap_man@ @mergecap_man@ @tethereal_man@ @text2pcap_man@ @idl2eth_man@
 man4_MANS = @etherealfilter_man@
 man_MANS =
@@ -69,6 +70,7 @@
 EXTRA_PROGRAMS = ethereal tethereal capinfos editcap mergecap dftest \
 	randpkt text2pcap
 EXTRA_SCRIPTS = idl2eth
+EXTRA_LTLIBRARIES = lib_ethereal.la
 
 #
 # Ethereal configuration files are put in $(pkgdatadir).  It currently
@@ -250,6 +252,14 @@
 tethereal_additional_libs =		\
 	wiretap/libwiretap.la		\
 	epan/libethereal.la
+	
+EXTRA_LTLIBRARIES = lib_ethereal.la
+
+lib_ethereal_la_additional_libs =		\
+	wiretap/libwiretap.la		\
+	epan/libethereal.la		\
+	epan/ftypes/libftypes.la		\
+	epan/dfilter/libdfilter.la
 
 # This is the automake dependency variable for the executable
 tethereal_DEPENDENCIES = \
@@ -266,6 +276,17 @@
 	@PCRE_LIBS@			\
 	@GLIB_LIBS@ -lm			\
 	@PCAP_LIBS@ @SOCKET_LIBS@ @NSL_LIBS@ @ADNS_LIBS@ @KRB5_LIBS@
+	
+lib_ethereal_la_DEPENDENCIES = \
+	$(lib_ethereal_la_additional_libs)
+
+lib_ethereal_la_LIBADD = \
+	$(lib_ethereal_la_additional_libs)	\
+	@SNMP_LIBS@ @SSL_LIBS@		\
+	@PCRE_LIBS@			\
+	@GLIB_LIBS@ -lm			\
+	@PCAP_LIBS@ @SOCKET_LIBS@ @NSL_LIBS@ @ADNS_LIBS@ @KRB5_LIBS@
+
 
 if ENABLE_STATIC
 tethereal_LDFLAGS = -Wl,-static -all-static
@@ -273,6 +294,9 @@
 tethereal_LDFLAGS = -export-dynamic
 endif
 
+	
+lib_ethereal_la_LDFLAGS = -module -rpath '$(libdir)'
+
 # Optional objects that I know how to build, and that are needed by
 # text2pcap.
 text2pcap_optional_objects = @STRERROR_O@ @STRPTIME_O@
@@ -283,6 +307,7 @@
 text2pcap_LDADD = $(text2pcap_optional_objects) \
 	@GLIB_LIBS@ -lm
 
+
 mergecap_DEPENDENCIES = wiretap/libwiretap.la
 
 # This is the automake dependency variable for the executable
diff -ruN ../ethereal-0.10.11/Makefile.common ethereal/Makefile.common
--- ../ethereal-0.10.11/Makefile.common	2005-05-02 23:28:53.000000000 +0200
+++ ethereal/Makefile.common	2005-07-06 14:39:19.000000000 +0200
@@ -77,7 +77,6 @@
 	clopts_common.c	\
 	conditions.c	\
 	disabled_protos.c	\
-	packet-range.c	\
 	pcap-util.c	\
 	print.c	\
 	ps.c	\
@@ -164,6 +163,7 @@
 	filters.c	\
 	g711.c \
 	merge.c	\
+	packet-range.c	\
 	proto_hier_stats.c	\
 	summary.c
 
@@ -192,8 +192,16 @@
 	$(ETHEREAL_COMMON_SRC)	\
 	$(TETHEREAL_TAP_SRC)	\
     capture_opts.c \
+	packet-range.c	\
 	tethereal-tap-register.c	\
 	tethereal.c
+	
+lib_ethereal_la_SOURCES =	\
+	$(ETHEREAL_COMMON_SRC)	\
+	$(TETHEREAL_TAP_SRC)	\
+	tethereal-tap-register.c	\
+	lib_ethereal.c
+#    capture_opts.c \
 
 # text2pcap specifics
 text2pcap_SOURCES = \
diff -ruN ../ethereal-0.10.11/configure.in ethereal/configure.in
--- ../ethereal-0.10.11/configure.in	2005-05-02 23:28:53.000000000 +0200
+++ ethereal/configure.in	2005-07-05 12:49:53.000000000 +0200
@@ -2,6 +2,7 @@
 #
 AC_INIT(etypes.h)
 
+
 AC_PREREQ(2.52)
 
 dnl Check for CPU / vendor / OS
@@ -19,6 +20,7 @@
 AC_DEFUN([AC_PROVIDE_AC_LIBTOOL_DLOPEN], )
 AC_LIBTOOL_DLOPEN
 AC_PROG_LIBTOOL
+AC_SUBST(LIBTOOL_DEPS)
 AC_PROG_YACC
 AM_PROG_LEX
 AC_PATH_PROG(PERL, perl)
@@ -316,6 +318,15 @@
 AC_ARG_ENABLE(ethereal,
 [  --enable-ethereal       build GTK+-based ethereal.  [default=yes]],enable_ethereal=$enableval,enable_ethereal=yes)
 
+AC_ARG_ENABLE(lib_ethereal,
+[  --enable-lib_ethereal      build lib_ethereal.  [default=yes]],lib_ethereal=$enableval,enable_lib_ethereal=yes)
+if test "x$enable_lib_ethereal" = "xyes" ; then
+	lib_ethereal_lib="lib_ethereal.la"
+else
+	lib_ethereal_lib=""
+fi
+AC_SUBST(lib_ethereal_lib)
+
 AC_ARG_ENABLE(gtk2,
 [  --disable-gtk2          build Glib1/Gtk1+-based (t)ethereal.  [default=no]],enable_gtk2=$enableval,enable_gtk2=yes)
 AM_CONDITIONAL(USE_GTK2, test x$enable_gtk2 = xyes)
@@ -1298,6 +1309,7 @@
 echo ""
 echo "The Ethereal package has been configured with the following options."
 echo "                    Build ethereal : $enable_ethereal"
+echo "                Build lib_ethereal : $enable_lib_ethereal"
 echo "                   Build tethereal : $enable_tethereal"
 echo "                    Build capinfos : $enable_capinfos"
 echo "                     Build editcap : $enable_editcap"
diff -ruN ../ethereal-0.10.11/epan/Makefile.am ethereal/epan/Makefile.am
--- ../ethereal-0.10.11/epan/Makefile.am	2005-05-02 23:28:50.000000000 +0200
+++ ethereal/epan/Makefile.am	2005-07-05 12:57:59.000000000 +0200
@@ -57,7 +57,6 @@
 	doxygen.cfg.in
 
 CLEANFILES = \
-	libethereal.a		\
 	libethereal.la		\
 	*~
 
@@ -66,6 +65,7 @@
 #
 libethereal_la_LIBADD = @G_ASCII_STRTOULL_LO@ @INET_ATON_LO@ @INET_PTON_LO@ @INET_NTOP_LO@ dfilter/libdfilter.la ftypes/libftypes.la dissectors/libdissectors.la
 libethereal_la_DEPENDENCIES = @G_ASCII_STRTOULL_LO@ @INET_ATON_LO@ @INET_PTON_LO@ @INET_NTOP_LO@ dfilter/libdfilter.la ftypes/libftypes.la dissectors/libdissectors.la
+libethereal_la_LDFLAGS = -export-dynamic
 
 tvbtest: tvbtest.o tvbuff.o except.o strutil.o
 	$(LINK) -o tvbtest tvbtest.o tvbuff.o except.o strutil.o `glib-config --libs`
diff -ruN ../ethereal-0.10.11/epan/dfilter/Makefile.am ethereal/epan/dfilter/Makefile.am
--- ../ethereal-0.10.11/epan/dfilter/Makefile.am	2005-05-02 23:28:08.000000000 +0200
+++ ethereal/epan/dfilter/Makefile.am	2005-07-05 12:59:14.000000000 +0200
@@ -24,7 +24,6 @@
 noinst_LTLIBRARIES = libdfilter.la
 
 CLEANFILES = \
-	libdfilter.a		\
 	libdfilter.la		\
 	*~
 
@@ -56,6 +55,8 @@
 	sttype-test.h		\
 	syntax-tree.c		\
 	syntax-tree.h
+	
+libdfilter_la_LDFLAGS=-export-dynamic
 
 EXTRA_DIST = \
 	grammar.lemon		\
diff -ruN ../ethereal-0.10.11/epan/dfilter/dfilter.c ethereal/epan/dfilter/dfilter.c
--- ../ethereal-0.10.11/epan/dfilter/dfilter.c	2005-05-02 23:28:08.000000000 +0200
+++ ethereal/epan/dfilter/dfilter.c	2005-07-07 14:20:59.000000000 +0200
@@ -44,6 +44,8 @@
 static gchar dfilter_error_msg_buf[1024];
 gchar *dfilter_error_msg;	/* NULL when no error resulted */
 
+return_e return_type;
+
 /* From scanner.c */
 void    df_scanner_text(const char *text);
 void    df_scanner_cleanup(void);
@@ -148,7 +150,6 @@
 	g_free(df);
 }
 
-
 static dfwork_t*
 dfwork_new(void)
 {
@@ -202,7 +203,8 @@
 	dfilter_error_msg = NULL;
 
 	dfw = dfwork_new();
-
+	/*printf("%s\n",text);
+	 */
 	df_scanner_text(text);
 
 	while (1) {
@@ -307,6 +309,28 @@
 	return dfvm_apply(df, tree);
 }
 
+
+gboolean
+dfilter_apply_edt_ret(dfilter_t *df, epan_dissect_t* edt,int rettype)
+{
+	char* ret;
+	if(rettype==1)
+	{
+//		printf("Setter ret_type=INT\n");
+		return_type=INT;
+	}
+	else
+	{
+//		printf("Setter ret_type=STRING\n");
+		return_type=STRING;
+		ret = dfvm_apply(df, edt->tree);
+//		printf("Og sitter med resultatet %s\n",ret);
+		return ret;
+	}
+	return dfvm_apply(df, edt->tree);
+}
+
+
 gboolean
 dfilter_apply_edt(dfilter_t *df, epan_dissect_t* edt)
 {
diff -ruN ../ethereal-0.10.11/epan/dfilter/dfvm.c ethereal/epan/dfilter/dfvm.c
--- ../ethereal-0.10.11/epan/dfilter/dfvm.c	2005-05-02 23:28:08.000000000 +0200
+++ ethereal/epan/dfilter/dfvm.c	2005-07-07 14:21:28.000000000 +0200
@@ -336,6 +336,7 @@
 	dfvm_value_t	*arg1;
 	dfvm_value_t	*arg2;
 	dfvm_value_t	*arg3;
+	gboolean		ret_val;
 	header_field_info	*hfinfo;
 
 	g_assert(tree);
@@ -436,6 +437,32 @@
 			case NOT:
 				accum = !accum;
 				break;
+				
+			case RT:
+				if(accum)
+				{
+					GList	*list_a;
+					char* per;
+					list_a = df->registers[arg1->value.numeric];
+					unsigned long long perper;
+					
+					per=list_a->data;
+					if(return_type == INT)
+					{
+						free_register_overhead(df);
+						return fvalue_get_integer(per);
+					}
+					if(return_type == STRING)
+					{
+						free_register_overhead(df);
+						return fvalue_get(per);
+					}
+				}
+				break;
 
 			case RETURN:
 				free_register_overhead(df);
diff -ruN ../ethereal-0.10.11/epan/dfilter/dfvm.h ethereal/epan/dfilter/dfvm.h
--- ../ethereal-0.10.11/epan/dfilter/dfvm.h	2005-05-02 23:28:08.000000000 +0200
+++ ethereal/epan/dfilter/dfvm.h	2005-07-07 11:36:21.000000000 +0200
@@ -29,6 +29,9 @@
 #include "syntax-tree.h"
 #include "drange.h"
 
+typedef enum {INT,STRING} return_e;
+extern return_e return_type;
+
 typedef enum {
 	EMPTY,
 	FVALUE,
@@ -70,7 +73,8 @@
 	ANY_BITWISE_AND,
 	ANY_CONTAINS,
 	ANY_MATCHES,
-	MK_RANGE
+	MK_RANGE,
+	RT
 
 } dfvm_opcode_t;
 
diff -ruN ../ethereal-0.10.11/epan/dfilter/gencode.c ethereal/epan/dfilter/gencode.c
--- ../ethereal-0.10.11/epan/dfilter/gencode.c	2005-05-02 23:28:08.000000000 +0200
+++ ethereal/epan/dfilter/gencode.c	2005-07-04 14:59:07.000000000 +0200
@@ -157,6 +157,51 @@
 
 
 static void
+gen_relation1(dfwork_t *dfw, dfvm_opcode_t op, stnode_t *st_arg1)
+{
+	sttype_id_t	type1;
+	dfvm_insn_t	*insn;
+	dfvm_value_t	*val1;
+	dfvm_value_t	*jmp1 = NULL;
+	int		reg1 = -1;
+	header_field_info	*hfinfo;
+
+	type1 = stnode_type_id(st_arg1);
+
+	if (type1 == STTYPE_FIELD) {
+		hfinfo = stnode_data(st_arg1);
+		reg1 = dfw_append_read_tree(dfw, hfinfo);
+		
+		insn = dfvm_insn_new(IF_FALSE_GOTO);
+		jmp1 = dfvm_value_new(INSN_NUMBER);
+		insn->arg1 = jmp1;
+		dfw_append_insn(dfw, insn);
+		
+	}
+	else if (type1 == STTYPE_FVALUE) {
+		reg1 = dfw_append_put_fvalue(dfw, stnode_data(st_arg1));
+	}
+	else if (type1 == STTYPE_RANGE) {
+		reg1 = dfw_append_mk_range(dfw, st_arg1);
+	}
+	else {
+		return;
+		g_assert_not_reached();
+	}
+
+
+	insn = dfvm_insn_new(op);
+	val1 = dfvm_value_new(REGISTER);
+	val1->value.numeric = reg1;
+	insn->arg1 = val1;
+	dfw_append_insn(dfw, insn);
+
+	if (jmp1) {
+		jmp1->value.numeric = dfw->next_insn_id;
+	}
+}
+
+static void
 gen_relation(dfwork_t *dfw, dfvm_opcode_t op, stnode_t *st_arg1, stnode_t *st_arg2)
 {
 	sttype_id_t	type1, type2;
@@ -331,6 +376,11 @@
 		case TEST_OP_MATCHES:
 			gen_relation(dfw, ANY_MATCHES, st_arg1, st_arg2);
 			break;
+			
+		case RET:
+			gen_relation1(dfw, RT, st_arg1);
+			break;
+			
 	}
 }
 
diff -ruN ../ethereal-0.10.11/epan/dfilter/grammar.c ethereal/epan/dfilter/grammar.c
--- ../ethereal-0.10.11/epan/dfilter/grammar.c	2005-06-29 15:42:45.000000000 +0200
+++ ethereal/epan/dfilter/grammar.c	2005-07-04 12:35:49.000000000 +0200
@@ -21,7 +21,7 @@
 /* First off, code is include which follows the "include" declaration
 ** in the input file. */
 #include <stdio.h>
-#line 3 "grammar.lemon"
+#line 3 "./grammar.lemon"
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -83,25 +83,25 @@
 */
 /*  */
 #define YYCODETYPE unsigned char
-#define YYNOCODE 35
+#define YYNOCODE 36
 #define YYACTIONTYPE unsigned char
 #define DfilterTOKENTYPE stnode_t*
 typedef union {
   DfilterTOKENTYPE yy0;
-  drange_node* yy25;
-  GSList* yy26;
-  test_op_t yy42;
-  stnode_t* yy51;
-  int yy69;
+  stnode_t* yy1;
+  test_op_t yy2;
+  GSList* yy7;
+  drange_node* yy45;
+  int yy71;
 } YYMINORTYPE;
 #define YYSTACKDEPTH 100
 #define DfilterARGDECL ,dfw
 #define DfilterXARGDECL dfwork_t *dfw;
 #define DfilterANSIARGDECL ,dfwork_t *dfw
-#define YYNSTATE 42
-#define YYNRULE 31
-#define YYERRORSYMBOL 27
-#define YYERRSYMDT yy69
+#define YYNSTATE 44
+#define YYNRULE 32
+#define YYERRORSYMBOL 28
+#define YYERRSYMDT yy71
 #define YY_NO_ACTION      (YYNSTATE+YYNRULE+2)
 #define YY_ACCEPT_ACTION  (YYNSTATE+YYNRULE+1)
 #define YY_ERROR_ACTION   (YYNSTATE+YYNRULE)
@@ -131,142 +131,142 @@
 };
 static struct yyActionEntry yyActionTable[] = {
 /* State 0 */
-  {  32,   3, &yyActionTable[   2] }, /*          relation_test shift  3 */
-  {  33,  74, 0                    }, /*               sentence accept */
-  {   0,  43, 0                    }, /*                      $ reduce 1 */
+  {   0,  45, 0                    }, /*                      $ reduce 1 */
+  {  33,   3, 0                    }, /*          relation_test shift  3 */
+  {  34,  77, 0                    }, /*               sentence accept */
   {   3,  14, 0                    }, /*                  FIELD shift  14 */
-  {   7,   5, 0                    }, /*                 LPAREN shift  5 */
-  {  21,  10, 0                    }, /*               TEST_NOT shift  10 */
-  {  10,  28, 0                    }, /*                 STRING shift  28 */
-  {  23,  29, &yyActionTable[   4] }, /*               UNPARSED shift  29 */
-  {YYNOCODE,0,0}, /* Unused */
+  {  11,  28, 0                    }, /*                 STRING shift  28 */
   {YYNOCODE,0,0}, /* Unused */
-  {  26,  12, &yyActionTable[   6] }, /*                 entity shift  12 */
+  {  22,  10, 0                    }, /*               TEST_NOT shift  10 */
+  {   7,   5, 0                    }, /*                 LPAREN shift  5 */
+  {  24,  29, 0                    }, /*               UNPARSED shift  29 */
+  {   9,  41, 0                    }, /*                    RET shift  41 */
   {YYNOCODE,0,0}, /* Unused */
-  {  28,   1, 0                    }, /*                   expr shift  1 */
-  {  29,   4, 0                    }, /*           logical_test shift  4 */
-  {  30,  30, 0                    }, /*                  range shift  30 */
+  {  27,  12, &yyActionTable[   4] }, /*                 entity shift  12 */
   {YYNOCODE,0,0}, /* Unused */
+  {  29,   1, 0                    }, /*                   expr shift  1 */
+  {  30,   4, 0                    }, /*           logical_test shift  4 */
+  {  31,  30, 0                    }, /*                  range shift  30 */
 /* State 1 */
-  {   0,  42, 0                    }, /*                      $ reduce 0 */
+  {  12,   2, &yyActionTable[  17] }, /*               TEST_AND shift  2 */
+  {   0,  44, 0                    }, /*                      $ reduce 0 */
   {YYNOCODE,0,0}, /* Unused */
-  {  22,   8, 0                    }, /*                TEST_OR shift  8 */
-  {  11,   2, 0                    }, /*               TEST_AND shift  2 */
+  {  23,   8, 0                    }, /*                TEST_OR shift  8 */
 /* State 2 */
-  {  32,   3, 0                    }, /*          relation_test shift  3 */
-  {   7,   5, 0                    }, /*                 LPAREN shift  5 */
-  {  10,  28, 0                    }, /*                 STRING shift  28 */
-  {   3,  14, 0                    }, /*                  FIELD shift  14 */
-  {YYNOCODE,0,0}, /* Unused */
-  {  21,  10, 0                    }, /*               TEST_NOT shift  10 */
+  {  11,  28, 0                    }, /*                 STRING shift  28 */
+  {  33,   3, 0                    }, /*          relation_test shift  3 */
   {YYNOCODE,0,0}, /* Unused */
-  {  23,  29, &yyActionTable[  21] }, /*               UNPARSED shift  29 */
+  {   3,  14, 0                    }, /*                  FIELD shift  14 */
   {YYNOCODE,0,0}, /* Unused */
   {YYNOCODE,0,0}, /* Unused */
-  {  26,  12, &yyActionTable[  22] }, /*                 entity shift  12 */
+  {  22,  10, 0                    }, /*               TEST_NOT shift  10 */
+  {   7,   5, 0                    }, /*                 LPAREN shift  5 */
+  {  24,  29, 0                    }, /*               UNPARSED shift  29 */
+  {   9,  41, 0                    }, /*                    RET shift  41 */
   {YYNOCODE,0,0}, /* Unused */
-  {  28,  41, 0                    }, /*                   expr shift  41 */
-  {  29,   4, 0                    }, /*           logical_test shift  4 */
-  {  30,  30, 0                    }, /*                  range shift  30 */
+  {  27,  12, &yyActionTable[  20] }, /*                 entity shift  12 */
   {YYNOCODE,0,0}, /* Unused */
+  {  29,  43, 0                    }, /*                   expr shift  43 */
+  {  30,   4, 0                    }, /*           logical_test shift  4 */
+  {  31,  30, 0                    }, /*                  range shift  30 */
 /* State 3 */
   {YYNOCODE,0,0}, /* Unused */
 /* State 4 */
   {YYNOCODE,0,0}, /* Unused */
 /* State 5 */
-  {  32,   3, 0                    }, /*          relation_test shift  3 */
-  {   7,   5, 0                    }, /*                 LPAREN shift  5 */
-  {  10,  28, 0                    }, /*                 STRING shift  28 */
-  {   3,  14, 0                    }, /*                  FIELD shift  14 */
-  {YYNOCODE,0,0}, /* Unused */
-  {  21,  10, 0                    }, /*               TEST_NOT shift  10 */
+  {  11,  28, 0                    }, /*                 STRING shift  28 */
+  {  33,   3, 0                    }, /*          relation_test shift  3 */
   {YYNOCODE,0,0}, /* Unused */
-  {  23,  29, &yyActionTable[  39] }, /*               UNPARSED shift  29 */
+  {   3,  14, 0                    }, /*                  FIELD shift  14 */
   {YYNOCODE,0,0}, /* Unused */
   {YYNOCODE,0,0}, /* Unused */
-  {  26,  12, &yyActionTable[  40] }, /*                 entity shift  12 */
+  {  22,  10, 0                    }, /*               TEST_NOT shift  10 */
+  {   7,   5, 0                    }, /*                 LPAREN shift  5 */
+  {  24,  29, 0                    }, /*               UNPARSED shift  29 */
+  {   9,  41, 0                    }, /*                    RET shift  41 */
   {YYNOCODE,0,0}, /* Unused */
-  {  28,   6, 0                    }, /*                   expr shift  6 */
-  {  29,   4, 0                    }, /*           logical_test shift  4 */
-  {  30,  30, 0                    }, /*                  range shift  30 */
+  {  27,  12, &yyActionTable[  38] }, /*                 entity shift  12 */
   {YYNOCODE,0,0}, /* Unused */
+  {  29,   6, 0                    }, /*                   expr shift  6 */
+  {  30,   4, 0                    }, /*           logical_test shift  4 */
+  {  31,  30, 0                    }, /*                  range shift  30 */
 /* State 6 */
+  {  12,   2, 0                    }, /*               TEST_AND shift  2 */
   {YYNOCODE,0,0}, /* Unused */
-  {   9,   7, 0                    }, /*                 RPAREN shift  7 */
-  {  22,   8, 0                    }, /*                TEST_OR shift  8 */
-  {  11,   2, 0                    }, /*               TEST_AND shift  2 */
+  {  10,   7, 0                    }, /*                 RPAREN shift  7 */
+  {  23,   8, 0                    }, /*                TEST_OR shift  8 */
 /* State 7 */
   {YYNOCODE,0,0}, /* Unused */
 /* State 8 */
-  {  32,   3, 0                    }, /*          relation_test shift  3 */
-  {   7,   5, 0                    }, /*                 LPAREN shift  5 */
-  {  10,  28, 0                    }, /*                 STRING shift  28 */
-  {   3,  14, 0                    }, /*                  FIELD shift  14 */
-  {YYNOCODE,0,0}, /* Unused */
-  {  21,  10, 0                    }, /*               TEST_NOT shift  10 */
+  {  11,  28, 0                    }, /*                 STRING shift  28 */
+  {  33,   3, 0                    }, /*          relation_test shift  3 */
   {YYNOCODE,0,0}, /* Unused */
-  {  23,  29, &yyActionTable[  60] }, /*               UNPARSED shift  29 */
+  {   3,  14, 0                    }, /*                  FIELD shift  14 */
   {YYNOCODE,0,0}, /* Unused */
   {YYNOCODE,0,0}, /* Unused */
-  {  26,  12, &yyActionTable[  61] }, /*                 entity shift  12 */
+  {  22,  10, 0                    }, /*               TEST_NOT shift  10 */
+  {   7,   5, 0                    }, /*                 LPAREN shift  5 */
+  {  24,  29, 0                    }, /*               UNPARSED shift  29 */
+  {   9,  41, 0                    }, /*                    RET shift  41 */
   {YYNOCODE,0,0}, /* Unused */
-  {  28,   9, 0                    }, /*                   expr shift  9 */
-  {  29,   4, 0                    }, /*           logical_test shift  4 */
-  {  30,  30, 0                    }, /*                  range shift  30 */
+  {  27,  12, &yyActionTable[  59] }, /*                 entity shift  12 */
   {YYNOCODE,0,0}, /* Unused */
+  {  29,   9, 0                    }, /*                   expr shift  9 */
+  {  30,   4, 0                    }, /*           logical_test shift  4 */
+  {  31,  30, 0                    }, /*                  range shift  30 */
 /* State 9 */
   {YYNOCODE,0,0}, /* Unused */
 /* State 10 */
-  {  32,   3, 0                    }, /*          relation_test shift  3 */
-  {   7,   5, 0                    }, /*                 LPAREN shift  5 */
-  {  10,  28, 0                    }, /*                 STRING shift  28 */
-  {   3,  14, 0                    }, /*                  FIELD shift  14 */
-  {YYNOCODE,0,0}, /* Unused */
-  {  21,  10, 0                    }, /*               TEST_NOT shift  10 */
+  {  11,  28, 0                    }, /*                 STRING shift  28 */
+  {  33,   3, 0                    }, /*          relation_test shift  3 */
   {YYNOCODE,0,0}, /* Unused */
-  {  23,  29, &yyActionTable[  77] }, /*               UNPARSED shift  29 */
+  {   3,  14, 0                    }, /*                  FIELD shift  14 */
   {YYNOCODE,0,0}, /* Unused */
   {YYNOCODE,0,0}, /* Unused */
-  {  26,  12, &yyActionTable[  78] }, /*                 entity shift  12 */
+  {  22,  10, 0                    }, /*               TEST_NOT shift  10 */
+  {   7,   5, 0                    }, /*                 LPAREN shift  5 */
+  {  24,  29, 0                    }, /*               UNPARSED shift  29 */
+  {   9,  41, 0                    }, /*                    RET shift  41 */
   {YYNOCODE,0,0}, /* Unused */
-  {  28,  11, 0                    }, /*                   expr shift  11 */
-  {  29,   4, 0                    }, /*           logical_test shift  4 */
-  {  30,  30, 0                    }, /*                  range shift  30 */
+  {  27,  12, &yyActionTable[  76] }, /*                 entity shift  12 */
   {YYNOCODE,0,0}, /* Unused */
+  {  29,  11, 0                    }, /*                   expr shift  11 */
+  {  30,   4, 0                    }, /*           logical_test shift  4 */
+  {  31,  30, 0                    }, /*                  range shift  30 */
 /* State 11 */
   {YYNOCODE,0,0}, /* Unused */
 /* State 12 */
-  {  16,  34, 0                    }, /*                TEST_GT shift  34 */
-  {  17,  37, 0                    }, /*                TEST_LE shift  37 */
-  {  18,  36, 0                    }, /*                TEST_LT shift  36 */
-  {  19,  40, 0                    }, /*           TEST_MATCHES shift  40 */
-  {  20,  33, 0                    }, /*                TEST_NE shift  33 */
-  {  15,  35, 0                    }, /*                TEST_GE shift  35 */
+  {  32,  13, &yyActionTable[  99] }, /*                rel_op2 shift  13 */
+  {  17,  34, 0                    }, /*                TEST_GT shift  34 */
+  {  18,  37, 0                    }, /*                TEST_LE shift  37 */
+  {  19,  36, 0                    }, /*                TEST_LT shift  36 */
+  {  20,  40, 0                    }, /*           TEST_MATCHES shift  40 */
+  {  21,  33, 0                    }, /*                TEST_NE shift  33 */
+  {  16,  35, 0                    }, /*                TEST_GE shift  35 */
   {YYNOCODE,0,0}, /* Unused */
   {YYNOCODE,0,0}, /* Unused */
   {YYNOCODE,0,0}, /* Unused */
   {YYNOCODE,0,0}, /* Unused */
   {YYNOCODE,0,0}, /* Unused */
   {YYNOCODE,0,0}, /* Unused */
-  {  12,  38, 0                    }, /*       TEST_BITWISE_AND shift  38 */
-  {  13,  39, 0                    }, /*          TEST_CONTAINS shift  39 */
-  {  14,  32, 0                    }, /*                TEST_EQ shift  32 */
-  {  31,  13, &yyActionTable[  98] }, /*                rel_op2 shift  13 */
+  {  13,  38, 0                    }, /*       TEST_BITWISE_AND shift  38 */
+  {  14,  39, 0                    }, /*          TEST_CONTAINS shift  39 */
+  {  15,  32, 0                    }, /*                TEST_EQ shift  32 */
 /* State 13 */
-  {  10,  28, 0                    }, /*                 STRING shift  28 */
-  {YYNOCODE,0,0}, /* Unused */
-  {  26,  31, &yyActionTable[ 109] }, /*                 entity shift  31 */
+  {  24,  29, 0                    }, /*               UNPARSED shift  29 */
+  {  11,  28, &yyActionTable[ 111] }, /*                 STRING shift  28 */
   {   3,  14, 0                    }, /*                  FIELD shift  14 */
+  {  27,  31, &yyActionTable[ 110] }, /*                 entity shift  31 */
   {YYNOCODE,0,0}, /* Unused */
   {YYNOCODE,0,0}, /* Unused */
-  {  30,  30, 0                    }, /*                  range shift  30 */
-  {  23,  29, 0                    }, /*               UNPARSED shift  29 */
+  {YYNOCODE,0,0}, /* Unused */
+  {  31,  30, 0                    }, /*                  range shift  30 */
 /* State 14 */
   {   6,  15, 0                    }, /*               LBRACKET shift  15 */
 /* State 15 */
-  {  24,  27, 0                    }, /*                 drnode shift  27 */
-  {  25,  16, &yyActionTable[ 120] }, /*            drnode_list shift  16 */
   {   5,  20, &yyActionTable[ 121] }, /*                INTEGER shift  20 */
+  {  25,  27, &yyActionTable[ 118] }, /*                 drnode shift  27 */
+  {  26,  16, 0                    }, /*            drnode_list shift  16 */
   {   1,  25, 0                    }, /*                  COLON shift  25 */
 /* State 16 */
   {   8,  17, &yyActionTable[ 123] }, /*               RBRACKET shift  17 */
@@ -274,8 +274,8 @@
 /* State 17 */
   {YYNOCODE,0,0}, /* Unused */
 /* State 18 */
-  {  24,  19, 0                    }, /*                 drnode shift  19 */
   {   5,  20, &yyActionTable[ 127] }, /*                INTEGER shift  20 */
+  {  25,  19, &yyActionTable[ 125] }, /*                 drnode shift  19 */
   {   1,  25, 0                    }, /*                  COLON shift  25 */
   {YYNOCODE,0,0}, /* Unused */
 /* State 19 */
@@ -324,7 +324,18 @@
 /* State 40 */
   {YYNOCODE,0,0}, /* Unused */
 /* State 41 */
-  {  22,   8, 0                    }, /*                TEST_OR shift  8 */
+  {  24,  29, 0                    }, /*               UNPARSED shift  29 */
+  {  11,  28, &yyActionTable[ 154] }, /*                 STRING shift  28 */
+  {   3,  14, 0                    }, /*                  FIELD shift  14 */
+  {  27,  42, &yyActionTable[ 153] }, /*                 entity shift  42 */
+  {YYNOCODE,0,0}, /* Unused */
+  {YYNOCODE,0,0}, /* Unused */
+  {YYNOCODE,0,0}, /* Unused */
+  {  31,  30, 0                    }, /*                  range shift  30 */
+/* State 42 */
+  {YYNOCODE,0,0}, /* Unused */
+/* State 43 */
+  {  23,   8, 0                    }, /*                TEST_OR shift  8 */
 };
 
 /* The state table contains information needed to look up the correct
@@ -345,48 +356,50 @@
   YYACTIONTYPE actionDefault;    /* Default action if look-ahead not found */
 };
 static struct yyStateEntry yyStateTable[] = {
-  { &yyActionTable[0], 15, 73},
-  { &yyActionTable[16], 3, 73},
-  { &yyActionTable[20], 15, 73},
-  { &yyActionTable[36], 0, 44},
-  { &yyActionTable[37], 0, 45},
-  { &yyActionTable[38], 15, 73},
-  { &yyActionTable[54], 3, 73},
-  { &yyActionTable[58], 0, 46},
-  { &yyActionTable[59], 15, 73},
-  { &yyActionTable[75], 0, 48},
-  { &yyActionTable[76], 15, 73},
-  { &yyActionTable[92], 0, 49},
-  { &yyActionTable[93], 15, 50},
-  { &yyActionTable[109], 7, 73},
-  { &yyActionTable[117], 0, 51},
-  { &yyActionTable[118], 3, 73},
-  { &yyActionTable[122], 1, 73},
-  { &yyActionTable[124], 0, 55},
-  { &yyActionTable[125], 3, 73},
-  { &yyActionTable[129], 0, 57},
-  { &yyActionTable[130], 1, 62},
-  { &yyActionTable[132], 0, 61},
-  { &yyActionTable[133], 0, 58},
-  { &yyActionTable[134], 0, 73},
-  { &yyActionTable[135], 0, 59},
-  { &yyActionTable[136], 0, 73},
-  { &yyActionTable[137], 0, 60},
-  { &yyActionTable[138], 0, 56},
-  { &yyActionTable[139], 0, 52},
-  { &yyActionTable[140], 0, 53},
-  { &yyActionTable[141], 0, 54},
-  { &yyActionTable[142], 0, 63},
-  { &yyActionTable[143], 0, 64},
-  { &yyActionTable[144], 0, 65},
-  { &yyActionTable[145], 0, 66},
-  { &yyActionTable[146], 0, 67},
-  { &yyActionTable[147], 0, 68},
-  { &yyActionTable[148], 0, 69},
-  { &yyActionTable[149], 0, 70},
-  { &yyActionTable[150], 0, 71},
-  { &yyActionTable[151], 0, 72},
-  { &yyActionTable[152], 0, 47},
+  { &yyActionTable[0], 15, 76},
+  { &yyActionTable[16], 3, 76},
+  { &yyActionTable[20], 15, 76},
+  { &yyActionTable[36], 0, 46},
+  { &yyActionTable[37], 0, 47},
+  { &yyActionTable[38], 15, 76},
+  { &yyActionTable[54], 3, 76},
+  { &yyActionTable[58], 0, 48},
+  { &yyActionTable[59], 15, 76},
+  { &yyActionTable[75], 0, 50},
+  { &yyActionTable[76], 15, 76},
+  { &yyActionTable[92], 0, 51},
+  { &yyActionTable[93], 15, 52},
+  { &yyActionTable[109], 7, 76},
+  { &yyActionTable[117], 0, 53},
+  { &yyActionTable[118], 3, 76},
+  { &yyActionTable[122], 1, 76},
+  { &yyActionTable[124], 0, 57},
+  { &yyActionTable[125], 3, 76},
+  { &yyActionTable[129], 0, 59},
+  { &yyActionTable[130], 1, 64},
+  { &yyActionTable[132], 0, 63},
+  { &yyActionTable[133], 0, 60},
+  { &yyActionTable[134], 0, 76},
+  { &yyActionTable[135], 0, 61},
+  { &yyActionTable[136], 0, 76},
+  { &yyActionTable[137], 0, 62},
+  { &yyActionTable[138], 0, 58},
+  { &yyActionTable[139], 0, 54},
+  { &yyActionTable[140], 0, 55},
+  { &yyActionTable[141], 0, 56},
+  { &yyActionTable[142], 0, 65},
+  { &yyActionTable[143], 0, 67},
+  { &yyActionTable[144], 0, 68},
+  { &yyActionTable[145], 0, 69},
+  { &yyActionTable[146], 0, 70},
+  { &yyActionTable[147], 0, 71},
+  { &yyActionTable[148], 0, 72},
+  { &yyActionTable[149], 0, 73},
+  { &yyActionTable[150], 0, 74},
+  { &yyActionTable[151], 0, 75},
+  { &yyActionTable[152], 7, 76},
+  { &yyActionTable[160], 0, 66},
+  { &yyActionTable[161], 0, 49},
 };
 
 /* The following structure represents a single element of the
@@ -453,13 +466,13 @@
 static char *yyTokenName[] = {
   "$",             "COLON",         "COMMA",         "FIELD",       
   "HYPHEN",        "INTEGER",       "LBRACKET",      "LPAREN",      
-  "RBRACKET",      "RPAREN",        "STRING",        "TEST_AND",    
-  "TEST_BITWISE_AND",  "TEST_CONTAINS",  "TEST_EQ",       "TEST_GE",     
-  "TEST_GT",       "TEST_LE",       "TEST_LT",       "TEST_MATCHES",
-  "TEST_NE",       "TEST_NOT",      "TEST_OR",       "UNPARSED",    
-  "drnode",        "drnode_list",   "entity",        "error",       
-  "expr",          "logical_test",  "range",         "rel_op2",     
-  "relation_test",  "sentence",    
+  "RBRACKET",      "RET",           "RPAREN",        "STRING",      
+  "TEST_AND",      "TEST_BITWISE_AND",  "TEST_CONTAINS",  "TEST_EQ",     
+  "TEST_GE",       "TEST_GT",       "TEST_LE",       "TEST_LT",     
+  "TEST_MATCHES",  "TEST_NE",       "TEST_NOT",      "TEST_OR",     
+  "UNPARSED",      "drnode",        "drnode_list",   "entity",      
+  "error",         "expr",          "logical_test",  "range",       
+  "rel_op2",       "relation_test",  "sentence",    
 };
 #define YYTRACE(X) if( yyTraceFILE ) fprintf(yyTraceFILE,"%sReduce [%s].\n",yyTracePrompt,X);
 #else
@@ -527,49 +540,50 @@
     case 21:
     case 22:
     case 23:
-#line 24 "grammar.lemon"
-{stnode_free((yypminor->yy0));}
-#line 532 "grammar.c"
-      break;
     case 24:
-#line 47 "grammar.lemon"
-{drange_node_free((yypminor->yy25));}
-#line 537 "grammar.c"
+#line 24 "./grammar.lemon"
+{stnode_free((yypminor->yy0));}
+#line 546 "grammar.c"
       break;
     case 25:
-#line 50 "grammar.lemon"
-{drange_node_free_list((yypminor->yy26));}
-#line 542 "grammar.c"
+#line 47 "./grammar.lemon"
+{drange_node_free((yypminor->yy45));}
+#line 551 "grammar.c"
       break;
     case 26:
-#line 33 "grammar.lemon"
-{stnode_free((yypminor->yy51));}
-#line 547 "grammar.c"
+#line 50 "./grammar.lemon"
+{drange_node_free_list((yypminor->yy7));}
+#line 556 "grammar.c"
       break;
-    case 28:
-#line 30 "grammar.lemon"
-{stnode_free((yypminor->yy51));}
-#line 552 "grammar.c"
+    case 27:
+#line 33 "./grammar.lemon"
+{stnode_free((yypminor->yy1));}
+#line 561 "grammar.c"
       break;
     case 29:
-#line 39 "grammar.lemon"
-{stnode_free((yypminor->yy51));}
-#line 557 "grammar.c"
+#line 30 "./grammar.lemon"
+{stnode_free((yypminor->yy1));}
+#line 566 "grammar.c"
       break;
     case 30:
-#line 44 "grammar.lemon"
-{stnode_free((yypminor->yy51));}
-#line 562 "grammar.c"
+#line 39 "./grammar.lemon"
+{stnode_free((yypminor->yy1));}
+#line 571 "grammar.c"
       break;
-    case 32:
-#line 36 "grammar.lemon"
-{stnode_free((yypminor->yy51));}
-#line 567 "grammar.c"
+    case 31:
+#line 44 "./grammar.lemon"
+{stnode_free((yypminor->yy1));}
+#line 576 "grammar.c"
       break;
     case 33:
-#line 27 "grammar.lemon"
-{stnode_free((yypminor->yy51));}
-#line 572 "grammar.c"
+#line 36 "./grammar.lemon"
+{stnode_free((yypminor->yy1));}
+#line 581 "grammar.c"
+      break;
+    case 34:
+#line 27 "./grammar.lemon"
+{stnode_free((yypminor->yy1));}
+#line 586 "grammar.c"
       break;
     default:  break;   /* If no destructor action specified: do nothing */
   }
@@ -697,37 +711,38 @@
   YYCODETYPE lhs;         /* Symbol on the left-hand side of the rule */
   unsigned char nrhs;     /* Number of right-hand side symbols in the rule */
 } yyRuleInfo[] = {
-  { 33, 1 },
-  { 33, 0 },
-  { 28, 1 },
-  { 28, 1 },
-  { 28, 3 },
-  { 29, 3 },
-  { 29, 3 },
-  { 29, 2 },
+  { 34, 1 },
+  { 34, 0 },
   { 29, 1 },
+  { 29, 1 },
+  { 29, 3 },
+  { 30, 3 },
+  { 30, 3 },
+  { 30, 2 },
+  { 30, 1 },
+  { 27, 1 },
+  { 27, 1 },
+  { 27, 1 },
+  { 27, 1 },
+  { 31, 4 },
   { 26, 1 },
-  { 26, 1 },
-  { 26, 1 },
-  { 26, 1 },
-  { 30, 4 },
-  { 25, 1 },
+  { 26, 3 },
+  { 25, 3 },
   { 25, 3 },
-  { 24, 3 },
-  { 24, 3 },
-  { 24, 2 },
-  { 24, 2 },
-  { 24, 1 },
-  { 32, 3 },
-  { 31, 1 },
-  { 31, 1 },
-  { 31, 1 },
-  { 31, 1 },
-  { 31, 1 },
-  { 31, 1 },
-  { 31, 1 },
-  { 31, 1 },
-  { 31, 1 },
+  { 25, 2 },
+  { 25, 2 },
+  { 25, 1 },
+  { 33, 3 },
+  { 33, 2 },
+  { 32, 1 },
+  { 32, 1 },
+  { 32, 1 },
+  { 32, 1 },
+  { 32, 1 },
+  { 32, 1 },
+  { 32, 1 },
+  { 32, 1 },
+  { 32, 1 },
 };
 
 static void yy_accept(
@@ -762,270 +777,280 @@
   */
       case 0:
         YYTRACE("sentence ::= expr")
-#line 115 "grammar.lemon"
-{ dfw->st_root = yymsp[0].minor.yy51; }
-#line 767 "grammar.c"
+#line 116 "./grammar.lemon"
+{ dfw->st_root = yymsp[0].minor.yy1; }
+#line 782 "grammar.c"
         break;
       case 1:
         YYTRACE("sentence ::=")
-#line 116 "grammar.lemon"
+#line 117 "./grammar.lemon"
 { dfw->st_root = NULL; }
-#line 773 "grammar.c"
+#line 788 "grammar.c"
         break;
       case 2:
         YYTRACE("expr ::= relation_test")
-#line 118 "grammar.lemon"
-{ yygotominor.yy51 = yymsp[0].minor.yy51; }
-#line 779 "grammar.c"
+#line 119 "./grammar.lemon"
+{ yygotominor.yy1 = yymsp[0].minor.yy1; }
+#line 794 "grammar.c"
         break;
       case 3:
         YYTRACE("expr ::= logical_test")
-#line 119 "grammar.lemon"
-{ yygotominor.yy51 = yymsp[0].minor.yy51; }
-#line 785 "grammar.c"
+#line 120 "./grammar.lemon"
+{ yygotominor.yy1 = yymsp[0].minor.yy1; }
+#line 800 "grammar.c"
         break;
       case 4:
         YYTRACE("expr ::= LPAREN expr RPAREN")
-#line 122 "grammar.lemon"
+#line 122 "./grammar.lemon"
 {
-	yygotominor.yy51 = yymsp[-1].minor.yy51;
+	yygotominor.yy1 = yymsp[-1].minor.yy1;
 }
-#line 793 "grammar.c"
+#line 808 "grammar.c"
   yy_destructor(7,&yymsp[-2].minor);
-  yy_destructor(9,&yymsp[0].minor);
+  yy_destructor(10,&yymsp[0].minor);
         break;
       case 5:
         YYTRACE("logical_test ::= expr TEST_AND expr")
-#line 129 "grammar.lemon"
+#line 129 "./grammar.lemon"
 {
-	yygotominor.yy51 = stnode_new(STTYPE_TEST, NULL);
-	sttype_test_set2(yygotominor.yy51, TEST_OP_AND, yymsp[-2].minor.yy51, yymsp[0].minor.yy51);
+	yygotominor.yy1 = stnode_new(STTYPE_TEST, NULL);
+	sttype_test_set2(yygotominor.yy1, TEST_OP_AND, yymsp[-2].minor.yy1, yymsp[0].minor.yy1);
 }
-#line 804 "grammar.c"
-  yy_destructor(11,&yymsp[-1].minor);
+#line 819 "grammar.c"
+  yy_destructor(12,&yymsp[-1].minor);
         break;
       case 6:
         YYTRACE("logical_test ::= expr TEST_OR expr")
-#line 135 "grammar.lemon"
+#line 135 "./grammar.lemon"
 {
-	yygotominor.yy51 = stnode_new(STTYPE_TEST, NULL);
-	sttype_test_set2(yygotominor.yy51, TEST_OP_OR, yymsp[-2].minor.yy51, yymsp[0].minor.yy51);
+	yygotominor.yy1 = stnode_new(STTYPE_TEST, NULL);
+	sttype_test_set2(yygotominor.yy1, TEST_OP_OR, yymsp[-2].minor.yy1, yymsp[0].minor.yy1);
 }
-#line 814 "grammar.c"
-  yy_destructor(22,&yymsp[-1].minor);
+#line 829 "grammar.c"
+  yy_destructor(23,&yymsp[-1].minor);
         break;
       case 7:
         YYTRACE("logical_test ::= TEST_NOT expr")
-#line 141 "grammar.lemon"
+#line 141 "./grammar.lemon"
 {
-	yygotominor.yy51 = stnode_new(STTYPE_TEST, NULL);
-	sttype_test_set1(yygotominor.yy51, TEST_OP_NOT, yymsp[0].minor.yy51);
+	yygotominor.yy1 = stnode_new(STTYPE_TEST, NULL);
+	sttype_test_set1(yygotominor.yy1, TEST_OP_NOT, yymsp[0].minor.yy1);
 }
-#line 824 "grammar.c"
-  yy_destructor(21,&yymsp[-1].minor);
+#line 839 "grammar.c"
+  yy_destructor(22,&yymsp[-1].minor);
         break;
       case 8:
         YYTRACE("logical_test ::= entity")
-#line 147 "grammar.lemon"
+#line 147 "./grammar.lemon"
 {
-	yygotominor.yy51 = stnode_new(STTYPE_TEST, NULL);
-	sttype_test_set1(yygotominor.yy51, TEST_OP_EXISTS, yymsp[0].minor.yy51);
+	yygotominor.yy1 = stnode_new(STTYPE_TEST, NULL);
+	sttype_test_set1(yygotominor.yy1, TEST_OP_EXISTS, yymsp[0].minor.yy1);
 }
-#line 834 "grammar.c"
+#line 849 "grammar.c"
         break;
       case 9:
         YYTRACE("entity ::= FIELD")
-#line 155 "grammar.lemon"
-{ yygotominor.yy51 = yymsp[0].minor.yy0; }
-#line 840 "grammar.c"
+#line 155 "./grammar.lemon"
+{ yygotominor.yy1 = yymsp[0].minor.yy0; }
+#line 855 "grammar.c"
         break;
       case 10:
         YYTRACE("entity ::= STRING")
-#line 156 "grammar.lemon"
-{ yygotominor.yy51 = yymsp[0].minor.yy0; }
-#line 846 "grammar.c"
+#line 156 "./grammar.lemon"
+{ yygotominor.yy1 = yymsp[0].minor.yy0; }
+#line 861 "grammar.c"
         break;
       case 11:
         YYTRACE("entity ::= UNPARSED")
-#line 157 "grammar.lemon"
-{ yygotominor.yy51 = yymsp[0].minor.yy0; }
-#line 852 "grammar.c"
+#line 157 "./grammar.lemon"
+{ yygotominor.yy1 = yymsp[0].minor.yy0; }
+#line 867 "grammar.c"
         break;
       case 12:
         YYTRACE("entity ::= range")
-#line 158 "grammar.lemon"
-{ yygotominor.yy51 = yymsp[0].minor.yy51; }
-#line 858 "grammar.c"
+#line 158 "./grammar.lemon"
+{ yygotominor.yy1 = yymsp[0].minor.yy1; }
+#line 873 "grammar.c"
         break;
       case 13:
         YYTRACE("range ::= FIELD LBRACKET drnode_list RBRACKET")
-#line 163 "grammar.lemon"
+#line 163 "./grammar.lemon"
 {
-	yygotominor.yy51 = stnode_new(STTYPE_RANGE, NULL);
-	sttype_range_set(yygotominor.yy51, yymsp[-3].minor.yy0, yymsp[-1].minor.yy26);
+	yygotominor.yy1 = stnode_new(STTYPE_RANGE, NULL);
+	sttype_range_set(yygotominor.yy1, yymsp[-3].minor.yy0, yymsp[-1].minor.yy7);
 
 	/* Delete the list, but not the drange_nodes that
 	 * the list contains. */
-	g_slist_free(yymsp[-1].minor.yy26);
+	g_slist_free(yymsp[-1].minor.yy7);
 }
-#line 871 "grammar.c"
+#line 886 "grammar.c"
   yy_destructor(6,&yymsp[-2].minor);
   yy_destructor(8,&yymsp[0].minor);
         break;
       case 14:
         YYTRACE("drnode_list ::= drnode")
-#line 173 "grammar.lemon"
+#line 173 "./grammar.lemon"
 {
-	yygotominor.yy26 = g_slist_append(NULL, yymsp[0].minor.yy25);
+	yygotominor.yy7 = g_slist_append(NULL, yymsp[0].minor.yy45);
 }
-#line 881 "grammar.c"
+#line 896 "grammar.c"
         break;
       case 15:
         YYTRACE("drnode_list ::= drnode_list COMMA drnode")
-#line 178 "grammar.lemon"
+#line 178 "./grammar.lemon"
 {
-	yygotominor.yy26 = g_slist_append(yymsp[-2].minor.yy26, yymsp[0].minor.yy25);
+	yygotominor.yy7 = g_slist_append(yymsp[-2].minor.yy7, yymsp[0].minor.yy45);
 }
-#line 889 "grammar.c"
+#line 904 "grammar.c"
   yy_destructor(2,&yymsp[-1].minor);
         break;
       case 16:
         YYTRACE("drnode ::= INTEGER COLON INTEGER")
-#line 184 "grammar.lemon"
+#line 184 "./grammar.lemon"
 {
-	yygotominor.yy25 = drange_node_new();
-	drange_node_set_start_offset(yygotominor.yy25, stnode_value(yymsp[-2].minor.yy0));
-	drange_node_set_length(yygotominor.yy25, stnode_value(yymsp[0].minor.yy0));
+	yygotominor.yy45 = drange_node_new();
+	drange_node_set_start_offset(yygotominor.yy45, stnode_value(yymsp[-2].minor.yy0));
+	drange_node_set_length(yygotominor.yy45, stnode_value(yymsp[0].minor.yy0));
 	
 	stnode_free(yymsp[-2].minor.yy0);
 	stnode_free(yymsp[0].minor.yy0);
 }
-#line 903 "grammar.c"
+#line 918 "grammar.c"
   yy_destructor(1,&yymsp[-1].minor);
         break;
       case 17:
         YYTRACE("drnode ::= INTEGER HYPHEN INTEGER")
-#line 195 "grammar.lemon"
+#line 195 "./grammar.lemon"
 {
-	yygotominor.yy25 = drange_node_new();
-	drange_node_set_start_offset(yygotominor.yy25, stnode_value(yymsp[-2].minor.yy0));
-	drange_node_set_end_offset(yygotominor.yy25, stnode_value(yymsp[0].minor.yy0));
+	yygotominor.yy45 = drange_node_new();
+	drange_node_set_start_offset(yygotominor.yy45, stnode_value(yymsp[-2].minor.yy0));
+	drange_node_set_end_offset(yygotominor.yy45, stnode_value(yymsp[0].minor.yy0));
 	
 	stnode_free(yymsp[-2].minor.yy0);
 	stnode_free(yymsp[0].minor.yy0);
 }
-#line 917 "grammar.c"
+#line 932 "grammar.c"
   yy_destructor(4,&yymsp[-1].minor);
         break;
       case 18:
         YYTRACE("drnode ::= COLON INTEGER")
-#line 207 "grammar.lemon"
+#line 207 "./grammar.lemon"
 {
-	yygotominor.yy25 = drange_node_new();
-	drange_node_set_start_offset(yygotominor.yy25, 0);
-	drange_node_set_length(yygotominor.yy25, stnode_value(yymsp[0].minor.yy0));
+	yygotominor.yy45 = drange_node_new();
+	drange_node_set_start_offset(yygotominor.yy45, 0);
+	drange_node_set_length(yygotominor.yy45, stnode_value(yymsp[0].minor.yy0));
 
 	stnode_free(yymsp[0].minor.yy0);
 }
-#line 930 "grammar.c"
+#line 945 "grammar.c"
   yy_destructor(1,&yymsp[-1].minor);
         break;
       case 19:
         YYTRACE("drnode ::= INTEGER COLON")
-#line 217 "grammar.lemon"
+#line 217 "./grammar.lemon"
 {
-	yygotominor.yy25 = drange_node_new();
-	drange_node_set_start_offset(yygotominor.yy25, stnode_value(yymsp[-1].minor.yy0));
-	drange_node_set_to_the_end(yygotominor.yy25);
+	yygotominor.yy45 = drange_node_new();
+	drange_node_set_start_offset(yygotominor.yy45, stnode_value(yymsp[-1].minor.yy0));
+	drange_node_set_to_the_end(yygotominor.yy45);
 
 	stnode_free(yymsp[-1].minor.yy0);
 }
-#line 943 "grammar.c"
+#line 958 "grammar.c"
   yy_destructor(1,&yymsp[0].minor);
         break;
       case 20:
         YYTRACE("drnode ::= INTEGER")
-#line 227 "grammar.lemon"
+#line 227 "./grammar.lemon"
 {
-	yygotominor.yy25 = drange_node_new();
-	drange_node_set_start_offset(yygotominor.yy25, stnode_value(yymsp[0].minor.yy0));
-	drange_node_set_length(yygotominor.yy25, 1);
+	yygotominor.yy45 = drange_node_new();
+	drange_node_set_start_offset(yygotominor.yy45, stnode_value(yymsp[0].minor.yy0));
+	drange_node_set_length(yygotominor.yy45, 1);
 
 	stnode_free(yymsp[0].minor.yy0);
 }
-#line 956 "grammar.c"
+#line 971 "grammar.c"
         break;
       case 21:
         YYTRACE("relation_test ::= entity rel_op2 entity")
-#line 239 "grammar.lemon"
+#line 239 "./grammar.lemon"
 {
-	yygotominor.yy51 = stnode_new(STTYPE_TEST, NULL);
-	sttype_test_set2(yygotominor.yy51, yymsp[-1].minor.yy42, yymsp[-2].minor.yy51, yymsp[0].minor.yy51);
+	yygotominor.yy1 = stnode_new(STTYPE_TEST, NULL);
+	sttype_test_set2(yygotominor.yy1, yymsp[-1].minor.yy2, yymsp[-2].minor.yy1, yymsp[0].minor.yy1);
 }
-#line 965 "grammar.c"
+#line 980 "grammar.c"
         break;
       case 22:
-        YYTRACE("rel_op2 ::= TEST_EQ")
-#line 244 "grammar.lemon"
-{ yygotominor.yy42 = TEST_OP_EQ; }
-#line 971 "grammar.c"
-  yy_destructor(14,&yymsp[0].minor);
+        YYTRACE("relation_test ::= RET entity")
+#line 245 "./grammar.lemon"
+{
+	yygotominor.yy1 = stnode_new(STTYPE_TEST, NULL);
+	sttype_test_set1(yygotominor.yy1, RET, yymsp[0].minor.yy1);
+}
+#line 989 "grammar.c"
+  yy_destructor(9,&yymsp[-1].minor);
         break;
       case 23:
-        YYTRACE("rel_op2 ::= TEST_NE")
-#line 245 "grammar.lemon"
-{ yygotominor.yy42 = TEST_OP_NE; }
-#line 978 "grammar.c"
-  yy_destructor(20,&yymsp[0].minor);
+        YYTRACE("rel_op2 ::= TEST_EQ")
+#line 251 "./grammar.lemon"
+{ yygotominor.yy2 = TEST_OP_EQ; }
+#line 996 "grammar.c"
+  yy_destructor(15,&yymsp[0].minor);
         break;
       case 24:
-        YYTRACE("rel_op2 ::= TEST_GT")
-#line 246 "grammar.lemon"
-{ yygotominor.yy42 = TEST_OP_GT; }
-#line 985 "grammar.c"
-  yy_destructor(16,&yymsp[0].minor);
+        YYTRACE("rel_op2 ::= TEST_NE")
+#line 252 "./grammar.lemon"
+{ yygotominor.yy2 = TEST_OP_NE; }
+#line 1003 "grammar.c"
+  yy_destructor(21,&yymsp[0].minor);
         break;
       case 25:
-        YYTRACE("rel_op2 ::= TEST_GE")
-#line 247 "grammar.lemon"
-{ yygotominor.yy42 = TEST_OP_GE; }
-#line 992 "grammar.c"
-  yy_destructor(15,&yymsp[0].minor);
+        YYTRACE("rel_op2 ::= TEST_GT")
+#line 253 "./grammar.lemon"
+{ yygotominor.yy2 = TEST_OP_GT; }
+#line 1010 "grammar.c"
+  yy_destructor(17,&yymsp[0].minor);
         break;
       case 26:
-        YYTRACE("rel_op2 ::= TEST_LT")
-#line 248 "grammar.lemon"
-{ yygotominor.yy42 = TEST_OP_LT; }
-#line 999 "grammar.c"
-  yy_destructor(18,&yymsp[0].minor);
+        YYTRACE("rel_op2 ::= TEST_GE")
+#line 254 "./grammar.lemon"
+{ yygotominor.yy2 = TEST_OP_GE; }
+#line 1017 "grammar.c"
+  yy_destructor(16,&yymsp[0].minor);
         break;
       case 27:
-        YYTRACE("rel_op2 ::= TEST_LE")
-#line 249 "grammar.lemon"
-{ yygotominor.yy42 = TEST_OP_LE; }
-#line 1006 "grammar.c"
-  yy_destructor(17,&yymsp[0].minor);
+        YYTRACE("rel_op2 ::= TEST_LT")
+#line 255 "./grammar.lemon"
+{ yygotominor.yy2 = TEST_OP_LT; }
+#line 1024 "grammar.c"
+  yy_destructor(19,&yymsp[0].minor);
         break;
       case 28:
-        YYTRACE("rel_op2 ::= TEST_BITWISE_AND")
-#line 250 "grammar.lemon"
-{ yygotominor.yy42 = TEST_OP_BITWISE_AND; }
-#line 1013 "grammar.c"
-  yy_destructor(12,&yymsp[0].minor);
+        YYTRACE("rel_op2 ::= TEST_LE")
+#line 256 "./grammar.lemon"
+{ yygotominor.yy2 = TEST_OP_LE; }
+#line 1031 "grammar.c"
+  yy_destructor(18,&yymsp[0].minor);
         break;
       case 29:
-        YYTRACE("rel_op2 ::= TEST_CONTAINS")
-#line 251 "grammar.lemon"
-{ yygotominor.yy42 = TEST_OP_CONTAINS; }
-#line 1020 "grammar.c"
+        YYTRACE("rel_op2 ::= TEST_BITWISE_AND")
+#line 257 "./grammar.lemon"
+{ yygotominor.yy2 = TEST_OP_BITWISE_AND; }
+#line 1038 "grammar.c"
   yy_destructor(13,&yymsp[0].minor);
         break;
       case 30:
+        YYTRACE("rel_op2 ::= TEST_CONTAINS")
+#line 258 "./grammar.lemon"
+{ yygotominor.yy2 = TEST_OP_CONTAINS; }
+#line 1045 "grammar.c"
+  yy_destructor(14,&yymsp[0].minor);
+        break;
+      case 31:
         YYTRACE("rel_op2 ::= TEST_MATCHES")
-#line 252 "grammar.lemon"
-{ yygotominor.yy42 = TEST_OP_MATCHES; }
-#line 1027 "grammar.c"
-  yy_destructor(19,&yymsp[0].minor);
+#line 259 "./grammar.lemon"
+{ yygotominor.yy2 = TEST_OP_MATCHES; }
+#line 1052 "grammar.c"
+  yy_destructor(20,&yymsp[0].minor);
         break;
   };
   yygoto = yyRuleInfo[yyruleno].lhs;
@@ -1055,11 +1080,11 @@
   while( yypParser->idx>=0 ) yy_pop_parser_stack(yypParser);
   /* Here code is inserted which will be executed whenever the
   ** parser fails */
-#line 102 "grammar.lemon"
+#line 102 "./grammar.lemon"
 
 	dfw->syntax_error = TRUE;
 
-#line 1062 "grammar.c"
+#line 1087 "grammar.c"
 }
 
 /*
@@ -1072,7 +1097,7 @@
   DfilterANSIARGDECL _U_           /* Extra arguments (if any) */
 ){
 #define TOKEN (yyminor.yy0)
-#line 54 "grammar.lemon"
+#line 54 "./grammar.lemon"
 
 
 	header_field_info	*hfinfo;
@@ -1116,7 +1141,7 @@
 			break;
 	}
 
-#line 1119 "grammar.c"
+#line 1144 "grammar.c"
 }
 
 /*
diff -ruN ../ethereal-0.10.11/epan/dfilter/grammar.h ethereal/epan/dfilter/grammar.h
--- ../ethereal-0.10.11/epan/dfilter/grammar.h	2005-06-29 10:13:29.000000000 +0200
+++ ethereal/epan/dfilter/grammar.h	2005-07-01 12:20:03.000000000 +0200
@@ -6,19 +6,19 @@
 #define TOKEN_LBRACKET                        6
 #define TOKEN_LPAREN                          7
 #define TOKEN_RBRACKET                        8
-#define TOKEN_RPAREN                          9
-#define TOKEN_STRING                         10
-#define TOKEN_TEST_AND                       11
-#define TOKEN_TEST_BITWISE_AND               12
-#define TOKEN_TEST_CONTAINS                  13
-#define TOKEN_TEST_EQ                        14
-#define TOKEN_TEST_GE                        15
-#define TOKEN_TEST_GT                        16
-#define TOKEN_TEST_LE                        17
-#define TOKEN_TEST_LT                        18
-#define TOKEN_TEST_MATCHES                   19
-#define TOKEN_TEST_NE                        20
-#define TOKEN_TEST_NOT                       21
-#define TOKEN_TEST_OR                        22
-#define TOKEN_UNPARSED                       23
-#define TOKEN_RETURN						 24
+#define TOKEN_RET                             9
+#define TOKEN_RPAREN                         10
+#define TOKEN_STRING                         11
+#define TOKEN_TEST_AND                       12
+#define TOKEN_TEST_BITWISE_AND               13
+#define TOKEN_TEST_CONTAINS                  14
+#define TOKEN_TEST_EQ                        15
+#define TOKEN_TEST_GE                        16
+#define TOKEN_TEST_GT                        17
+#define TOKEN_TEST_LE                        18
+#define TOKEN_TEST_LT                        19
+#define TOKEN_TEST_MATCHES                   20
+#define TOKEN_TEST_NE                        21
+#define TOKEN_TEST_NOT                       22
+#define TOKEN_TEST_OR                        23
+#define TOKEN_UNPARSED                       24
diff -ruN ../ethereal-0.10.11/epan/dfilter/grammar.lemon ethereal/epan/dfilter/grammar.lemon
--- ../ethereal-0.10.11/epan/dfilter/grammar.lemon	2005-05-02 23:28:08.000000000 +0200
+++ ethereal/epan/dfilter/grammar.lemon	2005-07-04 12:34:39.000000000 +0200
@@ -106,6 +106,7 @@
 /* ----------------- The grammar -------------- */
 
 /* Associativity */
+%right RET.
 %left TEST_AND.
 %left TEST_OR.
 %nonassoc TEST_EQ TEST_NE TEST_LT TEST_LE TEST_GT TEST_GE TEST_CONTAINS TEST_MATCHES TEST_BITWISE_AND.
@@ -117,7 +118,6 @@
 
 expr(X) ::= relation_test(R).	{ X = R; }
 expr(X) ::= logical_test(L).	{ X = L; }
-
 expr(X) ::= LPAREN expr(Y) RPAREN.
 {
 	X = Y;
@@ -241,6 +241,13 @@
 	sttype_test_set2(T, O, E, F);
 }
 
+relation_test(T) ::= RET entity(P).
+{
+	T = stnode_new(STTYPE_TEST, NULL);
+	sttype_test_set1(T, RET, P);
+}
+
+
 rel_op2(O) ::= TEST_EQ.  { O = TEST_OP_EQ; }
 rel_op2(O) ::= TEST_NE.  { O = TEST_OP_NE; }
 rel_op2(O) ::= TEST_GT.  { O = TEST_OP_GT; }
diff -ruN ../ethereal-0.10.11/epan/dfilter/scanner.c ethereal/epan/dfilter/scanner.c
--- ../ethereal-0.10.11/epan/dfilter/scanner.c	2005-05-04 23:35:23.000000000 +0200
+++ ethereal/epan/dfilter/scanner.c	2005-06-30 13:16:27.000000000 +0200
@@ -1,51 +1,86 @@
-#define yy_create_buffer df__create_buffer
-#define yy_delete_buffer df__delete_buffer
-#define yy_scan_buffer df__scan_buffer
-#define yy_scan_string df__scan_string
-#define yy_scan_bytes df__scan_bytes
-#define yy_flex_debug df__flex_debug
-#define yy_init_buffer df__init_buffer
-#define yy_flush_buffer df__flush_buffer
-#define yy_load_buffer_state df__load_buffer_state
-#define yy_switch_to_buffer df__switch_to_buffer
-#define yyin df_in
-#define yyleng df_leng
-#define yylex df_lex
-#define yyout df_out
-#define yyrestart df_restart
-#define yytext df_text
-#define yywrap df_wrap
+#line 2 "scanner.c"
 
-#line 20 "scanner.c"
-/* A lexical scanner generated by flex */
+#line 4 "scanner.c"
 
-/* Scanner skeleton version:
- * $Header: /home/daffy/u0/vern/flex/RCS/flex.skl,v 2.91 96/09/10 16:58:48 vern Exp $
- */
+#define  YY_INT_ALIGNED short int
+
+/* A lexical scanner generated by flex */
 
 #define FLEX_SCANNER
 #define YY_FLEX_MAJOR_VERSION 2
 #define YY_FLEX_MINOR_VERSION 5
+#define YY_FLEX_SUBMINOR_VERSION 31
+#if YY_FLEX_SUBMINOR_VERSION > 0
+#define FLEX_BETA
+#endif
+
+/* First, we deal with  platform-specific or compiler-specific issues. */
 
+/* begin standard C headers. */
 #include <stdio.h>
-#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+#include <stdlib.h>
 
+/* end standard C headers. */
 
-/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */
-#ifdef c_plusplus
-#ifndef __cplusplus
-#define __cplusplus
+/* flex integer type definitions */
+
+#ifndef FLEXINT_H
+#define FLEXINT_H
+
+/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
+
+#if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L
+#include <inttypes.h>
+typedef int8_t flex_int8_t;
+typedef uint8_t flex_uint8_t;
+typedef int16_t flex_int16_t;
+typedef uint16_t flex_uint16_t;
+typedef int32_t flex_int32_t;
+typedef uint32_t flex_uint32_t;
+#else
+typedef signed char flex_int8_t;
+typedef short int flex_int16_t;
+typedef int flex_int32_t;
+typedef unsigned char flex_uint8_t; 
+typedef unsigned short int flex_uint16_t;
+typedef unsigned int flex_uint32_t;
+#endif /* ! C99 */
+
+/* Limits of integral types. */
+#ifndef INT8_MIN
+#define INT8_MIN               (-128)
+#endif
+#ifndef INT16_MIN
+#define INT16_MIN              (-32767-1)
+#endif
+#ifndef INT32_MIN
+#define INT32_MIN              (-2147483647-1)
+#endif
+#ifndef INT8_MAX
+#define INT8_MAX               (127)
+#endif
+#ifndef INT16_MAX
+#define INT16_MAX              (32767)
+#endif
+#ifndef INT32_MAX
+#define INT32_MAX              (2147483647)
+#endif
+#ifndef UINT8_MAX
+#define UINT8_MAX              (255U)
 #endif
+#ifndef UINT16_MAX
+#define UINT16_MAX             (65535U)
+#endif
+#ifndef UINT32_MAX
+#define UINT32_MAX             (4294967295U)
 #endif
 
+#endif /* ! FLEXINT_H */
 
 #ifdef __cplusplus
 
-#include <stdlib.h>
-
-/* Use prototypes in function declarations. */
-#define YY_USE_PROTOS
-
 /* The "const" storage-class-modifier is valid. */
 #define YY_USE_CONST
 
@@ -53,34 +88,17 @@
 
 #if __STDC__
 
-#define YY_USE_PROTOS
 #define YY_USE_CONST
 
 #endif	/* __STDC__ */
 #endif	/* ! __cplusplus */
 
-#ifdef __TURBOC__
- #pragma warn -rch
- #pragma warn -use
-#include <io.h>
-#include <stdlib.h>
-#define YY_USE_CONST
-#define YY_USE_PROTOS
-#endif
-
 #ifdef YY_USE_CONST
 #define yyconst const
 #else
 #define yyconst
 #endif
 
-
-#ifdef YY_USE_PROTOS
-#define YY_PROTO(proto) proto
-#else
-#define YY_PROTO(proto) ()
-#endif
-
 /* Returned upon end-of-file. */
 #define YY_NULL 0
 
@@ -95,71 +113,71 @@
  * but we do it the disgusting crufty way forced on us by the ()-less
  * definition of BEGIN.
  */
-#define BEGIN yy_start = 1 + 2 *
+#define BEGIN (yy_start) = 1 + 2 *
 
 /* Translate the current start state into a value that can be later handed
  * to BEGIN to return to the state.  The YYSTATE alias is for lex
  * compatibility.
  */
-#define YY_START ((yy_start - 1) / 2)
+#define YY_START (((yy_start) - 1) / 2)
 #define YYSTATE YY_START
 
 /* Action number for EOF rule of a given start state. */
 #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
 
 /* Special action meaning "start processing a new file". */
-#define YY_NEW_FILE yyrestart( yyin )
+#define YY_NEW_FILE df_restart(df_in  )
 
 #define YY_END_OF_BUFFER_CHAR 0
 
 /* Size of default input buffer. */
+#ifndef YY_BUF_SIZE
 #define YY_BUF_SIZE 16384
+#endif
 
+#ifndef YY_TYPEDEF_YY_BUFFER_STATE
+#define YY_TYPEDEF_YY_BUFFER_STATE
 typedef struct yy_buffer_state *YY_BUFFER_STATE;
+#endif
+
+extern int df_leng;
 
-extern int yyleng;
-extern FILE *yyin, *yyout;
+extern FILE *df_in, *df_out;
 
 #define EOB_ACT_CONTINUE_SCAN 0
 #define EOB_ACT_END_OF_FILE 1
 #define EOB_ACT_LAST_MATCH 2
 
-/* The funky do-while in the following #define is used to turn the definition
- * int a single C statement (which needs a semi-colon terminator).  This
- * avoids problems with code like:
- *
- * 	if ( condition_holds )
- *		yyless( 5 );
- *	else
- *		do_something_else();
- *
- * Prior to using the do-while the compiler would get upset at the
- * "else" because it interpreted the "if" statement as being all
- * done when it reached the ';' after the yyless() call.
- */
-
-/* Return all but the first 'n' matched characters back to the input stream. */
-
+    #define YY_LESS_LINENO(n)
+    
+/* Return all but the first "n" matched characters back to the input stream. */
 #define yyless(n) \
 	do \
 		{ \
-		/* Undo effects of setting up yytext. */ \
-		*yy_cp = yy_hold_char; \
+		/* Undo effects of setting up df_text. */ \
+        int yyless_macro_arg = (n); \
+        YY_LESS_LINENO(yyless_macro_arg);\
+		*yy_cp = (yy_hold_char); \
 		YY_RESTORE_YY_MORE_OFFSET \
-		yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \
-		YY_DO_BEFORE_ACTION; /* set up yytext again */ \
+		(yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
+		YY_DO_BEFORE_ACTION; /* set up df_text again */ \
 		} \
 	while ( 0 )
 
-#define unput(c) yyunput( c, yytext_ptr )
+#define unput(c) yyunput( c, (yytext_ptr)  )
 
 /* The following is because we cannot portably get our hands on size_t
  * (without autoconf's help, which isn't available because we want
  * flex-generated scanners to compile on their own).
  */
-typedef unsigned int yy_size_t;
 
+#ifndef YY_TYPEDEF_YY_SIZE_T
+#define YY_TYPEDEF_YY_SIZE_T
+typedef unsigned int yy_size_t;
+#endif
 
+#ifndef YY_STRUCT_YY_BUFFER_STATE
+#define YY_STRUCT_YY_BUFFER_STATE
 struct yy_buffer_state
 	{
 	FILE *yy_input_file;
@@ -196,12 +214,16 @@
 	 */
 	int yy_at_bol;
 
+    int yy_bs_lineno; /**< The line count. */
+    int yy_bs_column; /**< The column count. */
+    
 	/* Whether to try to fill the input buffer when we reach the
 	 * end of it.
 	 */
 	int yy_fill_buffer;
 
 	int yy_buffer_status;
+
 #define YY_BUFFER_NEW 0
 #define YY_BUFFER_NORMAL 1
 	/* When an EOF's been seen but there's still some text to process
@@ -211,115 +233,152 @@
 	 * possible backing-up.
 	 *
 	 * When we actually see the EOF, we change the status to "new"
-	 * (via yyrestart()), so that the user can continue scanning by
-	 * just pointing yyin at a new input file.
+	 * (via df_restart()), so that the user can continue scanning by
+	 * just pointing df_in at a new input file.
 	 */
 #define YY_BUFFER_EOF_PENDING 2
+
 	};
+#endif /* !YY_STRUCT_YY_BUFFER_STATE */
 
-static YY_BUFFER_STATE yy_current_buffer = 0;
+/* Stack of input buffers. */
+static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */
+static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */
+static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */
 
 /* We provide macros for accessing buffer states in case in the
  * future we want to put the buffer states in a more general
  * "scanner state".
+ *
+ * Returns the top of the stack, or NULL.
  */
-#define YY_CURRENT_BUFFER yy_current_buffer
+#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
+                          ? (yy_buffer_stack)[(yy_buffer_stack_top)] \
+                          : NULL)
 
+/* Same as previous macro, but useful when we know that the buffer stack is not
+ * NULL or when we need an lvalue. For internal use only.
+ */
+#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
 
-/* yy_hold_char holds the character lost when yytext is formed. */
+/* yy_hold_char holds the character lost when df_text is formed. */
 static char yy_hold_char;
-
 static int yy_n_chars;		/* number of characters read into yy_ch_buf */
-
-
-int yyleng;
+int df_leng;
 
 /* Points to current character in buffer. */
 static char *yy_c_buf_p = (char *) 0;
 static int yy_init = 1;		/* whether we need to initialize */
 static int yy_start = 0;	/* start state number */
 
-/* Flag which is used to allow yywrap()'s to do buffer switches
- * instead of setting up a fresh yyin.  A bit of a hack ...
+/* Flag which is used to allow df_wrap()'s to do buffer switches
+ * instead of setting up a fresh df_in.  A bit of a hack ...
  */
 static int yy_did_buffer_switch_on_eof;
 
-void yyrestart YY_PROTO(( FILE *input_file ));
+void df_restart (FILE *input_file  );
+void df__switch_to_buffer (YY_BUFFER_STATE new_buffer  );
+YY_BUFFER_STATE df__create_buffer (FILE *file,int size  );
+void df__delete_buffer (YY_BUFFER_STATE b  );
+void df__flush_buffer (YY_BUFFER_STATE b  );
+void df_push_buffer_state (YY_BUFFER_STATE new_buffer  );
+void df_pop_buffer_state (void );
+
+static void df_ensure_buffer_stack (void );
+static void df__load_buffer_state (void );
+static void df__init_buffer (YY_BUFFER_STATE b,FILE *file  );
+
+#define YY_FLUSH_BUFFER df__flush_buffer(YY_CURRENT_BUFFER )
+
+YY_BUFFER_STATE df__scan_buffer (char *base,yy_size_t size  );
+YY_BUFFER_STATE df__scan_string (yyconst char *yy_str  );
+YY_BUFFER_STATE df__scan_bytes (yyconst char *bytes,int len  );
+
+void *df_alloc (yy_size_t  );
+void *df_realloc (void *,yy_size_t  );
+void df_free (void *  );
 
-void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer ));
-void yy_load_buffer_state YY_PROTO(( void ));
-YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size ));
-void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b ));
-void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file ));
-void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b ));
-#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer )
-
-YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size ));
-YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str ));
-YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len ));
-
-static void *yy_flex_alloc YY_PROTO(( yy_size_t ));
-static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t ));
-static void yy_flex_free YY_PROTO(( void * ));
-
-#define yy_new_buffer yy_create_buffer
+#define yy_new_buffer df__create_buffer
 
 #define yy_set_interactive(is_interactive) \
 	{ \
-	if ( ! yy_current_buffer ) \
-		yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
-	yy_current_buffer->yy_is_interactive = is_interactive; \
+	if ( ! YY_CURRENT_BUFFER ){ \
+        df_ensure_buffer_stack (); \
+		YY_CURRENT_BUFFER_LVALUE =    \
+            df__create_buffer(df_in,YY_BUF_SIZE ); \
+	} \
+	YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
 	}
 
 #define yy_set_bol(at_bol) \
 	{ \
-	if ( ! yy_current_buffer ) \
-		yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
-	yy_current_buffer->yy_at_bol = at_bol; \
+	if ( ! YY_CURRENT_BUFFER ){\
+        df_ensure_buffer_stack (); \
+		YY_CURRENT_BUFFER_LVALUE =    \
+            df__create_buffer(df_in,YY_BUF_SIZE ); \
+	} \
+	YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
 	}
 
-#define YY_AT_BOL() (yy_current_buffer->yy_at_bol)
+#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
+
+/* Begin user sect3 */
 
 typedef unsigned char YY_CHAR;
-FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;
+
+FILE *df_in = (FILE *) 0, *df_out = (FILE *) 0;
+
 typedef int yy_state_type;
-extern char *yytext;
-#define yytext_ptr yytext
 
-static yy_state_type yy_get_previous_state YY_PROTO(( void ));
-static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state ));
-static int yy_get_next_buffer YY_PROTO(( void ));
-static void yy_fatal_error YY_PROTO(( yyconst char msg[] ));
+extern int df_lineno;
+
+int df_lineno = 1;
+
+extern char *df_text;
+#define yytext_ptr df_text
+
+static yy_state_type yy_get_previous_state (void );
+static yy_state_type yy_try_NUL_trans (yy_state_type current_state  );
+static int yy_get_next_buffer (void );
+static void yy_fatal_error (yyconst char msg[]  );
 
 /* Done after the current pattern has been matched and before the
- * corresponding action - sets up yytext.
+ * corresponding action - sets up df_text.
  */
 #define YY_DO_BEFORE_ACTION \
-	yytext_ptr = yy_bp; \
-	yyleng = (int) (yy_cp - yy_bp); \
-	yy_hold_char = *yy_cp; \
+	(yytext_ptr) = yy_bp; \
+	df_leng = (size_t) (yy_cp - yy_bp); \
+	(yy_hold_char) = *yy_cp; \
 	*yy_cp = '\0'; \
-	yy_c_buf_p = yy_cp;
+	(yy_c_buf_p) = yy_cp;
 
-#define YY_NUM_RULES 44
-#define YY_END_OF_BUFFER 45
-static yyconst short int yy_accept[109] =
+#define YY_NUM_RULES 45
+#define YY_END_OF_BUFFER 46
+/* This struct is not used in this scanner,
+   but its presence is necessary. */
+struct yy_trans_info
+	{
+	flex_int32_t yy_verify;
+	flex_int32_t yy_nxt;
+	};
+static yyconst flex_int16_t yy_accept[115] =
     {   0,
-        0,    0,    0,    0,    0,    0,    0,    0,   45,   43,
-        1,    1,   20,   35,   17,    2,    3,   42,   42,   12,
-       43,    8,   26,   42,   42,   42,   42,   42,   42,   42,
-       42,   42,   43,   34,   44,   34,   31,   27,   27,   29,
-       32,   33,   31,   30,   29,   32,   40,   36,   44,    1,
-        6,   22,   42,   42,    0,   14,    4,   10,   42,   42,
-       42,    5,   11,    9,   15,   13,   42,    7,   42,   25,
-       24,   27,   27,    0,   33,   40,   39,   37,   39,   41,
-       23,   42,   42,   42,   21,   28,   37,   38,   42,   42,
-       42,   37,   38,   42,   42,   42,   42,   42,   42,   42,
+        0,    0,    0,    0,    0,    0,    0,    0,   46,   44,
+        1,    1,   20,   36,   17,    2,    3,   43,   43,   12,
+       44,    8,   27,   43,   43,   43,   43,   43,   43,   43,
+       43,   43,   43,   44,   35,   45,   35,   32,   28,   28,
+       30,   33,   34,   32,   31,   30,   33,   41,   37,   45,
+        1,    6,   22,   43,   43,    0,   14,    4,   10,   43,
+       43,   43,    5,   11,    9,   15,   13,   43,    7,   43,
+       25,   43,   24,   28,   28,    0,   34,   41,   40,   38,
+       40,   42,   23,   43,   43,   43,   21,   43,   29,   38,
+       39,   43,   43,   43,   43,   38,   39,   43,   43,   43,
 
-       42,   19,   42,   18,   42,   42,   16,    0
+       43,   43,   43,   43,   26,   43,   43,   19,   43,   18,
+       43,   43,   16,    0
     } ;
 
-static yyconst int yy_ec[256] =
+static yyconst flex_int32_t yy_ec[256] =
     {   0,
         1,    1,    1,    1,    1,    1,    1,    1,    2,    3,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
@@ -333,8 +392,8 @@
        22,   23,   24,    1,   25,    1,   26,   27,   28,   29,
 
        30,   21,   31,   32,   33,   12,   12,   34,   35,   36,
-       37,   12,   38,   39,   40,   41,   12,   12,   42,   43,
-       12,   12,    1,   44,    1,    1,    1,    1,    1,    1,
+       37,   12,   38,   39,   40,   41,   42,   12,   43,   44,
+       12,   12,    1,   45,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
@@ -351,138 +410,149 @@
         1,    1,    1,    1,    1
     } ;
 
-static yyconst int yy_meta[45] =
+static yyconst flex_int32_t yy_meta[46] =
     {   0,
         1,    1,    2,    1,    3,    1,    1,    1,    4,    5,
         5,    4,    6,    7,    7,    7,    5,    1,    1,    1,
         7,    1,    3,    8,    4,    7,    7,    7,    7,    7,
         4,    4,    4,    4,    4,    4,    4,    4,    4,    4,
-        4,    4,    4,    1
+        4,    4,    4,    4,    1
     } ;
 
-static yyconst short int yy_base[120] =
+static yyconst flex_int16_t yy_base[126] =
     {   0,
-        0,    0,   42,   64,   37,   52,   41,   45,  107,  314,
-       68,   80,   83,  314,   91,  314,  314,    0,   76,   73,
-       68,   65,  314,   81,   86,   91,   96,  101,   19,   86,
-       85,   91,   33,  314,  314,  109,  314,  121,  124,  314,
-      314,    0,  314,  314,  314,  314,    0,  314,  129,  143,
-      314,  314,    0,  111,  133,  314,  314,  314,  121,  124,
-      125,  126,  127,  128,  129,  130,  133,  143,  145,  146,
-      314,  163,  166,    0,    0,    0,  314,  174,    0,  176,
-      153,  155,  163,  170,  169,    0,  187,    0,  175,  177,
-      182,  314,  314,  179,  191,  185,  187,  195,  197,  204,
-
-      200,  192,  209,  212,  213,  217,  214,  314,  258,  266,
-      274,  279,  283,  290,  297,  305,   65,   58,   48
+        0,    0,   43,   65,   38,   53,   42,   46,  108,  344,
+       69,   81,   84,  344,   92,  344,  344,    0,   77,   74,
+       69,   66,  344,   82,   87,   92,   97,  102,   20,   87,
+       86,   92,   95,   33,  344,  344,  123,  344,  126,  130,
+      344,  344,    0,  344,  344,  344,  344,    0,  344,  133,
+      147,  344,  344,    0,  121,  138,  344,  344,  344,  126,
+      127,  128,  130,  131,  133,  135,  143,  145,  148,  149,
+      150,  151,  344,  179,  182,    0,    0,    0,  344,  168,
+        0,  185,  172,  173,  174,  177,  176,  178,    0,  173,
+        0,  191,  196,  195,  199,  344,  344,  201,  213,  198,
+
+      214,  204,  217,  219,  221,  227,  226,  231,  239,  233,
+      234,  247,  241,  344,  288,  296,  304,  309,  313,  320,
+      327,  335,   66,   59,   49
     } ;
 
-static yyconst short int yy_def[120] =
+static yyconst flex_int16_t yy_def[126] =
     {   0,
-      108,    1,  109,  109,  110,  110,  111,  111,  108,  108,
-      108,  108,  108,  108,  108,  108,  108,  112,  113,  108,
-      108,  108,  108,  113,  113,  113,  113,  113,   28,   28,
-       28,   28,  108,  108,  108,  108,  108,  108,  108,  108,
-      108,  114,  108,  108,  108,  108,  115,  108,  116,  108,
-      108,  108,  112,   28,  108,  108,  108,  108,   28,   28,
+      114,    1,  115,  115,  116,  116,  117,  117,  114,  114,
+      114,  114,  114,  114,  114,  114,  114,  118,  119,  114,
+      114,  114,  114,  119,  119,  119,  119,  119,   28,   28,
+       28,   28,   28,  114,  114,  114,  114,  114,  114,  114,
+      114,  114,  120,  114,  114,  114,  114,  121,  114,  122,
+      114,  114,  114,  118,   28,  114,  114,  114,  114,   28,
        28,   28,   28,   28,   28,   28,   28,   28,   28,   28,
-      108,  108,  108,  117,  114,  115,  108,  108,  118,  108,
-       28,   28,   28,   28,   28,  117,  108,  119,   28,   28,
-       28,  108,  108,   28,   28,   28,   28,   28,   28,   28,
+       28,   28,  114,  114,  114,  123,  120,  121,  114,  114,
+      124,  114,   28,   28,   28,   28,   28,   28,  123,  114,
+      125,   28,   28,   28,   28,  114,  114,   28,   28,   28,
 
-       28,   28,   28,   28,   28,   28,   28,    0,  108,  108,
-      108,  108,  108,  108,  108,  108,  108,  108,  108
+       28,   28,   28,   28,   28,   28,   28,   28,   28,   28,
+       28,   28,   28,    0,  114,  114,  114,  114,  114,  114,
+      114,  114,  114,  114,  114
     } ;
 
-static yyconst short int yy_nxt[359] =
+static yyconst flex_int16_t yy_nxt[390] =
     {   0,
        10,   11,   12,   13,   14,   15,   16,   17,   18,   18,
        19,   19,   10,   19,   19,   19,   18,   20,   21,   22,
        19,   23,   10,   10,   19,   24,   25,   26,   19,   27,
-       28,   19,   19,   29,   30,   31,   32,   19,   19,   19,
-       19,   19,   19,   33,   35,   48,   43,   44,   65,   48,
-       36,   37,   36,   45,   93,   38,   39,   39,   40,   66,
-       46,   43,   44,   49,   88,   41,   35,   49,   45,   50,
-       50,   86,   36,   37,   36,   46,   71,   38,   39,   39,
-       40,   50,   50,   58,   53,   53,   57,   41,   55,   53,
-       53,   56,   53,   55,   53,   53,   52,   53,   55,   53,
-
-       53,   51,   53,   55,   53,   53,  108,   53,   55,   53,
-       53,   67,   53,   55,   68,   54,   59,   53,   60,  108,
-       54,   69,   72,   73,   73,   54,   54,   61,  108,   70,
-       63,   54,  108,   62,   73,   73,   73,   73,   73,   73,
-       54,   64,   78,   78,   50,   50,   80,   80,   80,   81,
-       54,   54,  108,   54,   54,   54,   54,   54,   54,   54,
-       83,   54,   54,   74,   82,   54,   54,   54,   54,   54,
-       54,   79,   54,   84,   54,   54,   73,   73,   73,   73,
-       73,   73,   54,   54,   54,   85,   54,   87,   87,   80,
-       80,   80,   54,   54,  108,   54,   89,   91,   54,   54,
-
-       92,   92,   95,   90,   54,   74,   54,   94,   54,   54,
-       54,   54,  108,   96,   99,   54,  100,   54,   97,   54,
-       54,   54,   54,   98,   54,   54,   54,   54,  103,   54,
-      101,   54,   54,   54,  105,   54,  102,   54,   54,  104,
-       54,   54,   54,   54,   54,  107,   54,  108,  106,   54,
-      108,  108,   54,   54,   54,  108,  108,   54,   34,   34,
-       34,   34,   34,   34,   34,   34,   42,   42,   42,   42,
-       42,   42,   42,   42,   47,   47,   47,   47,   47,   47,
-       47,   47,   53,   53,  108,   53,   54,   54,   54,   54,
-       75,   75,   75,   75,  108,   75,   75,   76,   76,  108,
-
-       76,   76,   76,   76,   76,   77,  108,   77,   77,   77,
-       77,   77,   77,    9,  108,  108,  108,  108,  108,  108,
-      108,  108,  108,  108,  108,  108,  108,  108,  108,  108,
-      108,  108,  108,  108,  108,  108,  108,  108,  108,  108,
-      108,  108,  108,  108,  108,  108,  108,  108,  108,  108,
-      108,  108,  108,  108,  108,  108,  108,  108
+       28,   19,   19,   29,   30,   31,   32,   19,   33,   19,
+       19,   19,   19,   19,   34,   36,   49,   44,   45,   66,
+       49,   37,   38,   37,   46,   97,   39,   40,   40,   41,
+       67,   47,   44,   45,   50,   91,   42,   36,   50,   46,
+       51,   51,   89,   37,   38,   37,   47,   73,   39,   40,
+       40,   41,   51,   51,   59,   54,   54,   58,   42,   56,
+       54,   54,   57,   54,   56,   54,   54,   53,   54,   56,
+
+       54,   54,   52,   54,   56,   54,   54,  114,   54,   56,
+       54,   54,   68,   54,   56,   69,   55,   60,   54,   61,
+      114,   55,   70,  114,   72,  114,   55,   55,   62,  114,
+       71,   64,   55,  114,   63,   55,   74,   75,   75,   75,
+       75,   75,   65,   75,   75,   75,   80,   80,   51,   51,
+       55,   82,   82,   82,   83,   55,   55,   55,  114,   55,
+       55,   55,   55,   85,   55,  114,   55,   84,   55,   76,
+       55,   55,   55,   55,   55,   55,   81,   55,   55,   55,
+       55,   90,   90,   55,  114,   86,   96,   96,   55,   87,
+       55,   88,   75,   75,   75,   75,   75,   75,   82,   82,
+
+       82,   55,   55,   55,   94,   55,   55,   55,  114,  114,
+      114,  114,   55,   55,   93,   92,   55,   55,   55,   95,
+       55,   99,   76,   98,   55,   55,  100,  104,   55,  114,
+       55,   55,  114,  106,  114,   55,   55,  101,   55,   55,
+      102,   55,   55,   55,   55,  103,   55,  114,   55,  105,
+       55,  109,  107,   55,   55,   55,   55,   55,  108,   55,
+       55,   55,   55,   55,  111,  110,   55,   55,   55,  112,
+       55,   55,  114,   55,   55,  113,   55,  114,  114,   55,
+      114,   55,  114,  114,  114,  114,  114,   55,   35,   35,
+       35,   35,   35,   35,   35,   35,   43,   43,   43,   43,
+
+       43,   43,   43,   43,   48,   48,   48,   48,   48,   48,
+       48,   48,   54,   54,  114,   54,   55,   55,   55,   55,
+       77,   77,   77,   77,  114,   77,   77,   78,   78,  114,
+       78,   78,   78,   78,   78,   79,  114,   79,   79,   79,
+       79,   79,   79,    9,  114,  114,  114,  114,  114,  114,
+      114,  114,  114,  114,  114,  114,  114,  114,  114,  114,
+      114,  114,  114,  114,  114,  114,  114,  114,  114,  114,
+      114,  114,  114,  114,  114,  114,  114,  114,  114,  114,
+      114,  114,  114,  114,  114,  114,  114,  114,  114
     } ;
 
-static yyconst short int yy_chk[359] =
+static yyconst flex_int16_t yy_chk[390] =
     {   0,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    3,    7,    5,    5,   29,    8,
-        3,    3,    3,    5,  119,    3,    3,    3,    3,   29,
-        5,    6,    6,    7,  118,    3,    4,    8,    6,   11,
-       11,  117,    4,    4,    4,    6,   33,    4,    4,    4,
-        4,   12,   12,   22,   19,   19,   21,    4,   19,   24,
-       24,   20,   19,   24,   25,   25,   15,   24,   25,   26,
-
-       26,   13,   25,   26,   27,   27,    9,   26,   27,   28,
-       28,   30,   27,   28,   31,   30,   24,   28,   25,    0,
-       32,   31,   36,   36,   36,   31,   30,   26,    0,   32,
-       28,   32,    0,   27,   38,   38,   38,   39,   39,   39,
-       54,   28,   49,   49,   50,   50,   55,   55,   55,   59,
-       59,   54,    0,   60,   61,   62,   63,   64,   65,   66,
-       61,   59,   67,   38,   60,   61,   62,   63,   64,   65,
-       66,   49,   68,   67,   69,   70,   72,   72,   72,   73,
-       73,   73,   81,   68,   82,   69,   70,   78,   78,   80,
-       80,   80,   83,   81,    0,   82,   82,   84,   85,   84,
-
-       87,   87,   90,   83,   89,   72,   90,   89,   94,   85,
-       84,   91,    0,   91,   96,   89,   97,   90,   94,   94,
-       95,  102,   91,   95,   98,   96,   99,   97,  100,  101,
-       98,   95,  102,  100,  103,   98,   99,   99,  103,  101,
-      101,  104,  105,  107,  100,  106,  106,    0,  105,  103,
-        0,    0,  104,  105,  107,    0,    0,  106,  109,  109,
-      109,  109,  109,  109,  109,  109,  110,  110,  110,  110,
-      110,  110,  110,  110,  111,  111,  111,  111,  111,  111,
-      111,  111,  112,  112,    0,  112,  113,  113,  113,  113,
-      114,  114,  114,  114,    0,  114,  114,  115,  115,    0,
-
-      115,  115,  115,  115,  115,  116,    0,  116,  116,  116,
-      116,  116,  116,  108,  108,  108,  108,  108,  108,  108,
-      108,  108,  108,  108,  108,  108,  108,  108,  108,  108,
-      108,  108,  108,  108,  108,  108,  108,  108,  108,  108,
-      108,  108,  108,  108,  108,  108,  108,  108,  108,  108,
-      108,  108,  108,  108,  108,  108,  108,  108
+        1,    1,    1,    1,    1,    3,    7,    5,    5,   29,
+        8,    3,    3,    3,    5,  125,    3,    3,    3,    3,
+       29,    5,    6,    6,    7,  124,    3,    4,    8,    6,
+       11,   11,  123,    4,    4,    4,    6,   34,    4,    4,
+        4,    4,   12,   12,   22,   19,   19,   21,    4,   19,
+       24,   24,   20,   19,   24,   25,   25,   15,   24,   25,
+
+       26,   26,   13,   25,   26,   27,   27,    9,   26,   27,
+       28,   28,   30,   27,   28,   31,   30,   24,   28,   25,
+        0,   32,   31,    0,   33,    0,   31,   30,   26,    0,
+       32,   28,   32,    0,   27,   33,   37,   37,   37,   39,
+       39,   39,   28,   40,   40,   40,   50,   50,   51,   51,
+       55,   56,   56,   56,   60,   60,   61,   62,    0,   63,
+       64,   55,   65,   62,   66,    0,   60,   61,   62,   39,
+       63,   64,   67,   65,   68,   66,   50,   69,   70,   71,
+       72,   80,   80,   67,    0,   68,   90,   90,   69,   70,
+       71,   72,   74,   74,   74,   75,   75,   75,   82,   82,
+
+       82,   83,   84,   85,   86,   87,   86,   88,    0,    0,
+        0,    0,   83,   84,   85,   84,   87,   86,   88,   88,
+       92,   93,   74,   92,   94,   93,   94,  100,   95,    0,
+       98,   92,    0,  102,    0,   94,   93,   95,  100,   95,
+       98,   98,   99,  101,  102,   99,  103,    0,  104,  101,
+      105,  106,  103,   99,  101,  107,  106,  103,  104,  104,
+      108,  105,  110,  111,  109,  107,  107,  106,  109,  111,
+      113,  108,    0,  110,  111,  112,  112,    0,    0,  109,
+        0,  113,    0,    0,    0,    0,    0,  112,  115,  115,
+      115,  115,  115,  115,  115,  115,  116,  116,  116,  116,
+
+      116,  116,  116,  116,  117,  117,  117,  117,  117,  117,
+      117,  117,  118,  118,    0,  118,  119,  119,  119,  119,
+      120,  120,  120,  120,    0,  120,  120,  121,  121,    0,
+      121,  121,  121,  121,  121,  122,    0,  122,  122,  122,
+      122,  122,  122,  114,  114,  114,  114,  114,  114,  114,
+      114,  114,  114,  114,  114,  114,  114,  114,  114,  114,
+      114,  114,  114,  114,  114,  114,  114,  114,  114,  114,
+      114,  114,  114,  114,  114,  114,  114,  114,  114,  114,
+      114,  114,  114,  114,  114,  114,  114,  114,  114
     } ;
 
 static yy_state_type yy_last_accepting_state;
 static char *yy_last_accepting_cpos;
 
+extern int df__flex_debug;
+int df__flex_debug = 0;
+
 /* The intent behind this definition is that it'll catch
  * any uses of REJECT which flex missed.
  */
@@ -490,9 +560,8 @@
 #define yymore() yymore_used_but_not_detected
 #define YY_MORE_ADJ 0
 #define YY_RESTORE_YY_MORE_OFFSET
-char *yytext;
+char *df_text;
 #line 1 "./scanner.l"
-#define INITIAL 0
 #line 2 "./scanner.l"
 /*
  * $Id: scanner.l 13892 2005-03-24 05:27:03Z guy $
@@ -556,13 +625,27 @@
 static gboolean str_to_gint32(char *s, gint32* pint);
 GString* quoted_string = NULL;
 
-#define RANGE_INT 1
 
-#define RANGE_PUNCT 2
 
+
+#line 632 "scanner.c"
+
+#define INITIAL 0
+#define RANGE_INT 1
+#define RANGE_PUNCT 2
 #define DQUOTE 3
 
-#line 566 "scanner.c"
+#ifndef YY_NO_UNISTD_H
+/* Special case for "unistd.h", since it is non-ANSI. We include it way
+ * down here because we want the user's section 1 to have been scanned first.
+ * The user has a chance to override it with an option.
+ */
+#include <unistd.h>
+#endif
+
+#ifndef YY_EXTRA_TYPE
+#define YY_EXTRA_TYPE void *
+#endif
 
 /* Macros after this point can all be overridden by user definitions in
  * section 1.
@@ -570,65 +653,30 @@
 
 #ifndef YY_SKIP_YYWRAP
 #ifdef __cplusplus
-extern "C" int yywrap YY_PROTO(( void ));
+extern "C" int df_wrap (void );
 #else
-extern int yywrap YY_PROTO(( void ));
-#endif
+extern int df_wrap (void );
 #endif
-
-#ifndef YY_NO_UNPUT
-static void yyunput YY_PROTO(( int c, char *buf_ptr ));
 #endif
 
+    static void yyunput (int c,char *buf_ptr  );
+    
 #ifndef yytext_ptr
-static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int ));
+static void yy_flex_strncpy (char *,yyconst char *,int );
 #endif
 
 #ifdef YY_NEED_STRLEN
-static int yy_flex_strlen YY_PROTO(( yyconst char * ));
+static int yy_flex_strlen (yyconst char * );
 #endif
 
 #ifndef YY_NO_INPUT
-#ifdef __cplusplus
-static int yyinput YY_PROTO(( void ));
-#else
-static int input YY_PROTO(( void ));
-#endif
-#endif
-
-#if YY_STACK_USED
-static int yy_start_stack_ptr = 0;
-static int yy_start_stack_depth = 0;
-static int *yy_start_stack = 0;
-#ifndef YY_NO_PUSH_STATE
-static void yy_push_state YY_PROTO(( int new_state ));
-#endif
-#ifndef YY_NO_POP_STATE
-static void yy_pop_state YY_PROTO(( void ));
-#endif
-#ifndef YY_NO_TOP_STATE
-static int yy_top_state YY_PROTO(( void ));
-#endif
 
+#ifdef __cplusplus
+static int yyinput (void );
 #else
-#define YY_NO_PUSH_STATE 1
-#define YY_NO_POP_STATE 1
-#define YY_NO_TOP_STATE 1
+static int input (void );
 #endif
 
-#ifdef YY_MALLOC_DECL
-YY_MALLOC_DECL
-#else
-#if __STDC__
-#ifndef __cplusplus
-#include <stdlib.h>
-#endif
-#else
-/* Just try to get by without declaring the routines.  This will fail
- * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int)
- * or sizeof(void*) != sizeof(int).
- */
-#endif
 #endif
 
 /* Amount of stuff to slurp up with each read. */
@@ -637,12 +685,11 @@
 #endif
 
 /* Copy whatever the last rule matched to the standard output. */
-
 #ifndef ECHO
 /* This used to be an fputs(), but since the string might contain NUL's,
  * we now use fwrite().
  */
-#define ECHO (void) fwrite( yytext, yyleng, 1, yyout )
+#define ECHO (void) fwrite( df_text, df_leng, 1, df_out )
 #endif
 
 /* Gets input and stuffs it into "buf".  number of characters read, or YY_NULL,
@@ -650,21 +697,35 @@
  */
 #ifndef YY_INPUT
 #define YY_INPUT(buf,result,max_size) \
-	if ( yy_current_buffer->yy_is_interactive ) \
+	if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
 		{ \
-		int c = '*', n; \
+		int c = '*'; \
+		size_t n; \
 		for ( n = 0; n < max_size && \
-			     (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
+			     (c = getc( df_in )) != EOF && c != '\n'; ++n ) \
 			buf[n] = (char) c; \
 		if ( c == '\n' ) \
 			buf[n++] = (char) c; \
-		if ( c == EOF && ferror( yyin ) ) \
+		if ( c == EOF && ferror( df_in ) ) \
 			YY_FATAL_ERROR( "input in flex scanner failed" ); \
 		result = n; \
 		} \
-	else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \
-		  && ferror( yyin ) ) \
-		YY_FATAL_ERROR( "input in flex scanner failed" );
+	else \
+		{ \
+		errno=0; \
+		while ( (result = fread(buf, 1, max_size, df_in))==0 && ferror(df_in)) \
+			{ \
+			if( errno != EINTR) \
+				{ \
+				YY_FATAL_ERROR( "input in flex scanner failed" ); \
+				break; \
+				} \
+			errno=0; \
+			clearerr(df_in); \
+			} \
+		}\
+\
+
 #endif
 
 /* No semi-colon after return; correct usage is to write "yyterminate();" -
@@ -685,14 +746,20 @@
 #define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
 #endif
 
+/* end tables serialization structures and prototypes */
+
 /* Default declaration of generated scanner - a define so the user can
  * easily add parameters.
  */
 #ifndef YY_DECL
-#define YY_DECL int yylex YY_PROTO(( void ))
-#endif
+#define YY_DECL_IS_OURS 1
+
+extern int df_lex (void);
+
+#define YY_DECL int df_lex (void)
+#endif /* !YY_DECL */
 
-/* Code executed at the beginning of each rule, after yytext and yyleng
+/* Code executed at the beginning of each rule, after df_text and df_leng
  * have been set up.
  */
 #ifndef YY_USER_ACTION
@@ -707,99 +774,102 @@
 #define YY_RULE_SETUP \
 	YY_USER_ACTION
 
+/** The main scanner function which does all the work.
+ */
 YY_DECL
-	{
+{
 	register yy_state_type yy_current_state;
-	register char *yy_cp = NULL, *yy_bp = NULL;
+	register char *yy_cp, *yy_bp;
 	register int yy_act;
-
+    
 #line 70 "./scanner.l"
 
 
-#line 720 "scanner.c"
+#line 789 "scanner.c"
 
-	if ( yy_init )
+	if ( (yy_init) )
 		{
-		yy_init = 0;
+		(yy_init) = 0;
 
 #ifdef YY_USER_INIT
 		YY_USER_INIT;
 #endif
 
-		if ( ! yy_start )
-			yy_start = 1;	/* first start state */
+		if ( ! (yy_start) )
+			(yy_start) = 1;	/* first start state */
 
-		if ( ! yyin )
-			yyin = stdin;
+		if ( ! df_in )
+			df_in = stdin;
 
-		if ( ! yyout )
-			yyout = stdout;
+		if ( ! df_out )
+			df_out = stdout;
 
-		if ( ! yy_current_buffer )
-			yy_current_buffer =
-				yy_create_buffer( yyin, YY_BUF_SIZE );
+		if ( ! YY_CURRENT_BUFFER ) {
+			df_ensure_buffer_stack ();
+			YY_CURRENT_BUFFER_LVALUE =
+				df__create_buffer(df_in,YY_BUF_SIZE );
+		}
 
-		yy_load_buffer_state();
+		df__load_buffer_state( );
 		}
 
 	while ( 1 )		/* loops until end-of-file is reached */
 		{
-		yy_cp = yy_c_buf_p;
+		yy_cp = (yy_c_buf_p);
 
-		/* Support of yytext. */
-		*yy_cp = yy_hold_char;
+		/* Support of df_text. */
+		*yy_cp = (yy_hold_char);
 
 		/* yy_bp points to the position in yy_ch_buf of the start of
 		 * the current run.
 		 */
 		yy_bp = yy_cp;
 
-		yy_current_state = yy_start;
+		yy_current_state = (yy_start);
 yy_match:
 		do
 			{
 			register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
 			if ( yy_accept[yy_current_state] )
 				{
-				yy_last_accepting_state = yy_current_state;
-				yy_last_accepting_cpos = yy_cp;
+				(yy_last_accepting_state) = yy_current_state;
+				(yy_last_accepting_cpos) = yy_cp;
 				}
 			while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
 				{
 				yy_current_state = (int) yy_def[yy_current_state];
-				if ( yy_current_state >= 109 )
+				if ( yy_current_state >= 115 )
 					yy_c = yy_meta[(unsigned int) yy_c];
 				}
 			yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
 			++yy_cp;
 			}
-		while ( yy_base[yy_current_state] != 314 );
+		while ( yy_base[yy_current_state] != 344 );
 
 yy_find_action:
 		yy_act = yy_accept[yy_current_state];
 		if ( yy_act == 0 )
 			{ /* have to back up */
-			yy_cp = yy_last_accepting_cpos;
-			yy_current_state = yy_last_accepting_state;
+			yy_cp = (yy_last_accepting_cpos);
+			yy_current_state = (yy_last_accepting_state);
 			yy_act = yy_accept[yy_current_state];
 			}
 
 		YY_DO_BEFORE_ACTION;
 
-
 do_action:	/* This label is used only to access EOF actions. */
 
-
 		switch ( yy_act )
 	{ /* beginning of action switch */
 			case 0: /* must back up */
 			/* undo the effects of YY_DO_BEFORE_ACTION */
-			*yy_cp = yy_hold_char;
-			yy_cp = yy_last_accepting_cpos;
-			yy_current_state = yy_last_accepting_state;
+			*yy_cp = (yy_hold_char);
+			yy_cp = (yy_last_accepting_cpos);
+			yy_current_state = (yy_last_accepting_state);
 			goto yy_find_action;
 
 case 1:
+/* rule 1 can match eol */
 YY_RULE_SETUP
 #line 72 "./scanner.l"
 /* ignore whitespace */
@@ -926,83 +996,89 @@
 	YY_BREAK
 case 26:
 YY_RULE_SETUP
-#line 104 "./scanner.l"
+#line 101 "./scanner.l"
+return simple(TOKEN_RET);
+	YY_BREAK
+case 27:
+YY_RULE_SETUP
+#line 105 "./scanner.l"
 {
 	BEGIN(RANGE_INT);
 	return simple(TOKEN_LBRACKET);
 }
 	YY_BREAK
-case 27:
+case 28:
 YY_RULE_SETUP
-#line 109 "./scanner.l"
+#line 110 "./scanner.l"
 {
 	BEGIN(RANGE_PUNCT);
-	return set_lval_int(TOKEN_INTEGER, yytext);
+	return set_lval_int(TOKEN_INTEGER, df_text);
 }
 	YY_BREAK
-case 28:
+case 29:
 YY_RULE_SETUP
-#line 114 "./scanner.l"
+#line 115 "./scanner.l"
 {
 	BEGIN(RANGE_PUNCT);
-	return set_lval_int(TOKEN_INTEGER, yytext);
+	return set_lval_int(TOKEN_INTEGER, df_text);
 }
 	YY_BREAK
-case 29:
+case 30:
 YY_RULE_SETUP
-#line 119 "./scanner.l"
+#line 120 "./scanner.l"
 {
 	BEGIN(RANGE_INT);
 	return simple(TOKEN_COLON);
 }
 	YY_BREAK
-case 30:
+case 31:
 YY_RULE_SETUP
-#line 124 "./scanner.l"
+#line 125 "./scanner.l"
 {
 	BEGIN(RANGE_INT);
 	return simple(TOKEN_HYPHEN);
 }
 	YY_BREAK
-case 31:
+case 32:
 YY_RULE_SETUP
-#line 129 "./scanner.l"
+#line 130 "./scanner.l"
 {
 	BEGIN(RANGE_INT);
 	return simple(TOKEN_COMMA);
 }
 	YY_BREAK
-case 32:
+case 33:
 YY_RULE_SETUP
-#line 134 "./scanner.l"
+#line 135 "./scanner.l"
 {
 	BEGIN(INITIAL);
 	return simple(TOKEN_RBRACKET);
 }
 	YY_BREAK
 /* Error if none of the above while scanning a range (slice) */
-case 33:
+case 34:
+/* rule 34 can match eol */
 YY_RULE_SETUP
-#line 141 "./scanner.l"
+#line 142 "./scanner.l"
 {
-	dfilter_fail("Invalid string \"%s\" found while scanning slice.", yytext);
+	dfilter_fail("Invalid string \"%s\" found while scanning slice.", df_text);
 	return SCAN_FAILED;
 }
 	YY_BREAK
 /* XXX It would be nice to be able to match an entire non-integer string,
 	 * but beware of Flex's "match the most text" rule.
 	 */
-case 34:
+case 35:
 YY_RULE_SETUP
-#line 150 "./scanner.l"
+#line 151 "./scanner.l"
 {
-	dfilter_fail("Invalid character \"%s\" found while scanning slice; expected integer.", yytext);
+	dfilter_fail("Invalid character \"%s\" found while scanning slice; expected integer.", df_text);
 	return SCAN_FAILED;
 }
 	YY_BREAK
-case 35:
+case 36:
 YY_RULE_SETUP
-#line 155 "./scanner.l"
+#line 156 "./scanner.l"
 {
 	/* start quote */
 	/* The example of how to scan for strings was taken from
@@ -1025,7 +1101,7 @@
 }
 	YY_BREAK
 case YY_STATE_EOF(DQUOTE):
-#line 176 "./scanner.l"
+#line 177 "./scanner.l"
 {
 	/* unterminated string */
 	/* The example of how to handle unclosed strings was taken from
@@ -1037,9 +1113,9 @@
 	return SCAN_FAILED;
 }
 	YY_BREAK
-case 36:
+case 37:
 YY_RULE_SETUP
-#line 187 "./scanner.l"
+#line 188 "./scanner.l"
 {
 	/* end quote */
 	int token;
@@ -1050,88 +1126,89 @@
 	return token;
 }
 	YY_BREAK
-case 37:
+case 38:
 YY_RULE_SETUP
-#line 197 "./scanner.l"
+#line 198 "./scanner.l"
 {
 	/* octal sequence */
 	unsigned int result;
-	sscanf(yytext + 1, "%o", &result);
+	sscanf(df_text + 1, "%o", &result);
 	if (result > 0xff) {
 		g_string_free(quoted_string, TRUE);
 		quoted_string = NULL;
-		dfilter_fail("%s is larger than 255.", yytext);
+		dfilter_fail("%s is larger than 255.", df_text);
 		return SCAN_FAILED;
 	}
 	g_string_append_c(quoted_string, (gchar) result);
 }
 	YY_BREAK
-case 38:
+case 39:
 YY_RULE_SETUP
-#line 210 "./scanner.l"
+#line 211 "./scanner.l"
 {
 	/* hex sequence */
 	unsigned int result;
-	sscanf(yytext + 2, "%x", &result);
+	sscanf(df_text + 2, "%x", &result);
 	g_string_append_c(quoted_string, (gchar) result);
 }
 	YY_BREAK
-case 39:
+case 40:
 YY_RULE_SETUP
-#line 218 "./scanner.l"
+#line 219 "./scanner.l"
 {
 	/* escaped character */
-	g_string_append_c(quoted_string, yytext[1]);
+	g_string_append_c(quoted_string, df_text[1]);
 }
 	YY_BREAK
-case 40:
+case 41:
+/* rule 41 can match eol */
 YY_RULE_SETUP
-#line 223 "./scanner.l"
+#line 224 "./scanner.l"
 {
 	/* non-escaped string */
-	g_string_append(quoted_string, yytext);
+	g_string_append(quoted_string, df_text);
 }
 	YY_BREAK
-case 41:
+case 42:
 YY_RULE_SETUP
-#line 230 "./scanner.l"
+#line 231 "./scanner.l"
 {
         /* CIDR */
-        return set_lval(TOKEN_UNPARSED, yytext);
+        return set_lval(TOKEN_UNPARSED, df_text);
 }
 	YY_BREAK
-case 42:
+case 43:
 YY_RULE_SETUP
-#line 235 "./scanner.l"
+#line 236 "./scanner.l"
 {
 	/* Is it a field name? */
 	header_field_info *hfinfo;
 
-	hfinfo = proto_registrar_get_byname(yytext);
+	hfinfo = proto_registrar_get_byname(df_text);
 	if (hfinfo) {
 		/* Yes, it's a field name */
 		return set_lval(TOKEN_FIELD, hfinfo);
 	}
 	else {
 		/* No, so treat it as an unparsed string */
-		return set_lval(TOKEN_UNPARSED, yytext);
+		return set_lval(TOKEN_UNPARSED, df_text);
 	}
 }
 	YY_BREAK
-case 43:
+case 44:
 YY_RULE_SETUP
-#line 250 "./scanner.l"
+#line 251 "./scanner.l"
 {
 	/* Default */
-	return set_lval(TOKEN_UNPARSED, yytext);
+	return set_lval(TOKEN_UNPARSED, df_text);
 }
 	YY_BREAK
-case 44:
+case 45:
 YY_RULE_SETUP
-#line 256 "./scanner.l"
+#line 257 "./scanner.l"
 ECHO;
 	YY_BREAK
-#line 1135 "scanner.c"
+#line 1212 "scanner.c"
 case YY_STATE_EOF(INITIAL):
 case YY_STATE_EOF(RANGE_INT):
 case YY_STATE_EOF(RANGE_PUNCT):
@@ -1140,26 +1217,26 @@
 	case YY_END_OF_BUFFER:
 		{
 		/* Amount of text matched not including the EOB char. */
-		int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1;
+		int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1;
 
 		/* Undo the effects of YY_DO_BEFORE_ACTION. */
-		*yy_cp = yy_hold_char;
+		*yy_cp = (yy_hold_char);
 		YY_RESTORE_YY_MORE_OFFSET
 
-		if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW )
+		if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
 			{
 			/* We're scanning a new file or input source.  It's
 			 * possible that this happened because the user
-			 * just pointed yyin at a new source and called
-			 * yylex().  If so, then we have to assure
-			 * consistency between yy_current_buffer and our
+			 * just pointed df_in at a new source and called
+			 * df_lex().  If so, then we have to assure
+			 * consistency between YY_CURRENT_BUFFER and our
 			 * globals.  Here is the right place to do so, because
 			 * this is the first action (other than possibly a
 			 * back-up) that will match for the new input source.
 			 */
-			yy_n_chars = yy_current_buffer->yy_n_chars;
-			yy_current_buffer->yy_input_file = yyin;
-			yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL;
+			(yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+			YY_CURRENT_BUFFER_LVALUE->yy_input_file = df_in;
+			YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
 			}
 
 		/* Note that here we test for yy_c_buf_p "<=" to the position
@@ -1169,13 +1246,13 @@
 		 * end-of-buffer state).  Contrast this with the test
 		 * in input().
 		 */
-		if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] )
+		if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
 			{ /* This was really a NUL. */
 			yy_state_type yy_next_state;
 
-			yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text;
+			(yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text;
 
-			yy_current_state = yy_get_previous_state();
+			yy_current_state = yy_get_previous_state(  );
 
 			/* Okay, we're now positioned to make the NUL
 			 * transition.  We couldn't have
@@ -1188,41 +1265,41 @@
 
 			yy_next_state = yy_try_NUL_trans( yy_current_state );
 
-			yy_bp = yytext_ptr + YY_MORE_ADJ;
+			yy_bp = (yytext_ptr) + YY_MORE_ADJ;
 
 			if ( yy_next_state )
 				{
 				/* Consume the NUL. */
-				yy_cp = ++yy_c_buf_p;
+				yy_cp = ++(yy_c_buf_p);
 				yy_current_state = yy_next_state;
 				goto yy_match;
 				}
 
 			else
 				{
-				yy_cp = yy_c_buf_p;
+				yy_cp = (yy_c_buf_p);
 				goto yy_find_action;
 				}
 			}
 
-		else switch ( yy_get_next_buffer() )
+		else switch ( yy_get_next_buffer(  ) )
 			{
 			case EOB_ACT_END_OF_FILE:
 				{
-				yy_did_buffer_switch_on_eof = 0;
+				(yy_did_buffer_switch_on_eof) = 0;
 
-				if ( yywrap() )
+				if ( df_wrap( ) )
 					{
 					/* Note: because we've taken care in
 					 * yy_get_next_buffer() to have set up
-					 * yytext, we can now set up
+					 * df_text, we can now set up
 					 * yy_c_buf_p so that if some total
 					 * hoser (like flex itself) wants to
 					 * call the scanner after we return the
 					 * YY_NULL, it'll still work - another
 					 * YY_NULL will get returned.
 					 */
-					yy_c_buf_p = yytext_ptr + YY_MORE_ADJ;
+					(yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ;
 
 					yy_act = YY_STATE_EOF(YY_START);
 					goto do_action;
@@ -1230,30 +1307,30 @@
 
 				else
 					{
-					if ( ! yy_did_buffer_switch_on_eof )
+					if ( ! (yy_did_buffer_switch_on_eof) )
 						YY_NEW_FILE;
 					}
 				break;
 				}
 
 			case EOB_ACT_CONTINUE_SCAN:
-				yy_c_buf_p =
-					yytext_ptr + yy_amount_of_matched_text;
+				(yy_c_buf_p) =
+					(yytext_ptr) + yy_amount_of_matched_text;
 
-				yy_current_state = yy_get_previous_state();
+				yy_current_state = yy_get_previous_state(  );
 
-				yy_cp = yy_c_buf_p;
-				yy_bp = yytext_ptr + YY_MORE_ADJ;
+				yy_cp = (yy_c_buf_p);
+				yy_bp = (yytext_ptr) + YY_MORE_ADJ;
 				goto yy_match;
 
 			case EOB_ACT_LAST_MATCH:
-				yy_c_buf_p =
-				&yy_current_buffer->yy_ch_buf[yy_n_chars];
+				(yy_c_buf_p) =
+				&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)];
 
-				yy_current_state = yy_get_previous_state();
+				yy_current_state = yy_get_previous_state(  );
 
-				yy_cp = yy_c_buf_p;
-				yy_bp = yytext_ptr + YY_MORE_ADJ;
+				yy_cp = (yy_c_buf_p);
+				yy_bp = (yytext_ptr) + YY_MORE_ADJ;
 				goto yy_find_action;
 			}
 		break;
@@ -1264,8 +1341,7 @@
 			"fatal flex scanner internal error--no action found" );
 	} /* end of action switch */
 		} /* end of scanning one token */
-	} /* end of yylex */
-
+} /* end of df_lex */
 
 /* yy_get_next_buffer - try to read in a new buffer
  *
@@ -1274,21 +1350,20 @@
  *	EOB_ACT_CONTINUE_SCAN - continue scanning from current position
  *	EOB_ACT_END_OF_FILE - end of file
  */
-
-static int yy_get_next_buffer()
-	{
-	register char *dest = yy_current_buffer->yy_ch_buf;
-	register char *source = yytext_ptr;
+static int yy_get_next_buffer (void)
+{
+    	register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
+	register char *source = (yytext_ptr);
 	register int number_to_move, i;
 	int ret_val;
 
-	if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] )
+	if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] )
 		YY_FATAL_ERROR(
 		"fatal flex scanner internal error--end of buffer missed" );
 
-	if ( yy_current_buffer->yy_fill_buffer == 0 )
+	if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
 		{ /* Don't try to fill the buffer, so this is an EOF. */
-		if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 )
+		if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 )
 			{
 			/* We matched a single character, the EOB, so
 			 * treat this as a final EOF.
@@ -1308,34 +1383,30 @@
 	/* Try to read more data. */
 
 	/* First move last chars to start of buffer. */
-	number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1;
+	number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1;
 
 	for ( i = 0; i < number_to_move; ++i )
 		*(dest++) = *(source++);
 
-	if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+	if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
 		/* don't do the read, it's not guaranteed to return an EOF,
 		 * just force an EOF
 		 */
-		yy_current_buffer->yy_n_chars = yy_n_chars = 0;
+		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0;
 
 	else
 		{
-		int num_to_read =
-			yy_current_buffer->yy_buf_size - number_to_move - 1;
+			size_t num_to_read =
+			YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
 
 		while ( num_to_read <= 0 )
 			{ /* Not enough room in the buffer - grow it. */
-#ifdef YY_USES_REJECT
-			YY_FATAL_ERROR(
-"input buffer overflow, can't enlarge buffer because scanner uses REJECT" );
-#else
 
 			/* just a shorter name for the current buffer */
-			YY_BUFFER_STATE b = yy_current_buffer;
+			YY_BUFFER_STATE b = YY_CURRENT_BUFFER;
 
 			int yy_c_buf_p_offset =
-				(int) (yy_c_buf_p - b->yy_ch_buf);
+				(int) ((yy_c_buf_p) - b->yy_ch_buf);
 
 			if ( b->yy_is_our_buffer )
 				{
@@ -1348,8 +1419,7 @@
 
 				b->yy_ch_buf = (char *)
 					/* Include room in for 2 EOB chars. */
-					yy_flex_realloc( (void *) b->yy_ch_buf,
-							 b->yy_buf_size + 2 );
+					df_realloc((void *) b->yy_ch_buf,b->yy_buf_size + 2  );
 				}
 			else
 				/* Can't grow it, we don't own it. */
@@ -1359,35 +1429,35 @@
 				YY_FATAL_ERROR(
 				"fatal error - scanner input buffer overflow" );
 
-			yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset];
+			(yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset];
 
-			num_to_read = yy_current_buffer->yy_buf_size -
+			num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size -
 						number_to_move - 1;
-#endif
+
 			}
 
 		if ( num_to_read > YY_READ_BUF_SIZE )
 			num_to_read = YY_READ_BUF_SIZE;
 
 		/* Read in more data. */
-		YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]),
-			yy_n_chars, num_to_read );
+		YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
+			(yy_n_chars), num_to_read );
 
-		yy_current_buffer->yy_n_chars = yy_n_chars;
+		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
 		}
 
-	if ( yy_n_chars == 0 )
+	if ( (yy_n_chars) == 0 )
 		{
 		if ( number_to_move == YY_MORE_ADJ )
 			{
 			ret_val = EOB_ACT_END_OF_FILE;
-			yyrestart( yyin );
+			df_restart(df_in  );
 			}
 
 		else
 			{
 			ret_val = EOB_ACT_LAST_MATCH;
-			yy_current_buffer->yy_buffer_status =
+			YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
 				YY_BUFFER_EOF_PENDING;
 			}
 		}
@@ -1395,153 +1465,137 @@
 	else
 		ret_val = EOB_ACT_CONTINUE_SCAN;
 
-	yy_n_chars += number_to_move;
-	yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR;
-	yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR;
+	(yy_n_chars) += number_to_move;
+	YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
+	YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;
 
-	yytext_ptr = &yy_current_buffer->yy_ch_buf[0];
+	(yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
 
 	return ret_val;
-	}
-
+}
 
 /* yy_get_previous_state - get the state just before the EOB char was reached */
 
-static yy_state_type yy_get_previous_state()
-	{
+    static yy_state_type yy_get_previous_state (void)
+{
 	register yy_state_type yy_current_state;
 	register char *yy_cp;
+    
+	yy_current_state = (yy_start);
 
-	yy_current_state = yy_start;
-
-	for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp )
+	for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )
 		{
 		register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
 		if ( yy_accept[yy_current_state] )
 			{
-			yy_last_accepting_state = yy_current_state;
-			yy_last_accepting_cpos = yy_cp;
+			(yy_last_accepting_state) = yy_current_state;
+			(yy_last_accepting_cpos) = yy_cp;
 			}
 		while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
 			{
 			yy_current_state = (int) yy_def[yy_current_state];
-			if ( yy_current_state >= 109 )
+			if ( yy_current_state >= 115 )
 				yy_c = yy_meta[(unsigned int) yy_c];
 			}
 		yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
 		}
 
 	return yy_current_state;
-	}
-
+}
 
 /* yy_try_NUL_trans - try to make a transition on the NUL character
  *
  * synopsis
  *	next_state = yy_try_NUL_trans( current_state );
  */
-
-#ifdef YY_USE_PROTOS
-static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state )
-#else
-static yy_state_type yy_try_NUL_trans( yy_current_state )
-yy_state_type yy_current_state;
-#endif
-	{
+    static yy_state_type yy_try_NUL_trans  (yy_state_type yy_current_state )
+{
 	register int yy_is_jam;
-	register char *yy_cp = yy_c_buf_p;
+    	register char *yy_cp = (yy_c_buf_p);
 
 	register YY_CHAR yy_c = 1;
 	if ( yy_accept[yy_current_state] )
 		{
-		yy_last_accepting_state = yy_current_state;
-		yy_last_accepting_cpos = yy_cp;
+		(yy_last_accepting_state) = yy_current_state;
+		(yy_last_accepting_cpos) = yy_cp;
 		}
 	while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
 		{
 		yy_current_state = (int) yy_def[yy_current_state];
-		if ( yy_current_state >= 109 )
+		if ( yy_current_state >= 115 )
 			yy_c = yy_meta[(unsigned int) yy_c];
 		}
 	yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
-	yy_is_jam = (yy_current_state == 108);
+	yy_is_jam = (yy_current_state == 114);
 
 	return yy_is_jam ? 0 : yy_current_state;
-	}
-
+}
 
-#ifndef YY_NO_UNPUT
-#ifdef YY_USE_PROTOS
-static void yyunput( int c, register char *yy_bp )
-#else
-static void yyunput( c, yy_bp )
-int c;
-register char *yy_bp;
-#endif
-	{
-	register char *yy_cp = yy_c_buf_p;
+    static void yyunput (int c, register char * yy_bp )
+{
+	register char *yy_cp;
+    
+    yy_cp = (yy_c_buf_p);
 
-	/* undo effects of setting up yytext */
-	*yy_cp = yy_hold_char;
+	/* undo effects of setting up df_text */
+	*yy_cp = (yy_hold_char);
 
-	if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )
+	if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
 		{ /* need to shift things up to make room */
 		/* +2 for EOB chars. */
-		register int number_to_move = yy_n_chars + 2;
-		register char *dest = &yy_current_buffer->yy_ch_buf[
-					yy_current_buffer->yy_buf_size + 2];
+		register int number_to_move = (yy_n_chars) + 2;
+		register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[
+					YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2];
 		register char *source =
-				&yy_current_buffer->yy_ch_buf[number_to_move];
+				&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move];
 
-		while ( source > yy_current_buffer->yy_ch_buf )
+		while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
 			*--dest = *--source;
 
 		yy_cp += (int) (dest - source);
 		yy_bp += (int) (dest - source);
-		yy_current_buffer->yy_n_chars =
-			yy_n_chars = yy_current_buffer->yy_buf_size;
+		YY_CURRENT_BUFFER_LVALUE->yy_n_chars =
+			(yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size;
 
-		if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )
+		if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
 			YY_FATAL_ERROR( "flex scanner push-back overflow" );
 		}
 
 	*--yy_cp = (char) c;
 
-
-	yytext_ptr = yy_bp;
-	yy_hold_char = *yy_cp;
-	yy_c_buf_p = yy_cp;
-	}
-#endif	/* ifndef YY_NO_UNPUT */
-
+	(yytext_ptr) = yy_bp;
+	(yy_hold_char) = *yy_cp;
+	(yy_c_buf_p) = yy_cp;
+}
 
 #ifndef YY_NO_INPUT
 #ifdef __cplusplus
-static int yyinput()
+    static int yyinput (void)
 #else
-static int input()
+    static int input  (void)
 #endif
-	{
-	int c;
 
-	*yy_c_buf_p = yy_hold_char;
+{
+	int c;
+    
+	*(yy_c_buf_p) = (yy_hold_char);
 
-	if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR )
+	if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR )
 		{
 		/* yy_c_buf_p now points to the character we want to return.
 		 * If this occurs *before* the EOB characters, then it's a
 		 * valid NUL; if not, then we've hit the end of the buffer.
 		 */
-		if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] )
+		if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
 			/* This was really a NUL. */
-			*yy_c_buf_p = '\0';
+			*(yy_c_buf_p) = '\0';
 
 		else
 			{ /* need more input */
-			int offset = yy_c_buf_p - yytext_ptr;
-			++yy_c_buf_p;
+			int offset = (yy_c_buf_p) - (yytext_ptr);
+			++(yy_c_buf_p);
 
-			switch ( yy_get_next_buffer() )
+			switch ( yy_get_next_buffer(  ) )
 				{
 				case EOB_ACT_LAST_MATCH:
 					/* This happens because yy_g_n_b()
@@ -1555,16 +1609,16 @@
 					 */
 
 					/* Reset buffer status. */
-					yyrestart( yyin );
+					df_restart(df_in );
 
-					/* fall through */
+					/*FALLTHROUGH*/
 
 				case EOB_ACT_END_OF_FILE:
 					{
-					if ( yywrap() )
+					if ( df_wrap( ) )
 						return EOF;
 
-					if ( ! yy_did_buffer_switch_on_eof )
+					if ( ! (yy_did_buffer_switch_on_eof) )
 						YY_NEW_FILE;
 #ifdef __cplusplus
 					return yyinput();
@@ -1574,167 +1628,169 @@
 					}
 
 				case EOB_ACT_CONTINUE_SCAN:
-					yy_c_buf_p = yytext_ptr + offset;
+					(yy_c_buf_p) = (yytext_ptr) + offset;
 					break;
 				}
 			}
 		}
 
-	c = *(unsigned char *) yy_c_buf_p;	/* cast for 8-bit char's */
-	*yy_c_buf_p = '\0';	/* preserve yytext */
-	yy_hold_char = *++yy_c_buf_p;
-
+	c = *(unsigned char *) (yy_c_buf_p);	/* cast for 8-bit char's */
+	*(yy_c_buf_p) = '\0';	/* preserve df_text */
+	(yy_hold_char) = *++(yy_c_buf_p);
 
 	return c;
-	}
-#endif /* YY_NO_INPUT */
-
-#ifdef YY_USE_PROTOS
-void yyrestart( FILE *input_file )
-#else
-void yyrestart( input_file )
-FILE *input_file;
-#endif
-	{
-	if ( ! yy_current_buffer )
-		yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE );
+}
+#endif	/* ifndef YY_NO_INPUT */
 
-	yy_init_buffer( yy_current_buffer, input_file );
-	yy_load_buffer_state();
+/** Immediately switch to a different input stream.
+ * @param input_file A readable stream.
+ * 
+ * @note This function does not reset the start condition to @c INITIAL .
+ */
+    void df_restart  (FILE * input_file )
+{
+    
+	if ( ! YY_CURRENT_BUFFER ){
+        df_ensure_buffer_stack ();
+		YY_CURRENT_BUFFER_LVALUE =
+            df__create_buffer(df_in,YY_BUF_SIZE );
 	}
 
+	df__init_buffer(YY_CURRENT_BUFFER,input_file );
+	df__load_buffer_state( );
+}
 
-#ifdef YY_USE_PROTOS
-void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer )
-#else
-void yy_switch_to_buffer( new_buffer )
-YY_BUFFER_STATE new_buffer;
-#endif
-	{
-	if ( yy_current_buffer == new_buffer )
+/** Switch to a different input buffer.
+ * @param new_buffer The new input buffer.
+ * 
+ */
+    void df__switch_to_buffer  (YY_BUFFER_STATE  new_buffer )
+{
+    
+	/* TODO. We should be able to replace this entire function body
+	 * with
+	 *		df_pop_buffer_state();
+	 *		df_push_buffer_state(new_buffer);
+     */
+	df_ensure_buffer_stack ();
+	if ( YY_CURRENT_BUFFER == new_buffer )
 		return;
 
-	if ( yy_current_buffer )
+	if ( YY_CURRENT_BUFFER )
 		{
 		/* Flush out information for old buffer. */
-		*yy_c_buf_p = yy_hold_char;
-		yy_current_buffer->yy_buf_pos = yy_c_buf_p;
-		yy_current_buffer->yy_n_chars = yy_n_chars;
+		*(yy_c_buf_p) = (yy_hold_char);
+		YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
 		}
 
-	yy_current_buffer = new_buffer;
-	yy_load_buffer_state();
+	YY_CURRENT_BUFFER_LVALUE = new_buffer;
+	df__load_buffer_state( );
 
 	/* We don't actually know whether we did this switch during
-	 * EOF (yywrap()) processing, but the only time this flag
-	 * is looked at is after yywrap() is called, so it's safe
+	 * EOF (df_wrap()) processing, but the only time this flag
+	 * is looked at is after df_wrap() is called, so it's safe
 	 * to go ahead and always set it.
 	 */
-	yy_did_buffer_switch_on_eof = 1;
-	}
-
-
-#ifdef YY_USE_PROTOS
-void yy_load_buffer_state( void )
-#else
-void yy_load_buffer_state()
-#endif
-	{
-	yy_n_chars = yy_current_buffer->yy_n_chars;
-	yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos;
-	yyin = yy_current_buffer->yy_input_file;
-	yy_hold_char = *yy_c_buf_p;
-	}
+	(yy_did_buffer_switch_on_eof) = 1;
+}
 
+static void df__load_buffer_state  (void)
+{
+    	(yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+	(yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
+	df_in = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
+	(yy_hold_char) = *(yy_c_buf_p);
+}
 
-#ifdef YY_USE_PROTOS
-YY_BUFFER_STATE yy_create_buffer( FILE *file, int size )
-#else
-YY_BUFFER_STATE yy_create_buffer( file, size )
-FILE *file;
-int size;
-#endif
-	{
+/** Allocate and initialize an input buffer state.
+ * @param file A readable stream.
+ * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
+ * 
+ * @return the allocated buffer state.
+ */
+    YY_BUFFER_STATE df__create_buffer  (FILE * file, int  size )
+{
 	YY_BUFFER_STATE b;
-
-	b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );
+    
+	b = (YY_BUFFER_STATE) df_alloc(sizeof( struct yy_buffer_state )  );
 	if ( ! b )
-		YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+		YY_FATAL_ERROR( "out of dynamic memory in df__create_buffer()" );
 
 	b->yy_buf_size = size;
 
 	/* yy_ch_buf has to be 2 characters longer than the size given because
 	 * we need to put in 2 end-of-buffer characters.
 	 */
-	b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 );
+	b->yy_ch_buf = (char *) df_alloc(b->yy_buf_size + 2  );
 	if ( ! b->yy_ch_buf )
-		YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+		YY_FATAL_ERROR( "out of dynamic memory in df__create_buffer()" );
 
 	b->yy_is_our_buffer = 1;
 
-	yy_init_buffer( b, file );
+	df__init_buffer(b,file );
 
 	return b;
-	}
-
+}
 
-#ifdef YY_USE_PROTOS
-void yy_delete_buffer( YY_BUFFER_STATE b )
-#else
-void yy_delete_buffer( b )
-YY_BUFFER_STATE b;
-#endif
-	{
+/** Destroy the buffer.
+ * @param b a buffer created with df__create_buffer()
+ * 
+ */
+    void df__delete_buffer (YY_BUFFER_STATE  b )
+{
+    
 	if ( ! b )
 		return;
 
-	if ( b == yy_current_buffer )
-		yy_current_buffer = (YY_BUFFER_STATE) 0;
+	if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
+		YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
 
 	if ( b->yy_is_our_buffer )
-		yy_flex_free( (void *) b->yy_ch_buf );
-
-	yy_flex_free( (void *) b );
-	}
+		df_free((void *) b->yy_ch_buf  );
 
+	df_free((void *) b  );
+}
 
+#ifndef __cplusplus
+extern int isatty (int );
+#endif /* __cplusplus */
+    
+/* Initializes or reinitializes a buffer.
+ * This function is sometimes called more than once on the same buffer,
+ * such as during a df_restart() or at EOF.
+ */
+    static void df__init_buffer  (YY_BUFFER_STATE  b, FILE * file )
 
-#ifdef YY_USE_PROTOS
-void yy_init_buffer( YY_BUFFER_STATE b, FILE *file )
-#else
-void yy_init_buffer( b, file )
-YY_BUFFER_STATE b;
-FILE *file;
-#endif
-
-
-	{
-	yy_flush_buffer( b );
+{
+	int oerrno = errno;
+    
+	df__flush_buffer(b );
 
 	b->yy_input_file = file;
 	b->yy_fill_buffer = 1;
 
-#if YY_ALWAYS_INTERACTIVE
-	b->yy_is_interactive = 1;
-#else
-#if YY_NEVER_INTERACTIVE
-	b->yy_is_interactive = 0;
-#else
-	b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
-#endif
-#endif
-	}
-
-
-#ifdef YY_USE_PROTOS
-void yy_flush_buffer( YY_BUFFER_STATE b )
-#else
-void yy_flush_buffer( b )
-YY_BUFFER_STATE b;
-#endif
+    /* If b is the current buffer, then df__init_buffer was _probably_
+     * called from df_restart() or through yy_get_next_buffer.
+     * In that case, we don't want to reset the lineno or column.
+     */
+    if (b != YY_CURRENT_BUFFER){
+        b->yy_bs_lineno = 1;
+        b->yy_bs_column = 0;
+    }
+
+        b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
+    
+	errno = oerrno;
+}
 
-	{
-	if ( ! b )
+/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
+ * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
+ * 
+ */
+    void df__flush_buffer (YY_BUFFER_STATE  b )
+{
+    	if ( ! b )
 		return;
 
 	b->yy_n_chars = 0;
@@ -1751,31 +1807,123 @@
 	b->yy_at_bol = 1;
 	b->yy_buffer_status = YY_BUFFER_NEW;
 
-	if ( b == yy_current_buffer )
-		yy_load_buffer_state();
+	if ( b == YY_CURRENT_BUFFER )
+		df__load_buffer_state( );
+}
+
+/** Pushes the new state onto the stack. The new state becomes
+ *  the current state. This function will allocate the stack
+ *  if necessary.
+ *  @param new_buffer The new state.
+ *  
+ */
+void df_push_buffer_state (YY_BUFFER_STATE new_buffer )
+{
+    	if (new_buffer == NULL)
+		return;
+
+	df_ensure_buffer_stack();
+
+	/* This block is copied from df__switch_to_buffer. */
+	if ( YY_CURRENT_BUFFER )
+		{
+		/* Flush out information for old buffer. */
+		*(yy_c_buf_p) = (yy_hold_char);
+		YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+		}
+
+	/* Only push if top exists. Otherwise, replace top. */
+	if (YY_CURRENT_BUFFER)
+		(yy_buffer_stack_top)++;
+	YY_CURRENT_BUFFER_LVALUE = new_buffer;
+
+	/* copied from df__switch_to_buffer. */
+	df__load_buffer_state( );
+	(yy_did_buffer_switch_on_eof) = 1;
+}
+
+/** Removes and deletes the top of the stack, if present.
+ *  The next element becomes the new top.
+ *  
+ */
+void df_pop_buffer_state (void)
+{
+    	if (!YY_CURRENT_BUFFER)
+		return;
+
+	df__delete_buffer(YY_CURRENT_BUFFER );
+	YY_CURRENT_BUFFER_LVALUE = NULL;
+	if ((yy_buffer_stack_top) > 0)
+		--(yy_buffer_stack_top);
+
+	if (YY_CURRENT_BUFFER) {
+		df__load_buffer_state( );
+		(yy_did_buffer_switch_on_eof) = 1;
 	}
+}
 
+/* Allocates the stack if it does not exist.
+ *  Guarantees space for at least one push.
+ */
+static void df_ensure_buffer_stack (void)
+{
+	int num_to_alloc;
+    
+	if (!(yy_buffer_stack)) {
+
+		/* First allocation is just for 2 elements, since we don't know if this
+		 * scanner will even need a stack. We use 2 instead of 1 to avoid an
+		 * immediate realloc on the next call.
+         */
+		num_to_alloc = 1;
+		(yy_buffer_stack) = (struct yy_buffer_state**)df_alloc
+								(num_to_alloc * sizeof(struct yy_buffer_state*)
+								);
+		
+		memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
+				
+		(yy_buffer_stack_max) = num_to_alloc;
+		(yy_buffer_stack_top) = 0;
+		return;
+	}
 
-#ifndef YY_NO_SCAN_BUFFER
-#ifdef YY_USE_PROTOS
-YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size )
-#else
-YY_BUFFER_STATE yy_scan_buffer( base, size )
-char *base;
-yy_size_t size;
-#endif
-	{
-	YY_BUFFER_STATE b;
+	if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){
+
+		/* Increase the buffer to prepare for a possible push. */
+		int grow_size = 8 /* arbitrary grow size */;
+
+		num_to_alloc = (yy_buffer_stack_max) + grow_size;
+		(yy_buffer_stack) = (struct yy_buffer_state**)df_realloc
+								((yy_buffer_stack),
+								num_to_alloc * sizeof(struct yy_buffer_state*)
+								);
+
+		/* zero only the new slots.*/
+		memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
+		(yy_buffer_stack_max) = num_to_alloc;
+	}
+}
 
+/** Setup the input buffer state to scan directly from a user-specified character buffer.
+ * @param base the character buffer
+ * @param size the size in bytes of the character buffer
+ * 
+ * @return the newly allocated buffer state object. 
+ */
+YY_BUFFER_STATE df__scan_buffer  (char * base, yy_size_t  size )
+{
+	YY_BUFFER_STATE b;
+    
 	if ( size < 2 ||
 	     base[size-2] != YY_END_OF_BUFFER_CHAR ||
 	     base[size-1] != YY_END_OF_BUFFER_CHAR )
 		/* They forgot to leave room for the EOB's. */
 		return 0;
 
-	b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );
+	b = (YY_BUFFER_STATE) df_alloc(sizeof( struct yy_buffer_state )  );
 	if ( ! b )
-		YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );
+		YY_FATAL_ERROR( "out of dynamic memory in df__scan_buffer()" );
 
 	b->yy_buf_size = size - 2;	/* "- 2" to take care of EOB's */
 	b->yy_buf_pos = b->yy_ch_buf = base;
@@ -1787,58 +1935,53 @@
 	b->yy_fill_buffer = 0;
 	b->yy_buffer_status = YY_BUFFER_NEW;
 
-	yy_switch_to_buffer( b );
+	df__switch_to_buffer(b  );
 
 	return b;
-	}
-#endif
-
-
-#ifndef YY_NO_SCAN_STRING
-#ifdef YY_USE_PROTOS
-YY_BUFFER_STATE yy_scan_string( yyconst char *yy_str )
-#else
-YY_BUFFER_STATE yy_scan_string( yy_str )
-yyconst char *yy_str;
-#endif
-	{
-	int len;
-	for ( len = 0; yy_str[len]; ++len )
-		;
-
-	return yy_scan_bytes( yy_str, len );
-	}
-#endif
+}
 
+/** Setup the input buffer state to scan a string. The next call to df_lex() will
+ * scan from a @e copy of @a str.
+ * @param str a NUL-terminated string to scan
+ * 
+ * @return the newly allocated buffer state object.
+ * @note If you want to scan bytes that may contain NUL values, then use
+ *       df__scan_bytes() instead.
+ */
+YY_BUFFER_STATE df__scan_string (yyconst char * yy_str )
+{
+    
+	return df__scan_bytes(yy_str,strlen(yy_str) );
+}
 
-#ifndef YY_NO_SCAN_BYTES
-#ifdef YY_USE_PROTOS
-YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len )
-#else
-YY_BUFFER_STATE yy_scan_bytes( bytes, len )
-yyconst char *bytes;
-int len;
-#endif
-	{
+/** Setup the input buffer state to scan the given bytes. The next call to df_lex() will
+ * scan from a @e copy of @a bytes.
+ * @param bytes the byte buffer to scan
+ * @param len the number of bytes in the buffer pointed to by @a bytes.
+ * 
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE df__scan_bytes  (yyconst char * bytes, int  len )
+{
 	YY_BUFFER_STATE b;
 	char *buf;
 	yy_size_t n;
 	int i;
-
+    
 	/* Get memory for full buffer, including space for trailing EOB's. */
 	n = len + 2;
-	buf = (char *) yy_flex_alloc( n );
+	buf = (char *) df_alloc(n  );
 	if ( ! buf )
-		YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
+		YY_FATAL_ERROR( "out of dynamic memory in df__scan_bytes()" );
 
 	for ( i = 0; i < len; ++i )
 		buf[i] = bytes[i];
 
 	buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR;
 
-	b = yy_scan_buffer( buf, n );
+	b = df__scan_buffer(buf,n );
 	if ( ! b )
-		YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" );
+		YY_FATAL_ERROR( "bad buffer in df__scan_bytes()" );
 
 	/* It's okay to grow etc. this buffer, and we should throw it
 	 * away when we're done.
@@ -1846,148 +1989,164 @@
 	b->yy_is_our_buffer = 1;
 
 	return b;
-	}
-#endif
-
+}
 
-#ifndef YY_NO_PUSH_STATE
-#ifdef YY_USE_PROTOS
-static void yy_push_state( int new_state )
-#else
-static void yy_push_state( new_state )
-int new_state;
+#ifndef YY_EXIT_FAILURE
+#define YY_EXIT_FAILURE 2
 #endif
-	{
-	if ( yy_start_stack_ptr >= yy_start_stack_depth )
-		{
-		yy_size_t new_size;
 
-		yy_start_stack_depth += YY_START_STACK_INCR;
-		new_size = yy_start_stack_depth * sizeof( int );
+static void yy_fatal_error (yyconst char* msg )
+{
+    	(void) fprintf( stderr, "%s\n", msg );
+	exit( YY_EXIT_FAILURE );
+}
 
-		if ( ! yy_start_stack )
-			yy_start_stack = (int *) yy_flex_alloc( new_size );
+/* Redefine yyless() so it works in section 3 code. */
 
-		else
-			yy_start_stack = (int *) yy_flex_realloc(
-					(void *) yy_start_stack, new_size );
+#undef yyless
+#define yyless(n) \
+	do \
+		{ \
+		/* Undo effects of setting up df_text. */ \
+        int yyless_macro_arg = (n); \
+        YY_LESS_LINENO(yyless_macro_arg);\
+		df_text[df_leng] = (yy_hold_char); \
+		(yy_c_buf_p) = df_text + yyless_macro_arg; \
+		(yy_hold_char) = *(yy_c_buf_p); \
+		*(yy_c_buf_p) = '\0'; \
+		df_leng = yyless_macro_arg; \
+		} \
+	while ( 0 )
 
-		if ( ! yy_start_stack )
-			YY_FATAL_ERROR(
-			"out of memory expanding start-condition stack" );
-		}
+/* Accessor  methods (get/set functions) to struct members. */
 
-	yy_start_stack[yy_start_stack_ptr++] = YY_START;
+/** Get the current line number.
+ * 
+ */
+int df_get_lineno  (void)
+{
+        
+    return df_lineno;
+}
 
-	BEGIN(new_state);
-	}
-#endif
+/** Get the input stream.
+ * 
+ */
+FILE *df_get_in  (void)
+{
+        return df_in;
+}
 
+/** Get the output stream.
+ * 
+ */
+FILE *df_get_out  (void)
+{
+        return df_out;
+}
 
-#ifndef YY_NO_POP_STATE
-static void yy_pop_state()
-	{
-	if ( --yy_start_stack_ptr < 0 )
-		YY_FATAL_ERROR( "start-condition stack underflow" );
+/** Get the length of the current token.
+ * 
+ */
+int df_get_leng  (void)
+{
+        return df_leng;
+}
 
-	BEGIN(yy_start_stack[yy_start_stack_ptr]);
-	}
-#endif
+/** Get the current token.
+ * 
+ */
 
+char *df_get_text  (void)
+{
+        return df_text;
+}
 
-#ifndef YY_NO_TOP_STATE
-static int yy_top_state()
-	{
-	return yy_start_stack[yy_start_stack_ptr - 1];
-	}
-#endif
+/** Set the current line number.
+ * @param line_number
+ * 
+ */
+void df_set_lineno (int  line_number )
+{
+    
+    df_lineno = line_number;
+}
 
-#ifndef YY_EXIT_FAILURE
-#define YY_EXIT_FAILURE 2
-#endif
+/** Set the input stream. This does not discard the current
+ * input buffer.
+ * @param in_str A readable stream.
+ * 
+ * @see df__switch_to_buffer
+ */
+void df_set_in (FILE *  in_str )
+{
+        df_in = in_str ;
+}
 
-#ifdef YY_USE_PROTOS
-static void yy_fatal_error( yyconst char msg[] )
-#else
-static void yy_fatal_error( msg )
-char msg[];
-#endif
-	{
-	(void) fprintf( stderr, "%s\n", msg );
-	exit( YY_EXIT_FAILURE );
-	}
+void df_set_out (FILE *  out_str )
+{
+        df_out = out_str ;
+}
 
+int df_get_debug  (void)
+{
+        return df__flex_debug;
+}
 
+void df_set_debug (int  bdebug )
+{
+        df__flex_debug = bdebug ;
+}
 
-/* Redefine yyless() so it works in section 3 code. */
+/* df_lex_destroy is for both reentrant and non-reentrant scanners. */
+int df_lex_destroy  (void)
+{
+    
+    /* Pop the buffer stack, destroying each element. */
+	while(YY_CURRENT_BUFFER){
+		df__delete_buffer(YY_CURRENT_BUFFER  );
+		YY_CURRENT_BUFFER_LVALUE = NULL;
+		df_pop_buffer_state();
+	}
 
-#undef yyless
-#define yyless(n) \
-	do \
-		{ \
-		/* Undo effects of setting up yytext. */ \
-		yytext[yyleng] = yy_hold_char; \
-		yy_c_buf_p = yytext + n; \
-		yy_hold_char = *yy_c_buf_p; \
-		*yy_c_buf_p = '\0'; \
-		yyleng = n; \
-		} \
-	while ( 0 )
+	/* Destroy the stack itself. */
+	df_free((yy_buffer_stack) );
+	(yy_buffer_stack) = NULL;
 
+    return 0;
+}
 
-/* Internal utility routines. */
+/*
+ * Internal utility routines.
+ */
 
 #ifndef yytext_ptr
-#ifdef YY_USE_PROTOS
-static void yy_flex_strncpy( char *s1, yyconst char *s2, int n )
-#else
-static void yy_flex_strncpy( s1, s2, n )
-char *s1;
-yyconst char *s2;
-int n;
-#endif
-	{
+static void yy_flex_strncpy (char* s1, yyconst char * s2, int n )
+{
 	register int i;
-	for ( i = 0; i < n; ++i )
+    	for ( i = 0; i < n; ++i )
 		s1[i] = s2[i];
-	}
+}
 #endif
 
 #ifdef YY_NEED_STRLEN
-#ifdef YY_USE_PROTOS
-static int yy_flex_strlen( yyconst char *s )
-#else
-static int yy_flex_strlen( s )
-yyconst char *s;
-#endif
-	{
+static int yy_flex_strlen (yyconst char * s )
+{
 	register int n;
-	for ( n = 0; s[n]; ++n )
+    	for ( n = 0; s[n]; ++n )
 		;
 
 	return n;
-	}
+}
 #endif
 
-
-#ifdef YY_USE_PROTOS
-static void *yy_flex_alloc( yy_size_t size )
-#else
-static void *yy_flex_alloc( size )
-yy_size_t size;
-#endif
-	{
+void *df_alloc (yy_size_t  size )
+{
 	return (void *) malloc( size );
-	}
+}
 
-#ifdef YY_USE_PROTOS
-static void *yy_flex_realloc( void *ptr, yy_size_t size )
-#else
-static void *yy_flex_realloc( ptr, size )
-void *ptr;
-yy_size_t size;
-#endif
-	{
+void *df_realloc  (void * ptr, yy_size_t  size )
+{
 	/* The cast to (char *) in the following accommodates both
 	 * implementations that use char* generic pointers, and those
 	 * that use void* generic pointers.  It works with the latter
@@ -1996,26 +2155,29 @@
 	 * as though doing an assignment.
 	 */
 	return (void *) realloc( (char *) ptr, size );
-	}
+}
 
-#ifdef YY_USE_PROTOS
-static void yy_flex_free( void *ptr )
-#else
-static void yy_flex_free( ptr )
-void *ptr;
-#endif
-	{
-	free( ptr );
-	}
+void df_free (void * ptr )
+{
+	free( (char *) ptr );	/* see df_realloc() for (char *) cast */
+}
 
-#if YY_MAIN
-int main()
-	{
-	yylex();
-	return 0;
-	}
+#define YYTABLES_NAME "yytables"
+
+#undef YY_NEW_FILE
+#undef YY_FLUSH_BUFFER
+#undef yy_set_bol
+#undef yy_new_buffer
+#undef yy_set_interactive
+#undef yytext_ptr
+#undef YY_DO_BEFORE_ACTION
+
+#ifdef YY_DECL_IS_OURS
+#undef YY_DECL_IS_OURS
+#undef YY_DECL
 #endif
-#line 256 "./scanner.l"
+#line 257 "./scanner.l"
+
 
 
 static int
@@ -2041,6 +2203,7 @@
 		case TOKEN_TEST_NOT:
 		case TOKEN_TEST_AND:
 		case TOKEN_TEST_OR:
+		case TOKEN_RET:
 			break;
 		default:
 			g_assert_not_reached();
@@ -2146,3 +2309,4 @@
 }
 
 #include <lemonflex-tail.inc>
+
diff -ruN ../ethereal-0.10.11/epan/dfilter/scanner.l ethereal/epan/dfilter/scanner.l
--- ../ethereal-0.10.11/epan/dfilter/scanner.l	2005-05-02 23:28:08.000000000 +0200
+++ ethereal/epan/dfilter/scanner.l	2005-06-30 13:15:03.000000000 +0200
@@ -98,6 +98,7 @@
 "and"			return simple(TOKEN_TEST_AND);
 "||"			return simple(TOKEN_TEST_OR);
 "or"			return simple(TOKEN_TEST_OR);
+"return"		return simple(TOKEN_RET);
 
 
 
@@ -278,6 +279,7 @@
 		case TOKEN_TEST_NOT:
 		case TOKEN_TEST_AND:
 		case TOKEN_TEST_OR:
+		case TOKEN_RET:
 			break;
 		default:
 			g_assert_not_reached();
diff -ruN ../ethereal-0.10.11/epan/dfilter/semcheck.c ethereal/epan/dfilter/semcheck.c
--- ../ethereal-0.10.11/epan/dfilter/semcheck.c	2005-05-02 23:28:08.000000000 +0200
+++ ethereal/epan/dfilter/semcheck.c	2005-07-04 14:53:52.000000000 +0200
@@ -816,6 +816,10 @@
 		case TEST_OP_UNINITIALIZED:
 			g_assert_not_reached();
 			break;
+		
+		case RET:
+			check_exists(st_arg1);	
+			break;
 
 		case TEST_OP_EXISTS:
 			check_exists(st_arg1);
diff -ruN ../ethereal-0.10.11/epan/dfilter/sttype-test.c ethereal/epan/dfilter/sttype-test.c
--- ../ethereal-0.10.11/epan/dfilter/sttype-test.c	2005-05-02 23:28:08.000000000 +0200
+++ ethereal/epan/dfilter/sttype-test.c	2005-06-30 13:28:09.000000000 +0200
@@ -72,6 +72,7 @@
 			g_assert_not_reached();
 		case TEST_OP_EXISTS:
 		case TEST_OP_NOT:
+		case RET:
 			return 1;
 		case TEST_OP_AND:
 		case TEST_OP_OR:
diff -ruN ../ethereal-0.10.11/epan/dfilter/sttype-test.h ethereal/epan/dfilter/sttype-test.h
--- ../ethereal-0.10.11/epan/dfilter/sttype-test.h	2005-05-02 23:28:08.000000000 +0200
+++ ethereal/epan/dfilter/sttype-test.h	2005-06-30 11:40:54.000000000 +0200
@@ -38,7 +38,8 @@
 	TEST_OP_LE,
 	TEST_OP_BITWISE_AND,
 	TEST_OP_CONTAINS,
-	TEST_OP_MATCHES
+	TEST_OP_MATCHES,
+	RET
 } test_op_t;
 
 void
diff -ruN ../ethereal-0.10.11/epan/ftypes/Makefile.am ethereal/epan/ftypes/Makefile.am
--- ../ethereal-0.10.11/epan/ftypes/Makefile.am	2005-05-02 23:28:09.000000000 +0200
+++ ethereal/epan/ftypes/Makefile.am	2005-07-05 13:00:13.000000000 +0200
@@ -44,6 +44,8 @@
 	ftype-time.c	\
 	ftype-tvbuff.c
 
+libftypes_la_LDFLAGS=-export-dynamic
+
 libftypes_la_LIBADD = @GLIB_LIBS@ @PCRE_LIBS@
 
 EXTRA_DIST = \
diff -ruN ../ethereal-0.10.11/lib_ethereal.c ethereal/lib_ethereal.c
--- ../ethereal-0.10.11/lib_ethereal.c	1970-01-01 01:00:00.000000000 +0100
+++ ethereal/lib_ethereal.c	2005-07-07 14:20:33.000000000 +0200
@@ -0,0 +1,391 @@
+/* lib_ethereal.c
+ *
+ * $Id: patch-ethereal-0.9.15,v 1.3 2003/09/30 09:14:08 jan Exp $
+ *
+ * Ethereal - Network traffic analyzer
+ * By Gerald Combs <gerald@xxxxxxxxxxxx>
+ * Copyright 1998 Gerald Combs
+ *
+ * Text-mode variant, by Gilbert Ramirez <gram@xxxxxxxxxxxxxxx>
+ * and Guy Harris <guy@xxxxxxxxxxxx>.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <locale.h>
+#include <limits.h>
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#include <errno.h>
+
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+
+#include <signal.h>
+
+#ifdef HAVE_LIBPCAP
+#include <pcap.h>
+#include <setjmp.h>
+#endif
+
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+
+#ifdef NEED_SNPRINTF_H
+# include "snprintf.h"
+#endif
+
+#ifdef NEED_STRERROR_H
+#include "strerror.h"
+#endif
+
+#ifdef NEED_GETOPT_H
+#include "getopt.h"
+#endif
+
+#include <glib.h>
+#include <epan/epan.h>
+#include <epan/filesystem.h>
+
+#include "globals.h"
+#include <epan/timestamp.h>
+#include <epan/packet.h>
+#include "disabled_protos.h"
+#include <epan/prefs.h>
+#include <epan/addr_resolv.h>
+#include "util.h"
+
+#ifdef HAVE_LIBPCAP
+#include "pcap-util.h"
+#endif
+
+#include <epan/conversation.h>
+#include "register.h"
+#include "conditions.h"
+#include "capture_stop_conditions.h"
+#include <epan/epan_dissect.h>
+
+#ifdef HAVE_LIBPCAP
+#include <wiretap/wtap-capture.h>
+#include <wiretap/libpcap.h>
+#endif
+
+#ifdef _WIN32
+#include "capture-wpcap.h"
+#endif
+
+
+#include "lib_ethereal.h"
+
+/*error-reporting, stolen from dftest.c*/
+static void failure_message(const char *msg_format, va_list ap);
+static void open_failure_message(const char *filename, int err,
+    gboolean for_writing);
+static void read_failure_message(const char *filename, int err);
+
+/*
+ * This is the template for the decode as option; it is shared between the
+ * various functions that output the usage for this parameter.
+ */
+ 
+static int real_check(guchar *user, const struct wtap_pkthdr *phdr, long offset, union wtap_pseudo_header *pseudo_header, const guchar *buf, int rettype);
+static void fill_in_fdata2(frame_data *fdata, const struct wtap_pkthdr *phdr, long offset);
+typedef struct {
+  capture_file *cf;
+  wtap_dumper *pdh;
+} cb_args_t;
+
+//capture_file cfile;
+ts_type timestamp_type = TS_RELATIVE;
+#ifdef HAVE_LIBPCAP
+typedef struct {
+	int snaplen;			/* Maximum captured packet length */
+	int promisc_mode;		/* Capture in promiscuous mode */
+	int autostop_count;		/* Maximum packet count */
+	gboolean has_autostop_duration;	/* TRUE if maximum capture duration
+					   is specified */
+	gint32 autostop_duration;	/* Maximum capture duration */
+	gboolean has_autostop_filesize;	/* TRUE if maximum capture file size
+					   is specified */
+	gint32 autostop_filesize;	/* Maximum capture file size */
+	gboolean ringbuffer_on;		/* TRUE if ring buffer in use */
+	guint32 ringbuffer_num_files;	/* Number of ring buffer files */
+	gboolean has_ring_duration;	/* TRUE if ring duration specified */
+	gint32 ringbuffer_duration;     /* Switch file after n seconds */
+} capture_options;
+
+
+#ifdef SIGINFO
+static gboolean infodelay;	/* if TRUE, don't print capture info in SIGINFO handler */
+static gboolean infoprint;	/* if TRUE, print capture info after clearing infodelay */
+#endif /* SIGINFO */
+#endif /* HAVE_LIBPCAP */
+
+
+typedef struct _ethereal_tap_list {
+	struct _ethereal_tap_list *next;
+	char *cmd;
+	void (*func)(char *arg);
+} ethereal_tap_list;
+static ethereal_tap_list *tap_list=NULL;
+
+void
+register_ethereal_tap(char *cmd, void (*func)(char *arg))
+{
+	ethereal_tap_list *newtl;
+
+	newtl=malloc(sizeof(ethereal_tap_list));
+	newtl->next=tap_list;
+	tap_list=newtl;
+	newtl->cmd=cmd;
+	newtl->func=func;
+
+}
+
+
+static void
+clear_fdata(frame_data *fdata)
+{
+  if (fdata->pfd)
+    g_slist_free(fdata->pfd);
+}
+
+int ethereal_init(int link_type,int snaplen,struct ethereal_ses* session,char* filter)
+{
+  dfilter_t           *rfcode = NULL;
+  pcap_t *pch; 
+  printf("filter: %s\n",filter);
+  printf("Loading filter....\n");
+  if (!dfilter_compile(filter, &rfcode)) {
+    fprintf(stderr, "tethereal: %s\n", dfilter_error_msg);
+    return 1;
+  }
+  printf("Filter compiled\n");
+  session->link_type= wtap_pcap_encap_to_wtap_encap(link_type);
+  printf("Link Type: %d\n",session->link_type);
+  session->dfilter=(void*)rfcode;
+  init_dissection();
+  return 0;
+}
+
+static int real_check(guchar *user, const struct wtap_pkthdr *phdr, long offset, union wtap_pseudo_header *pseudo_header, const guchar *buf, int rettype)
+{
+  struct ethereal_ses* ses = (struct ethereal_ses*)user;
+  frame_data    fdata;
+  int           err;
+  void			*passed;
+  epan_dissect_t *edt;
+  char* retur;
+  dfilter_t * rfcode=(dfilter_t *)ses->dfilter;
+  fill_in_fdata2(&fdata, phdr, 0);
+  edt = epan_dissect_new(TRUE, FALSE);
+  epan_dissect_prime_dfilter(edt, rfcode);
+  epan_dissect_run(edt, pseudo_header, buf, &fdata, NULL);
+  //printf("er i real_check og rettype == %d\n",rettype);
+  if(rettype!=-1)
+  {
+  	passed = dfilter_apply_edt_ret(rfcode, edt,rettype);
+	if(rettype==2)
+	{
+	//	printf("skjebnetimen\n");
+	//	printf("Vi sitter fremdeles med %s, kjent som %u\n",passed,passed);
+		if(passed!=NULL)
+		{
+			retur = malloc(strlen(passed)+1);
+			strcpy(retur,passed);
+			passed = retur;
+		}
+	}
+  }
+  
+  else
+	  passed=dfilter_apply_edt(rfcode,edt);
+  epan_dissect_free(edt);
+  clear_fdata(&fdata);
+  //if(rettype==2)
+  //	printf("Vi satser at det ikke er over %s\n",passed);
+  return passed;
+}
+
+void* ethereal_rets_check(struct ethereal_ses* session, const struct pcap_pkthdr *phdr, const char *pd)
+{
+  struct wtap_pkthdr whdr;
+  union wtap_pseudo_header pseudo_header;
+
+  int err;
+  frame_data    fdata;
+  gboolean      passed;
+  epan_dissect_t *edt;
+  int teller;
+  void* res;
+  /* Convert from libpcap to Wiretap format.
+     If that fails, ignore the packet (wtap_process_pcap_packet has
+     written an error message). */
+  pd = wtap_process_pcap_packet(session->link_type, phdr, pd, &pseudo_header,
+				&whdr, &err);
+  if ((phdr == NULL)||(pd==NULL)) {
+    printf("Error...\n");
+    return 0;
+  }
+  //args.cf = session->dfilter;
+  res=(void*)real_check((guchar *)session, &whdr, 0, &pseudo_header, pd,2);
+  //if(res==1)
+  //fprintf(stderr,"packet passed\n");
+
+  //if(res!=NULL)
+  //    printf("Det er fremdeles ikke over %s\n",res);
+  return res;
+}
+
+
+int ethereal_reti_check(struct ethereal_ses* session, const struct pcap_pkthdr *phdr, const char *pd)
+{
+  struct wtap_pkthdr whdr;
+  union wtap_pseudo_header pseudo_header;
+
+  int err;
+  frame_data    fdata;
+  gboolean      passed;
+  epan_dissect_t *edt;
+  int teller;
+  int res;
+  /* Convert from libpcap to Wiretap format.
+     If that fails, ignore the packet (wtap_process_pcap_packet has
+     written an error message). */
+  pd = wtap_process_pcap_packet(session->link_type, phdr, pd, &pseudo_header,
+				&whdr, &err);
+  if ((phdr == NULL)||(pd==NULL)) {
+    printf("Error...\n");
+    return 0;
+  }
+  //args.cf = session->dfilter;                                  ,1
+  res=real_check((guchar *)session, &whdr, 0, &pseudo_header, pd,1);
+  //if(res==1)
+  //fprintf(stderr,"packet passed\n");
+  return res;
+}
+
+
+int ethereal_check(struct ethereal_ses* session, const struct pcap_pkthdr *phdr, const char *pd)
+{
+  struct wtap_pkthdr whdr;
+  union wtap_pseudo_header pseudo_header;
+
+  int err;
+  frame_data    fdata;
+  gboolean      passed;
+  epan_dissect_t *edt;
+  int teller;
+  int res;
+  /* Convert from libpcap to Wiretap format.
+     If that fails, ignore the packet (wtap_process_pcap_packet has
+     written an error message). */
+  pd = wtap_process_pcap_packet(session->link_type, phdr, pd, &pseudo_header,
+				&whdr, &err);
+  if ((phdr == NULL)||(pd==NULL)) {
+    printf("Error...\n");
+    return 0;
+  }
+  //args.cf = session->dfilter;
+  res=real_check((guchar *)session, &whdr, 0, &pseudo_header, pd,-1);
+  //if(res==1)
+  //fprintf(stderr,"packet passed\n");
+  return res;
+}
+
+static void
+fill_in_fdata2(frame_data *fdata, const struct wtap_pkthdr *phdr, long offset)
+{
+  fdata->next = NULL;
+  fdata->prev = NULL;
+  fdata->pfd = NULL;
+  fdata->num = 1;
+  fdata->pkt_len = phdr->len;
+  fdata->cum_bytes  = phdr->len;
+  fdata->cap_len = phdr->caplen;
+  fdata->file_off = offset;
+  fdata->lnk_t = phdr->pkt_encap;
+  fdata->abs_secs  = phdr->ts.tv_sec;
+  fdata->abs_usecs = phdr->ts.tv_usec;
+  fdata->flags.passed_dfilter = 0;
+  fdata->flags.encoding = CHAR_ASCII;
+  fdata->flags.visited = 0;
+  fdata->flags.marked = 0;
+  fdata->abs_secs  = phdr->ts.tv_sec;
+  fdata->abs_usecs = phdr->ts.tv_usec;
+}
+
+
+__attribute__ ((constructor))
+     void init ()
+{
+  printf("Ethereal driver initialising...\n");
+  epan_init("",register_all_protocols,register_all_protocol_handoffs,
+  			failure_message,open_failure_message,read_failure_message);
+  g_resolv_flags = RESOLV_NONE;
+  printf ("Ethereal driver loaded\n");
+}
+
+__attribute__ ((destructor))
+     void fini ()
+{
+  epan_cleanup();
+  printf ("Ethereal driver unloaded\n");
+}
+
+/*
+ * General errors are reported with an console message in "dftest".
+ */
+static void
+failure_message(const char *msg_format, va_list ap)
+{
+	fprintf(stderr, "dftest: ");
+	vfprintf(stderr, msg_format, ap);
+	fprintf(stderr, "\n");
+}
+
+/*
+ * Open/create errors are reported with an console message in "dftest".
+ */
+static void
+open_failure_message(const char *filename, int err, gboolean for_writing)
+{
+	fprintf(stderr, "dftest: ");
+	fprintf(stderr, file_open_error_message(err, for_writing), filename);
+	fprintf(stderr, "\n");
+}
+
+/*
+ * Read errors are reported with an console message in "dftest".
+ */
+static void
+read_failure_message(const char *filename, int err)
+{
+	fprintf(stderr, "dftest: An error occurred while reading from the file \"%s\": %s.\n",
+	    filename, strerror(err));
+}
diff -ruN ../ethereal-0.10.11/lib_ethereal.h ethereal/lib_ethereal.h
--- ../ethereal-0.10.11/lib_ethereal.h	1970-01-01 01:00:00.000000000 +0100
+++ ethereal/lib_ethereal.h	2005-07-07 11:19:41.000000000 +0200
@@ -0,0 +1,10 @@
+struct ethereal_ses
+{
+  int link_type;
+  void* dfilter;
+};
+
+int ethereal_init(int link_type,int snaplen,struct ethereal_ses* session,char*);
+int ethereal_check(struct ethereal_ses* session, const struct pcap_pkthdr *phdr, const char *pd);
+int ethereal_reti_check(struct ethereal_ses* session, const struct pcap_pkthdr *phdr, const char *pd);
+void* ethereal_rets_check(struct ethereal_ses* session, const struct pcap_pkthdr *phdr, const char *pd);
diff -ruN ../ethereal-0.10.11/wiretap/Makefile.am ethereal/wiretap/Makefile.am
--- ../ethereal-0.10.11/wiretap/Makefile.am	2005-05-02 23:28:53.000000000 +0200
+++ ethereal/wiretap/Makefile.am	2005-07-05 13:01:23.000000000 +0200
@@ -40,6 +40,8 @@
 	$(GENERATOR_SOURCES)	\
 	$(NONGENERATED_HEADER_FILES)
 
+libwiretap_la_LDFLAGS= -export-dynamic -module
+
 EXTRA_DIST = \
 	README.developer	\
 	config.h.win32		\
diff -ruN ../ethereal-0.10.11/wiretap/configure.in ethereal/wiretap/configure.in
--- ../ethereal-0.10.11/wiretap/configure.in	2005-05-02 23:28:53.000000000 +0200
+++ ethereal/wiretap/configure.in	2005-07-05 13:03:28.000000000 +0200
@@ -2,12 +2,14 @@
 #
 AC_INIT(wtap.c)
 
+AC_LIBTOOL_DLOPEN
+
 AC_PREREQ(2.52)
 
 AC_CANONICAL_HOST
 AC_CANONICAL_TARGET
 
-AM_INIT_AUTOMAKE(libwtap.a, 0.0.0)
+AM_INIT_AUTOMAKE(libwtap.la, 0.0.0)
 AM_CONFIG_HEADER(config.h)
 
 AM_DISABLE_STATIC