FIXUP: WIP: verification_trailer
[wireshark-wip.git] / epan / dfilter / drange.c
blobd33dfc5e611d1d9950032d98cb5736a551e0652b
1 /* drange.c
2 * Routines for providing general range support to the dfilter library
4 * $Id$
6 * Copyright (c) 2000 by Ed Warnicke <hagbard@physics.rutgers.edu>
8 * Wireshark - Network traffic analyzer
9 * By Gerald Combs
10 * Copyright 1999 Gerald Combs
11 * This program is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU General Public License
13 * as published by the Free Software Foundation; either version 2
14 * of the License, or (at your option) any later version.
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
26 #include "config.h"
28 #include "drange.h"
30 /* drange_node constructor */
31 drange_node*
32 drange_node_new(void)
34 drange_node* new_range_node;
36 new_range_node = g_new(drange_node,1);
37 new_range_node->start_offset = 0;
38 new_range_node->length = 0;
39 new_range_node->end_offset = 0;
40 new_range_node->ending = DRANGE_NODE_END_T_UNINITIALIZED;
41 return new_range_node;
44 static drange_node*
45 drange_node_dup(drange_node *org)
47 drange_node *new_range_node;
49 if (!org)
50 return NULL;
52 new_range_node = g_new(drange_node,1);
53 new_range_node->start_offset = org->start_offset;
54 new_range_node->length = org->length;
55 new_range_node->end_offset = org->end_offset;
56 new_range_node->ending = org->ending;
57 return new_range_node;
60 /* drange_node destructor */
61 void
62 drange_node_free(drange_node* drnode)
64 g_free(drnode);
67 /* drange_node accessors */
68 gint
69 drange_node_get_start_offset(drange_node* drnode)
71 g_assert(drnode->ending != DRANGE_NODE_END_T_UNINITIALIZED);
72 return drnode->start_offset;
75 gint
76 drange_node_get_length(drange_node* drnode)
78 g_assert(drnode->ending == DRANGE_NODE_END_T_LENGTH);
79 return drnode->length;
82 gint
83 drange_node_get_end_offset(drange_node* drnode)
85 g_assert(drnode->ending == DRANGE_NODE_END_T_OFFSET);
86 return drnode->end_offset;
89 drange_node_end_t
90 drange_node_get_ending(drange_node* drnode)
92 g_assert(drnode->ending != DRANGE_NODE_END_T_UNINITIALIZED);
93 return drnode->ending;
96 /* drange_node mutators */
97 void
98 drange_node_set_start_offset(drange_node* drnode, gint offset)
100 drnode->start_offset = offset;
103 void
104 drange_node_set_length(drange_node* drnode, gint length)
106 drnode->length = length;
107 drnode->ending = DRANGE_NODE_END_T_LENGTH;
110 void
111 drange_node_set_end_offset(drange_node* drnode, gint offset)
113 drnode->end_offset = offset;
114 drnode->ending = DRANGE_NODE_END_T_OFFSET;
118 void
119 drange_node_set_to_the_end(drange_node* drnode)
121 drnode->ending = DRANGE_NODE_END_T_TO_THE_END;
124 /* drange constructor */
125 drange_t *
126 drange_new(void)
128 drange_t * new_drange;
129 new_drange = g_new(drange_t,1);
130 new_drange->range_list = NULL;
131 new_drange->has_total_length = TRUE;
132 new_drange->total_length = 0;
133 new_drange->min_start_offset = G_MAXINT;
134 new_drange->max_start_offset = G_MININT;
135 return new_drange;
138 static void
139 drange_append_wrapper(gpointer data, gpointer user_data)
141 drange_node *drnode = (drange_node *)data;
142 drange_t *dr = (drange_t *)user_data;
144 drange_append_drange_node(dr, drnode);
147 drange_t *
148 drange_new_from_list(GSList *list)
150 drange_t *new_drange;
152 new_drange = drange_new();
153 g_slist_foreach(list, drange_append_wrapper, new_drange);
154 return new_drange;
157 drange_t *
158 drange_dup(drange_t *org)
160 drange_t *new_drange;
161 GSList *p;
163 if (!org)
164 return NULL;
166 new_drange = drange_new();
167 for (p = org->range_list; p; p = p->next) {
168 drange_node *drnode = (drange_node *)p->data;
169 drange_append_drange_node(new_drange, drange_node_dup(drnode));
171 return new_drange;
175 static void
176 drange_node_free_wrapper(gpointer data, gpointer userdata _U_)
178 g_free(data);
181 /* drange destructor */
182 void
183 drange_free(drange_t * dr)
185 drange_node_free_list(dr->range_list);
186 g_free(dr);
189 /* Call drange_node destructor on all list items */
190 void
191 drange_node_free_list(GSList* list)
193 g_slist_foreach(list, drange_node_free_wrapper, NULL);
196 /* drange accessors */
197 gboolean drange_has_total_length(drange_t * dr){ return dr->has_total_length; }
198 gint drange_get_total_length(drange_t * dr) { return dr->total_length; }
199 gint drange_get_min_start_offset(drange_t * dr) { return dr->min_start_offset; }
200 gint drange_get_max_start_offset(drange_t * dr) { return dr->max_start_offset; }
202 static void
203 update_drange_with_node(drange_t *dr, drange_node *drnode)
205 if(drnode->ending == DRANGE_NODE_END_T_TO_THE_END){
206 dr->has_total_length = FALSE;
208 else if(dr->has_total_length){
209 dr->total_length += drnode->length;
211 if(drnode->start_offset < dr->min_start_offset){
212 dr->min_start_offset = drnode->start_offset;
214 if(drnode->start_offset > dr->max_start_offset){
215 dr->max_start_offset = drnode->start_offset;
219 /* drange mutators */
220 void
221 drange_prepend_drange_node(drange_t * dr, drange_node* drnode)
223 if(drnode != NULL){
224 dr->range_list = g_slist_prepend(dr->range_list,drnode);
225 update_drange_with_node(dr, drnode);
229 void
230 drange_append_drange_node(drange_t * dr, drange_node* drnode)
232 if(drnode != NULL){
233 dr->range_list = g_slist_append(dr->range_list,drnode);
234 update_drange_with_node(dr, drnode);
238 void
239 drange_foreach_drange_node(drange_t * dr, GFunc func, gpointer funcdata)
241 g_slist_foreach(dr->range_list,func,funcdata);