diff options
author | Gilbert Ramirez <gram@alumni.rice.edu> | 2001-03-02 17:04:25 +0000 |
---|---|---|
committer | Gilbert Ramirez <gram@alumni.rice.edu> | 2001-03-02 17:04:25 +0000 |
commit | b24dff17bd782b5258609a38e2251816e28fc127 (patch) | |
tree | fea93f055cb536de278a575601f4c2e69c282dd7 /epan/ftypes/ftypes.c | |
parent | c88e7b5a63395f6ba894bb79626f16e71038f1b0 (diff) |
Enable slices of [i-j], where i is start offset and j is end offset,
inclusive. That is, [0-1] is a slice of 2 bytes.
svn path=/trunk/; revision=3092
Diffstat (limited to 'epan/ftypes/ftypes.c')
-rw-r--r-- | epan/ftypes/ftypes.c | 68 |
1 files changed, 43 insertions, 25 deletions
diff --git a/epan/ftypes/ftypes.c b/epan/ftypes/ftypes.c index 3c1ea35b68..d39ba6e03d 100644 --- a/epan/ftypes/ftypes.c +++ b/epan/ftypes/ftypes.c @@ -1,5 +1,5 @@ /* - * $Id: ftypes.c,v 1.3 2001/02/27 19:23:30 gram Exp $ + * $Id: ftypes.c,v 1.4 2001/03/02 17:04:25 gram Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs <gerald@zing.org> @@ -285,60 +285,78 @@ slice_func(gpointer data, gpointer user_data) { drange_node *drnode = data; slice_data_t *slice_data = user_data; - gint offset; - gint length; + gint start_offset; + gint length = 0; + gint end_offset = 0; guint field_length; - guint end_offset; - gboolean to_end; fvalue_t *fv; + drange_node_end_t ending; if (slice_data->slice_failure) { return; } - offset = drange_node_get_offset(drnode); - length = drange_node_get_length(drnode); - to_end = drange_node_get_to_the_end(drnode); + start_offset = drange_node_get_start_offset(drnode); + ending = drange_node_get_ending(drnode); fv = slice_data->fv; field_length = fvalue_length(fv); -/* g_debug("field_length=%u offset=%d length=%d", - field_length, offset, length);*/ - - if (offset < 0) { - offset = field_length + offset; + /* Check for negative start */ + if (start_offset < 0) { + start_offset = field_length + start_offset; } - if (to_end) { + /* Check the end type, and set both end_offset and length */ + if (ending == TO_THE_END) { end_offset = field_length; - length = end_offset - offset; + length = end_offset - start_offset; } - else { + else if (ending == LENGTH) { + length = drange_node_get_length(drnode); if (length < 0) { end_offset = field_length + length; - if (end_offset >= offset) { - length = end_offset - offset; + if (end_offset > start_offset) { + length = end_offset - start_offset + 1; } else { - length = 0; + slice_data->slice_failure = TRUE; + return; } } else { - end_offset = offset + length; + end_offset = start_offset + length; } } + else if (ending == OFFSET) { + end_offset = drange_node_get_end_offset(drnode); + if (end_offset < 0) { + end_offset = field_length + end_offset; + if (end_offset > start_offset) { + length = end_offset - start_offset + 1; + } + else { + slice_data->slice_failure = TRUE; + return; + } + } + else { + length = end_offset - start_offset + 1; + } + } + else { + g_assert_not_reached(); + } +/* g_debug("(NEW) start_offset=%d length=%d end_offset=%d", + start_offset, length, end_offset); */ -/* g_debug("\t\t(NEW) offset=%d length=%d", - offset, length);*/ - - if (offset > field_length || end_offset > field_length) { + if (start_offset > field_length || end_offset > field_length) { slice_data->slice_failure = TRUE; return; } - fv->ftype->slice(fv, slice_data->bytes, offset, length); + fv->ftype->slice(fv, slice_data->bytes, start_offset, length); } |