1195223eb1a2700b27251460fddea33c416be25c
[obnox/wireshark/wip.git] / epan / dfilter / sttype-range.c
1 /*
2  * $Id: sttype-range.c,v 1.3 2001/02/27 19:23:28 gram Exp $
3  *
4  * Ethereal - Network traffic analyzer
5  * By Gerald Combs <gerald@zing.org>
6  * Copyright 2001 Gerald Combs
7  *
8  * 
9  * This program is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU General Public License
11  * as published by the Free Software Foundation; either version 2
12  * of the License, or (at your option) any later version.
13  * 
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  * 
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22  */
23
24 /* The ideas in this code came from Ed Warnicke's original implementation
25  * of dranges for the old display filter code (Ethereal 0.8.15 and before).
26  * The code is different, but definitely inspired by his code.
27  */
28
29 #ifdef HAVE_CONFIG_H
30 #include "config.h"
31 #endif
32
33 #include <glib.h>
34
35 #include "proto.h"
36 #include "drange.h"
37 #include "sttype-range.h"
38
39 typedef struct {
40         guint32                 magic;
41         header_field_info       *hfinfo;
42         drange                  *drange;
43 } range_t;
44
45 #define RANGE_MAGIC     0xec0990ce
46
47 static gpointer
48 range_new(gpointer junk)
49 {
50         range_t         *range;
51
52         g_assert(junk == NULL);
53
54         range = g_new(range_t, 1);
55
56         range->magic = RANGE_MAGIC;
57         range->hfinfo = NULL;
58         range->drange = NULL;
59
60         return (gpointer) range;
61 }
62
63 static void
64 range_free(gpointer value)
65 {
66         range_t *range = value;
67         assert_magic(range, RANGE_MAGIC);
68
69         if (range->drange)
70                 drange_free(range->drange);
71
72         g_free(range);
73 }
74
75 void
76 sttype_range_remove_drange(stnode_t *node)
77 {
78         range_t         *range;
79
80         range = stnode_data(node);
81         assert_magic(range, RANGE_MAGIC);
82
83         range->drange = NULL;
84 }
85
86
87 /* Set a range */
88 void
89 sttype_range_set(stnode_t *node, stnode_t *field, GSList* drange_list)
90 {
91         range_t         *range;
92
93         range = stnode_data(node);
94         assert_magic(range, RANGE_MAGIC);
95
96         range->hfinfo = stnode_data(field);
97         stnode_free(field);
98
99         range->drange = drange_new_from_list(drange_list);
100 }
101
102 void
103 sttype_range_set1(stnode_t *node, stnode_t *field, drange_node *rn)
104 {
105         sttype_range_set(node, field, g_slist_append(NULL, rn));
106 }
107
108 STTYPE_ACCESSOR(header_field_info*, range, hfinfo, RANGE_MAGIC)
109 STTYPE_ACCESSOR(drange*, range, drange, RANGE_MAGIC)
110
111
112 void
113 sttype_register_range(void)
114 {
115         static sttype_t range_type = {
116                 STTYPE_RANGE,
117                 "RANGE",
118                 range_new,
119                 range_free,
120         };
121
122         sttype_register(&range_type);
123 }