Move the code to build the balanced tree of fields into "proto_init()",
authorguy <guy@f5534014-38df-0310-8fa8-9805f1628bb7>
Mon, 29 Apr 2002 07:55:32 +0000 (07:55 +0000)
committerguy <guy@f5534014-38df-0310-8fa8-9805f1628bb7>
Mon, 29 Apr 2002 07:55:32 +0000 (07:55 +0000)
move the code from "dfilter_lookup_token()" into
"proto_registrar_get_byname()", and get rid of "dfilter_lookup_token()"
and have its callers call "proto_registrar_get_byname()" instead.

git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@5287 f5534014-38df-0310-8fa8-9805f1628bb7

epan/dfilter/dfilter-int.h
epan/dfilter/dfilter.c
epan/dfilter/scanner.l
epan/proto.c
epan/proto.h

index 1bd2f04754364c427097ad4441b65fd77f5dfcd0..4397e001c184c11990fc24dcc67afbfe5eaf6a4f 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: dfilter-int.h,v 1.5 2002/01/21 07:37:37 guy Exp $
+ * $Id: dfilter-int.h,v 1.6 2002/04/29 07:55:32 guy Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@ethereal.com>
@@ -57,11 +57,6 @@ void Dfilter(void*, int, stnode_t*, dfwork_t*);
 /* Scanner's lval */
 extern stnode_t *df_lval;
 
-/* Given a field abbreviation, returns the proto ID, or -1 if
- * it doesn't exist. */
-header_field_info*
-dfilter_lookup_token(char *abbrev);
-
 /* Set dfilter_error_msg_buf and dfilter_error_msg */
 void
 dfilter_fail(char *format, ...);
index d0afc3eaedfdd536a13b795a3dd128ab6e13bc80..19af1c3179eb79ed8d5d19ef584cdb1a40c67272 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: dfilter.c,v 1.8 2002/04/08 20:11:31 gram Exp $
+ * $Id: dfilter.c,v 1.9 2002/04/29 07:55:32 guy Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@ethereal.com>
 #include "dfvm.h"
 #include <epan/epan_dissect.h>
 
-
-/* Balanced tree of abbreviations and IDs */
-static GTree *dfilter_tokens = NULL;
-
 #define DFILTER_TOKEN_ID_OFFSET        1
 
-/* Comparision function for tree insertion. A wrapper around strcmp() */
-static int g_strcmp(gconstpointer a, gconstpointer b);
-
 /* Global error message space for dfilter_compile errors */
 static gchar dfilter_error_msg_buf[1024];
 gchar *dfilter_error_msg;      /* NULL when no error resulted */
