2 * Routines for providing general range support to the dfilter library
4 * $Id: drange.c,v 1.3 2002/03/02 20:48:11 guy Exp $
6 * Copyright (c) 2000 by Ed Warnicke <hagbard@physics.rutgers.edu>
8 * Ethereal - Network traffic analyzer
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
28 /* drange_node constructor */
32 drange_node* new_range_node;
34 new_range_node = g_malloc(sizeof(drange_node));
35 new_range_node->start_offset = 0;
36 new_range_node->length = 0;
37 new_range_node->end_offset = 0;
38 new_range_node->ending = UNINITIALIZED;
39 return new_range_node;
42 /* drange_node destructor */
44 drange_node_free(drange_node* drnode)
49 /* drange_node accessors */
51 drange_node_get_start_offset(drange_node* drnode)
53 g_assert(drnode->ending != UNINITIALIZED);
54 return drnode->start_offset;
58 drange_node_get_length(drange_node* drnode)
60 g_assert(drnode->ending == LENGTH);
61 return drnode->length;
65 drange_node_get_end_offset(drange_node* drnode)
67 g_assert(drnode->ending == OFFSET);
68 return drnode->end_offset;
72 drange_node_get_ending(drange_node* drnode)
74 g_assert(drnode->ending != UNINITIALIZED);
75 return drnode->ending;
78 /* drange_node mutators */
80 drange_node_set_start_offset(drange_node* drnode, gint offset)
82 drnode->start_offset = offset;
86 drange_node_set_length(drange_node* drnode, gint length)
88 drnode->length = length;
89 drnode->ending = LENGTH;
93 drange_node_set_end_offset(drange_node* drnode, gint offset)
95 drnode->end_offset = offset;
96 drnode->ending = OFFSET;
101 drange_node_set_to_the_end(drange_node* drnode)
103 drnode->ending = TO_THE_END;
106 /* drange constructor */
111 new_drange = g_malloc(sizeof(drange));
112 new_drange->range_list = NULL;
113 new_drange->has_total_length = TRUE;
114 new_drange->total_length = 0;
115 new_drange->min_start_offset = G_MAXINT;
116 new_drange->max_start_offset = G_MININT;
121 drange_append_wrapper(gpointer data, gpointer user_data)
123 drange_node *drnode = data;
124 drange *dr = user_data;
126 drange_append_drange_node(dr, drnode);
130 drange_new_from_list(GSList *list)
134 new_drange = drange_new();
135 g_slist_foreach(list, drange_append_wrapper, new_drange);
141 drange_node_free_wrapper(gpointer data, gpointer userdata _U_)
146 /* drange destructor */
148 drange_free(drange* dr)
150 drange_node_free_list(dr->range_list);
154 /* Call drange_node destructor on all list items */
156 drange_node_free_list(GSList* list)
158 g_slist_foreach(list, drange_node_free_wrapper, NULL);
161 /* drange accessors */
162 gboolean drange_has_total_length(drange* dr){ return dr->has_total_length; }
163 gint drange_get_total_length(drange* dr) { return dr->total_length; }
164 gint drange_get_min_start_offset(drange* dr) { return dr->min_start_offset; }
165 gint drange_get_max_start_offset(drange* dr) { return dr->max_start_offset; }
168 update_drange_with_node(drange *dr, drange_node *drnode)
170 if(drnode->ending == TO_THE_END){
171 dr->has_total_length = FALSE;
173 else if(dr->has_total_length){
174 dr->total_length += drnode->length;
176 if(drnode->start_offset < dr->min_start_offset){
177 dr->min_start_offset = drnode->start_offset;
179 if(drnode->start_offset > dr->max_start_offset){
180 dr->max_start_offset = drnode->start_offset;
184 /* drange mutators */
186 drange_prepend_drange_node(drange* dr, drange_node* drnode)
189 dr->range_list = g_slist_prepend(dr->range_list,drnode);
190 update_drange_with_node(dr, drnode);
195 drange_append_drange_node(drange* dr, drange_node* drnode)
198 dr->range_list = g_slist_append(dr->range_list,drnode);
199 update_drange_with_node(dr, drnode);
204 drange_foreach_drange_node(drange* dr, GFunc func, gpointer funcdata)
206 g_slist_foreach(dr->range_list,func,funcdata);