Mark an unused parameter as such
[metze/wireshark/wip.git] / epan / tvbuff_real.c
1 /* tvbuff_real.c
2  *
3  * $Id$
4  *
5  * Copyright (c) 2000 by Gilbert Ramirez <gram@alumni.rice.edu>
6  *
7  * Wireshark - Network traffic analyzer
8  * By Gerald Combs <gerald@wireshark.org>
9  * Copyright 1998 Gerald Combs
10  *
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.
15  *
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.
20  *
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.
24  */
25
26 #include "config.h"
27
28 #include <epan/emem.h>
29
30 #include "tvbuff.h"
31 #include "tvbuff-int.h"
32 #include "proto.h"      /* XXX - only used for DISSECTOR_ASSERT, probably a new header file? */
33
34 struct tvb_real {
35         struct tvbuff tvb;
36
37         /** Func to call when actually freed */
38         tvbuff_free_cb_t        free_cb;
39 };
40
41 static void
42 real_free(tvbuff_t *tvb)
43 {
44         struct tvb_real *real_tvb = (struct tvb_real *) tvb;
45
46         if (real_tvb->free_cb) {
47                 /*
48                  * XXX - do this with a union?
49                  */
50                 real_tvb->free_cb((gpointer)tvb->real_data);
51         }
52 }
53
54 static guint
55 real_offset(const tvbuff_t *tvb _U_, const guint counter)
56 {
57         return counter;
58 }
59
60 static const struct tvb_ops tvb_real_ops = {
61         sizeof(struct tvb_real), /* size */
62
63         real_free,            /* free */
64         real_offset,          /* offset */
65         NULL,                 /* get_ptr */
66         NULL,                 /* memcpy */
67         NULL,                 /* find_guint8 */
68         NULL,                 /* pbrk_guint8 */
69         NULL,                 /* clone */
70 };
71
72 tvbuff_t *
73 tvb_new_real_data(const guint8* data, const guint length, const gint reported_length)
74 {
75         tvbuff_t *tvb;
76         struct tvb_real *real_tvb;
77
78         THROW_ON(reported_length < -1, ReportedBoundsError);
79
80         tvb = tvb_new(&tvb_real_ops);
81
82         tvb->real_data       = data;
83         tvb->length          = length;
84         tvb->reported_length = reported_length;
85         tvb->initialized     = TRUE;
86
87         /*
88          * This is the top-level real tvbuff for this data source,
89          * so its data source tvbuff is itself.
90          */
91         tvb->ds_tvb = tvb;
92
93         real_tvb = (struct tvb_real *) tvb;
94         real_tvb->free_cb = NULL;
95
96         return tvb;
97 }
98
99 void
100 tvb_set_free_cb(tvbuff_t *tvb, const tvbuff_free_cb_t func)
101 {
102         struct tvb_real *real_tvb = (struct tvb_real *) tvb;
103
104         DISSECTOR_ASSERT(tvb);
105         DISSECTOR_ASSERT(tvb->ops == &tvb_real_ops);
106         real_tvb->free_cb = func;
107 }
108
109 void
110 tvb_set_child_real_data_tvbuff(tvbuff_t *parent, tvbuff_t *child)
111 {
112         DISSECTOR_ASSERT(parent && child);
113         DISSECTOR_ASSERT(parent->initialized);
114         DISSECTOR_ASSERT(child->initialized);
115         DISSECTOR_ASSERT(child->ops == &tvb_real_ops);
116         tvb_add_to_chain(parent, child);
117 }
118
119 tvbuff_t *
120 tvb_new_child_real_data(tvbuff_t *parent, const guint8* data, const guint length, const gint reported_length)
121 {
122         tvbuff_t *tvb = tvb_new_real_data(data, length, reported_length);
123
124         tvb_set_child_real_data_tvbuff(parent, tvb);
125
126         return tvb;
127 }