@@ -85,68 +78,6 @@ dfilter_fail(char *format, ...)
 void
 dfilter_init(void)
 {
-       int                     id, num_symbols;
-       char                    *abbrev;
-       header_field_info       *hfinfo, *same_name_hfinfo, *same_name_next_hfinfo;
-
-       num_symbols = proto_registrar_n();
-
-       if (dfilter_tokens) {
-               /* XXX - needed? */
-               g_message("I expected hf_ids to be NULL\n");
-               g_tree_destroy(dfilter_tokens);
-
-               /* Make sure the hfinfo->same_name links are broken */
-               for (id = 0; id < num_symbols; id++) {
-                       hfinfo = proto_registrar_get_nth(id);
-                       hfinfo->same_name_next = NULL;
-                       hfinfo->same_name_prev = NULL;
-               }
-       }
-       dfilter_tokens = g_tree_new(g_strcmp);
-
-       /* Populate the abbrev/ID GTree (header-field symbol table) */
-
-       
-       for (id = 0; id < num_symbols; id++) {
-               if (id == hf_text_only) {
-                       continue;
-               }
-               abbrev = proto_registrar_get_abbrev(id);
-               hfinfo = proto_registrar_get_nth(id);
-
-               g_assert(abbrev);               /* Not Null */
-               g_assert(abbrev[0] != 0);       /* Not empty string */
-
-               /* We allow multiple hfinfo's to be registered under the same
-                * abbreviation. This was done for X.25, as, depending
-                * on whether it's modulo-8 or modulo-128 operation,
-                * some bitfield fields may be in different bits of
-                * a byte, and we want to be able to refer to that field
-                * with one name regardless of whether the packets
-                * are modulo-8 or modulo-128 packets. */
-               same_name_hfinfo = g_tree_lookup(dfilter_tokens, abbrev);
-               if (same_name_hfinfo) {
-                       /* There's already a field with this name.
-                        * Put it after that field in the list of
-                        * fields with this name, then allow the code
-                        * after this if{} block to replace the old
-                        * hfinfo with the new hfinfo in the GTree. Thus,
-                        * we end up with a linked-list of same-named hfinfo's,
-                        * with the root of the list being the hfinfo in the GTree */
-                       same_name_next_hfinfo =
-                           same_name_hfinfo->same_name_next;
-
-                       hfinfo->same_name_next = same_name_next_hfinfo;
-                       if (same_name_next_hfinfo)
-                               same_name_next_hfinfo->same_name_prev = hfinfo;
-
-                       same_name_hfinfo->same_name_next = hfinfo;
-                       hfinfo->same_name_prev = same_name_hfinfo;
-               }
-               g_tree_insert(dfilter_tokens, abbrev, hfinfo);
-       }
-
        if (ParserObj) {
                g_message("I expected ParserObj to be NULL\n");
                /* Free the Lemon Parser object */
@@ -163,12 +94,6 @@ dfilter_init(void)
 void
 dfilter_cleanup(void)
 {
-       /* Free the abbrev/ID GTree */
-       if (dfilter_tokens) {
-               g_tree_destroy(dfilter_tokens);
-               dfilter_tokens = NULL;
-       }
-
        /* Free the Lemon Parser object */
        if (ParserObj) {
                DfilterFree(ParserObj, g_free);
@@ -178,24 +103,6 @@ dfilter_cleanup(void)
        sttype_cleanup();
 }
 
-
-
-/* Lookup an abbreviation in our token tree, returing the ID #
- * If the abbreviation doesn't exit, returns -1 */
-header_field_info*
-dfilter_lookup_token(char *abbrev)
-{
-       g_assert(abbrev != NULL);
-       return g_tree_lookup(dfilter_tokens, abbrev);
-}
-
-/* String comparison func for dfilter_token GTree */
-static int
-g_strcmp(gconstpointer a, gconstpointer b)
-{
-       return strcmp((const char*)a, (const char*)b);
-}
-
 static dfilter_t*
 dfilter_new(void)
 {
index e508e691a3ad5c8dee8805a689b71ee2f93e7f9c..c65c12dcc9fd7674e87c146721158573015c4884 100644 (file)
@@ -1,11 +1,10 @@
 %{
 /*
- * $Id: scanner.l,v 1.6 2002/04/11 03:26:26 gram Exp $
+ * $Id: scanner.l,v 1.7 2002/04/29 07:55:32 guy Exp $
  *
  * Ethereal - Network traffic analyzer
- * By Gerald Combs <gerald@zing.org>
+ * By Gerald Combs <gerald@ethereal.com>
  * Copyright 2001 Gerald Combs
- *
  * 
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -131,7 +130,7 @@ static gboolean str_to_guint32(char *s, guint32* pint);
        /* Is it a field name? */
        header_field_info *hfinfo;
 
-       hfinfo = dfilter_lookup_token(yytext);
+       hfinfo = proto_registrar_get_byname(yytext);
        if (hfinfo) {
                /* Yes, it's a field name */
                return set_lval(TOKEN_FIELD, hfinfo);
index 35760079461d7e2ee3c8bbdd95ec8fac885d075b..131e74d0b7f27bd3b6426dc767bd2db2fc4fde73 100644 (file)
@@ -1,7 +1,7 @@
 /* proto.c
  * Routines for protocol tree
  *
- * $Id: proto.c,v 1.66 2002/04/28 23:39:58 guy Exp $
+ * $Id: proto.c,v 1.67 2002/04/29 07:55:31 guy Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@ethereal.com>
@@ -120,6 +120,9 @@ proto_tree_set_int(field_info *fi, gint32 value);
 
 static int proto_register_field_init(header_field_info *hfinfo, int parent);
 
+/* Comparision function for tree insertion. A wrapper around strcmp() */
+static int g_strcmp(gconstpointer a, gconstpointer b);
+
 /* special-case header field used within proto.c */
 int hf_text_only = 1;
 
@@ -161,6 +164,9 @@ static GMemChunk *gmc_item_labels = NULL;
 /* List which stores protocols and fields that have been registered */
 static GPtrArray *gpa_hfinfo = NULL;
 
+/* Balanced tree of abbreviations and IDs */
+static GTree *gpa_name_tree = NULL;
+
 /* Points to the first element of an array of Booleans, indexed by
    a subtree item type; that array element is TRUE if subtrees of
    an item of that type are to be expanded. */
@@ -174,6 +180,9 @@ void
 proto_init(const char *plugin_dir,void (register_all_protocols)(void),
           void (register_all_protocol_handoffs)(void))
 {
+       int                     id, num_symbols;
+       char                    *abbrev;
+       header_field_info       *hfinfo, *same_name_hfinfo, *same_name_next_hfinfo;
        static hf_register_info hf[] = {
                { &hf_text_only,
                { "",   "", FT_NONE, BASE_NONE, NULL, 0x0,
@@ -246,15 +255,85 @@ proto_init(const char *plugin_dir,void (register_all_protocols)(void),
           are merely strings on the GUI tree; they are not filterable */
        proto_register_field_array(-1, hf, array_length(hf));
 
+       num_symbols = proto_registrar_n();
+
+       if (gpa_name_tree) {
+               /* XXX - needed? */
+               g_message("I expected gpa_name_tree to be NULL\n");
+               g_tree_destroy(gpa_name_tree);
+
+               /* Make sure the hfinfo->same_name links are broken */
+               for (id = 0; id < num_symbols; id++) {
+                       hfinfo = proto_registrar_get_nth(id);
+                       hfinfo->same_name_next = NULL;
+                       hfinfo->same_name_prev = NULL;
+               }
+       }
+       gpa_name_tree = g_tree_new(g_strcmp);
+
+       /* Populate the abbrev/ID GTree (header-field symbol table) */
+
+       for (id = 0; id < num_symbols; id++) {
+               if (id == hf_text_only) {
+                       continue;
+               }
+               abbrev = proto_registrar_get_abbrev(id);
+               hfinfo = proto_registrar_get_nth(id);
+
+               g_assert(abbrev);               /* Not Null */
+               g_assert(abbrev[0] != 0);       /* Not empty string */
+
+               /* We allow multiple hfinfo's to be registered under the same
+                * abbreviation. This was done for X.25, as, depending
+                * on whether it's modulo-8 or modulo-128 operation,
+                * some bitfield fields may be in different bits of
+                * a byte, and we want to be able to refer to that field
+                * with one name regardless of whether the packets
+                * are modulo-8 or modulo-128 packets. */
+               same_name_hfinfo = g_tree_lookup(gpa_name_tree, abbrev);
+               if (same_name_hfinfo) {
+                       /* There's already a field with this name.
+                        * Put it after that field in the list of
+                        * fields with this name, then allow the code
+                        * after this if{} block to replace the old
+                        * hfinfo with the new hfinfo in the GTree. Thus,
+                        * we end up with a linked-list of same-named hfinfo's,
+                        * with the root of the list being the hfinfo in the GTree */
+                       same_name_next_hfinfo =
+                           same_name_hfinfo->same_name_next;
+
+                       hfinfo->same_name_next = same_name_next_hfinfo;
+                       if (same_name_next_hfinfo)
+                               same_name_next_hfinfo->same_name_prev = hfinfo;
+
+                       same_name_hfinfo->same_name_next = hfinfo;
+                       hfinfo->same_name_prev = same_name_hfinfo;
+               }
+               g_tree_insert(gpa_name_tree, abbrev, hfinfo);
+       }
+
        /* We've assigned all the subtree type values; allocate the array
           for them, and zero it out. */
        tree_is_expanded = g_malloc(num_tree_types*sizeof (gint *));
        memset(tree_is_expanded, '\0', num_tree_types*sizeof (gint *));
 }
 
+/* String comparison func for dfilter_token GTree */
+static int
+g_strcmp(gconstpointer a, gconstpointer b)
+{
+       return strcmp((const char*)a, (const char*)b);
+}
+
 void
 proto_cleanup(void)
 {
+       /* Free the abbrev/ID GTree */
+       if (gpa_name_tree) {
+               g_tree_destroy(gpa_name_tree);
+               gpa_name_tree = NULL;
+       }
+
        if (gmc_hfinfo)
                g_mem_chunk_destroy(gmc_hfinfo);
        if (gmc_field_info)
@@ -364,29 +443,12 @@ proto_registrar_get_nth(int hfindex)
 }
 
 /* Finds a record in the hf_info_records array by name.
- * XXX - the display filter code maintains a balanced tree
- * of filter names and hfinfo pointers; should that be moved
- * up into here, so the display filter code could just use
- * this routine?
  */
 header_field_info*
-proto_registrar_get_byname(const char *field_name)
+proto_registrar_get_byname(char *field_name)
 {
-       header_field_info       *hfinfo;
-       int                     i, len;
-
-       len = gpa_hfinfo->len;
-
-       for (i = 0; i < len ; i++) {
-               hfinfo = proto_registrar_get_nth(i);
-
-               if (strcmp(hfinfo->abbrev, field_name) == 0) {
-                       /* Found it. */
-                       return hfinfo;
-               }
-       }
-       /* Not found. */
-       return NULL;
+       g_assert(field_name != NULL);
+       return g_tree_lookup(gpa_name_tree, field_name);
 }
 
 /* Add a text-only node, leaving it to our caller to fill the text in */
index f18019ed78f43a41855cc98344e760ee82a0e1e0..84469890df061a4464e9a0463e8729d1cef7e739 100644 (file)
@@ -1,7 +1,7 @@
 /* proto.h
  * Definitions for protocol display
  *
- * $Id: proto.h,v 1.30 2002/04/18 20:19:10 guy Exp $
+ * $Id: proto.h,v 1.31 2002/04/29 07:55:31 guy Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@ethereal.com>
@@ -499,7 +499,7 @@ extern char* proto_registrar_get_abbrev(int n);
 extern header_field_info* proto_registrar_get_nth(int hfindex);
 
 /* get the header field information based upon a field name */
-extern header_field_info* proto_registrar_get_byname(const char *field_name);
+extern header_field_info* proto_registrar_get_byname(char *field_name);
 
 /* Returns enum ftenum for item # n */
 extern int proto_registrar_get_ftype(int n);