Rename a couple of to_str functions to have ep_ in the name. This makes it
[metze/wireshark/wip.git] / epan / tvbuff.h
1 /* tvbuff.h
2  *
3  * Testy, Virtual(-izable) Buffer of guint8*'s
4  *
5  * "Testy" -- the buffer gets mad when an attempt is made to access data
6  *      beyond the bounds of the buffer. An exception is thrown.
7  *
8  * "Virtual" -- the buffer can have its own data, can use a subset of
9  *      the data of a backing tvbuff, or can be a composite of
10  *      other tvbuffs.
11  *
12  * $Id$
13  *
14  * Copyright (c) 2000 by Gilbert Ramirez <gram@alumni.rice.edu>
15  *
16  * Wireshark - Network traffic analyzer
17  * By Gerald Combs <gerald@wireshark.org>
18  * Copyright 1998 Gerald Combs
19  *
20  * This program is free software; you can redistribute it and/or
21  * modify it under the terms of the GNU General Public License
22  * as published by the Free Software Foundation; either version 2
23  * of the License, or (at your option) any later version.
24  *
25  * This program is distributed in the hope that it will be useful,
26  * but WITHOUT ANY WARRANTY; without even the implied warranty of
27  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
28  * GNU General Public License for more details.
29  *
30  * You should have received a copy of the GNU General Public License
31  * along with this program; if not, write to the Free Software
32  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
33  */
34
35 #ifndef __TVBUFF_H__
36 #define __TVBUFF_H__
37
38 #include <glib.h>
39 #include <epan/guid-utils.h>
40 #include <epan/wmem/wmem.h>
41
42 #ifdef __cplusplus
43 extern "C" {
44 #endif /* __cplusplus */
45
46 /** @file
47  * "testy, virtual(-izable) buffer".  They are testy in that they get mad when
48  * an attempt is made to access data beyond the bounds of their array. In that
49  * case, they throw an exception.
50  *
51  * They are virtualizable in that new tvbuff's can be made from other tvbuffs,
52  * while only the original tvbuff may have data. That is, the new tvbuff has
53  * virtual data.
54  */
55
56 struct tvbuff;
57 typedef struct tvbuff tvbuff_t;
58
59 struct e_in6_addr; /* ipv6-utils.h */
60
61 /** @defgroup tvbuff Testy, Virtual(-izable) Buffers
62  *
63  * Dissector use and management
64  *
65  *  Consider a collection of tvbs as being a chain or stack of tvbs.
66  *
67  *  When dissecting a frame:
68  *   The top-level dissector (packet.c) pushes the initial tvb (containing
69  *   the complete frame) onto the stack (starts the chain) and then calls
70  *   a sub-dissector which in turn calls the next sub-dissector and so on.
71  *   Each sub-dissector may chain additional tvbs (see below) to the tvb
72  *   handed to that dissector. After dissection is complete and control has
73  *   returned to the top-level dissector, the chain of tvbs (stack) is free'd
74  *   via a call to tvb_free_chain() (in epan_dissect_cleanup()).
75  *
76  * A dissector:
77  *  - Can chain new tvbs (subset, real, composite) to the
78  *    tvb handed to the dissector using tvb_new_subset(),
79  *    tvb_new_subset_length(), tvb_new_subset_remaining(),
80  *    tvb_new_child_real_data(), tvb_set_child_real_data_tvbuff(),
81  *    tvb_composite_finalize(), and tvb_child_uncompress(). (Composite
82  *    tvbs should reference only tvbs which are already part of the chain).
83  *  - Must not save for later use (e.g., when dissecting another frame) a
84  *    pointer to a tvb handed to the dissector; (A higher level function
85  *    may very well free the chain thus leaving a dangling pointer).
86  *    This (obviously) also applies to any tvbs chained to the tvb handed
87  *    to the dissector.
88  *  - Can create its own tvb chain (using tvb_new_real_data() which the
89  *
90  *    dissector is free to manage as desired.
91  * @{
92  */
93
94 /** TVBUFF_REAL_DATA contains a guint8* that points to real data.
95  * The data is allocated and contiguous.
96  *
97  * TVBUFF_SUBSET has a backing tvbuff. The TVBUFF_SUBSET is a "window"
98  * through which the program sees only a portion of the backing tvbuff.
99  *
100  * TVBUFF_COMPOSITE combines multiple tvbuffs sequentially to produce
101  * a larger byte array.
102  *
103  * tvbuff's of any type can be used as the backing-tvbuff of a
104  * TVBUFF_SUBSET or as the member of a TVBUFF_COMPOSITE.
105  * TVBUFF_COMPOSITEs can have member-tvbuffs of different types.
106  *
107  * Once a tvbuff is create/initialized/finalized, the tvbuff is read-only.
108  * That is, it cannot point to any other data. A new tvbuff must be created if
109  * you want a tvbuff that points to other data.
110  *
111  * tvbuff's are normally chained together to allow efficient de-allocation of
112  * tvbuff's.
113  */
114
115 typedef void (*tvbuff_free_cb_t)(void*);
116
117 /** Extracts 'number of bits' starting at 'bit offset'.
118  * Returns a pointer to a newly initialized g_malloc'd REAL_DATA
119  * tvbuff with the bits octet aligned.
120  */
121 WS_DLL_PUBLIC tvbuff_t *tvb_new_octet_aligned(tvbuff_t *tvb,
122     guint32 bit_offset, gint32 no_of_bits);
123
124 WS_DLL_PUBLIC tvbuff_t *tvb_new_chain(tvbuff_t *parent, tvbuff_t *backing);
125
126 WS_DLL_PUBLIC tvbuff_t *tvb_clone(tvbuff_t *tvb);
127
128 WS_DLL_PUBLIC tvbuff_t *tvb_clone_offset_len(tvbuff_t *tvb, guint offset,
129     guint len);
130
131 /** Free a tvbuff_t and all tvbuffs chained from it
132  * The tvbuff must be 'the 'head' (initial) tvb of a chain or
133  * must not be in a chain.
134  * If specified, a callback to free the tvbuff data will be invoked
135  * for each tvbuff free'd */
136 WS_DLL_PUBLIC void tvb_free(tvbuff_t *tvb);
137
138 /** Free the tvbuff_t and all tvbuffs chained from it.
139  * The tvbuff must be 'the 'head' (initial) tvb of a chain or
140  * must not be in a chain.
141  * If specified, a callback to free the tvbuff data will be invoked
142  * for each tvbuff free'd */
143 WS_DLL_PUBLIC void tvb_free_chain(tvbuff_t *tvb);
144
145 /** Set a callback function to call when a tvbuff is actually freed
146  * One argument is passed to that callback --- a void* that points
147  * to the real data. Obviously, this only applies to a
148  * TVBUFF_REAL_DATA tvbuff. */
149 WS_DLL_PUBLIC void tvb_set_free_cb(tvbuff_t *tvb, const tvbuff_free_cb_t func);
150
151 /** Attach a TVBUFF_REAL_DATA tvbuff to a parent tvbuff. This connection
152  * is used during a tvb_free_chain()... the "child" TVBUFF_REAL_DATA acts
153  * as if is part of the chain-of-creation of the parent tvbuff, although it
154  * isn't. This is useful if you need to take the data from some tvbuff,
155  * run some operation on it, like decryption or decompression, and make a new
156  * tvbuff from it, yet want the new tvbuff to be part of the chain. The reality
157  * is that the new tvbuff *is* part of the "chain of creation", but in a way
158  * that these tvbuff routines are ignorant of. Use this function to make
159  * the tvbuff routines knowledgable of this fact. */
160 WS_DLL_PUBLIC void tvb_set_child_real_data_tvbuff(tvbuff_t *parent,
161     tvbuff_t *child);
162
163 WS_DLL_PUBLIC tvbuff_t *tvb_new_child_real_data(tvbuff_t *parent,
164     const guint8 *data, const guint length, const gint reported_length);
165
166 /** Create a tvbuff backed by existing data. Can throw ReportedBoundsError.
167  * Normally, a callback to free the data should be registered using
168  * tvb_set_free_cb(); when this tvbuff is freed, then your callback will be
169  * called, and at that time you can free your original data. */
170 WS_DLL_PUBLIC tvbuff_t *tvb_new_real_data(const guint8 *data,
171     const guint length, const gint reported_length);
172
173 /** Create a tvbuff that's a subset of another tvbuff.
174  *
175  * 'backing_offset', if positive, is the offset from the beginning of
176  * the backing tvbuff at which the new tvbuff's data begins, and, if
177  * negative, is the offset from the end of the backing tvbuff at which
178  * the new tvbuff's data begins.
179  *
180  * 'backing_length' is the length of the data to include in the new
181  * tvbuff, starting with the byte at 'backing_offset"; if -1, it
182  * means "to the end of the backing tvbuff".  It can be 0, although
183  * the usefulness of the buffer would be rather limited.
184  *
185  * Will throw BoundsError if 'backing_offset'/'length'
186  * is beyond the bounds of the backing tvbuff.
187  * Can throw ReportedBoundsError. */
188 WS_DLL_PUBLIC tvbuff_t *tvb_new_subset(tvbuff_t *backing,
189     const gint backing_offset, const gint backing_length,
190     const gint reported_length);
191
192 /**
193  * Similar to tvb_new_subset() but with captured length calculated
194  * to fit within the existing captured length and the specified
195  * backing length (which is used as the reported length).
196  * Can throw ReportedBoundsError. */
197 WS_DLL_PUBLIC tvbuff_t *tvb_new_subset_length(tvbuff_t *backing,
198     const gint backing_offset, const gint backing_length);
199
200 /** Similar to tvb_new_subset() but with backing_length and reported_length set
201  * to -1.  Can throw ReportedBoundsError. */
202 WS_DLL_PUBLIC tvbuff_t *tvb_new_subset_remaining(tvbuff_t *backing,
203     const gint backing_offset);
204
205 /*
206 * Both tvb_composite_append and tvb_composite_prepend can throw
207  * BoundsError if member_offset/member_length goes beyond bounds of
208  * the 'member' tvbuff. */
209
210 /** Append to the list of tvbuffs that make up this composite tvbuff */
211 WS_DLL_PUBLIC void tvb_composite_append(tvbuff_t *tvb, tvbuff_t *member);
212
213 /** Prepend to the list of tvbuffs that make up this composite tvbuff */
214 extern void tvb_composite_prepend(tvbuff_t *tvb, tvbuff_t *member);
215
216 /** Create an empty composite tvbuff. */
217 WS_DLL_PUBLIC tvbuff_t *tvb_new_composite(void);
218
219 /** Mark a composite tvbuff as initialized. No further appends or prepends
220  * occur, data access can finally happen after this finalization. */
221 WS_DLL_PUBLIC void tvb_composite_finalize(tvbuff_t *tvb);
222
223
224 /* Get total length of buffer */
225 WS_DLL_PUBLIC guint tvb_length(const tvbuff_t *tvb);
226
227 /** Computes bytes to end of buffer, from offset (which can be negative,
228  * to indicate bytes from end of buffer). Function returns 0 if offset is
229  * either at the end of the buffer or out of bounds. No exception is thrown. */
230 WS_DLL_PUBLIC gint tvb_length_remaining(const tvbuff_t *tvb, const gint offset);
231
232 /** Same as above, but throws an exception if the offset is out of bounds. */
233 WS_DLL_PUBLIC guint tvb_ensure_length_remaining(const tvbuff_t *tvb,
234     const gint offset);
235
236 /* Checks (w/o throwing exception) that the bytes referred to by
237  * 'offset'/'length' actually exist in the buffer */
238 WS_DLL_PUBLIC gboolean tvb_bytes_exist(const tvbuff_t *tvb, const gint offset,
239     const gint length);
240
241 /** Checks that the bytes referred to by 'offset'/'length' actually exist
242  * in the buffer, and throws an exception if they aren't. */
243 WS_DLL_PUBLIC void tvb_ensure_bytes_exist(const tvbuff_t *tvb,
244     const gint offset, const gint length);
245
246 /* Checks (w/o throwing exception) that offset exists in buffer */
247 WS_DLL_PUBLIC gboolean tvb_offset_exists(const tvbuff_t *tvb,
248     const gint offset);
249
250 /* Get reported length of buffer */
251 WS_DLL_PUBLIC guint tvb_reported_length(const tvbuff_t *tvb);
252
253 /** Computes bytes of reported packet data to end of buffer, from offset
254  * (which can be negative, to indicate bytes from end of buffer). Function
255  * returns 0 if offset is either at the end of the buffer or out of bounds.
256  * No exception is thrown. */
257 WS_DLL_PUBLIC gint tvb_reported_length_remaining(const tvbuff_t *tvb,
258     const gint offset);
259
260 /** Set the reported length of a tvbuff to a given value; used for protocols
261    whose headers contain an explicit length and where the calling
262    dissector's payload may include padding as well as the packet for
263    this protocol.
264
265    Also adjusts the data length. */
266 WS_DLL_PUBLIC void tvb_set_reported_length(tvbuff_t *tvb, const guint);
267
268 WS_DLL_PUBLIC guint tvb_offset_from_real_beginning(const tvbuff_t *tvb);
269
270 /* Returns the offset from the first byte of real data. */
271 WS_DLL_PUBLIC gint tvb_raw_offset(tvbuff_t *tvb);
272
273 /** Set the "this is a fragment" flag. */
274 WS_DLL_PUBLIC void tvb_set_fragment(tvbuff_t *tvb);
275
276 WS_DLL_PUBLIC struct tvbuff *tvb_get_ds_tvb(tvbuff_t *tvb);
277
278
279 /************** START OF ACCESSORS ****************/
280 /* All accessors will throw an exception if appropriate */
281
282 WS_DLL_PUBLIC guint8 tvb_get_guint8(tvbuff_t *tvb, const gint offset);
283
284 WS_DLL_PUBLIC guint16 tvb_get_ntohs(tvbuff_t *tvb, const gint offset);
285 WS_DLL_PUBLIC guint32 tvb_get_ntoh24(tvbuff_t *tvb, const gint offset);
286 WS_DLL_PUBLIC guint32 tvb_get_ntohl(tvbuff_t *tvb, const gint offset);
287 WS_DLL_PUBLIC guint64 tvb_get_ntoh40(tvbuff_t *tvb, const gint offset);
288 WS_DLL_PUBLIC gint64 tvb_get_ntohi40(tvbuff_t *tvb, const gint offset);
289 WS_DLL_PUBLIC guint64 tvb_get_ntoh48(tvbuff_t *tvb, const gint offset);
290 WS_DLL_PUBLIC gint64 tvb_get_ntohi48(tvbuff_t *tvb, const gint offset);
291 WS_DLL_PUBLIC guint64 tvb_get_ntoh56(tvbuff_t *tvb, const gint offset);
292 WS_DLL_PUBLIC gint64 tvb_get_ntohi56(tvbuff_t *tvb, const gint offset);
293 WS_DLL_PUBLIC guint64 tvb_get_ntoh64(tvbuff_t *tvb, const gint offset);
294 WS_DLL_PUBLIC gfloat tvb_get_ntohieee_float(tvbuff_t *tvb, const gint offset);
295 WS_DLL_PUBLIC gdouble tvb_get_ntohieee_double(tvbuff_t *tvb,
296     const gint offset);
297
298 WS_DLL_PUBLIC guint16 tvb_get_letohs(tvbuff_t *tvb, const gint offset);
299 WS_DLL_PUBLIC guint32 tvb_get_letoh24(tvbuff_t *tvb, const gint offset);
300 WS_DLL_PUBLIC guint32 tvb_get_letohl(tvbuff_t *tvb, const gint offset);
301 WS_DLL_PUBLIC guint64 tvb_get_letoh40(tvbuff_t *tvb, const gint offset);
302 WS_DLL_PUBLIC gint64 tvb_get_letohi40(tvbuff_t *tvb, const gint offset);
303 WS_DLL_PUBLIC guint64 tvb_get_letoh48(tvbuff_t *tvb, const gint offset);
304 WS_DLL_PUBLIC gint64 tvb_get_letohi48(tvbuff_t *tvb, const gint offset);
305 WS_DLL_PUBLIC guint64 tvb_get_letoh56(tvbuff_t *tvb, const gint offset);
306 WS_DLL_PUBLIC gint64 tvb_get_letohi56(tvbuff_t *tvb, const gint offset);
307 WS_DLL_PUBLIC guint64 tvb_get_letoh64(tvbuff_t *tvb, const gint offset);
308 WS_DLL_PUBLIC gfloat tvb_get_letohieee_float(tvbuff_t *tvb, const gint offset);
309 WS_DLL_PUBLIC gdouble tvb_get_letohieee_double(tvbuff_t *tvb,
310     const gint offset);
311
312 /**
313  * Fetch an IPv4 address, in network byte order.
314  * We do *not* convert it to host byte order; we leave it in
315  * network byte order, as that's what its callers expect. */
316 WS_DLL_PUBLIC guint32 tvb_get_ipv4(tvbuff_t *tvb, const gint offset);
317
318 /* Fetch an IPv6 address. */
319 WS_DLL_PUBLIC void tvb_get_ipv6(tvbuff_t *tvb, const gint offset,
320     struct e_in6_addr *addr);
321
322 /* Fetch a GUID. */
323 WS_DLL_PUBLIC void tvb_get_ntohguid(tvbuff_t *tvb, const gint offset,
324     e_guid_t *guid);
325 WS_DLL_PUBLIC void tvb_get_letohguid(tvbuff_t *tvb, const gint offset,
326     e_guid_t *guid);
327 WS_DLL_PUBLIC void tvb_get_guid(tvbuff_t *tvb, const gint offset,
328     e_guid_t *guid, const guint representation);
329
330 /* Fetch a specified number of bits from bit offset in a tvb.  All of these
331  * functions are equivalent, except for the type of the return value.  Note
332  * that the parameter encoding (where supplied) is meaningless and ignored */
333
334 /* get 1 - 8 bits returned in a guint8 */
335 WS_DLL_PUBLIC guint8 tvb_get_bits8(tvbuff_t *tvb, guint bit_offset,
336     const gint no_of_bits);
337 /* get 1 - 16 bits returned in a guint16 */
338 WS_DLL_PUBLIC guint16 tvb_get_bits16(tvbuff_t *tvb, guint bit_offset,
339     const gint no_of_bits, const guint encoding);
340 /* get 1 - 32 bits returned in a guint32 */
341 WS_DLL_PUBLIC guint32 tvb_get_bits32(tvbuff_t *tvb, guint bit_offset,
342     const gint no_of_bits, const guint encoding);
343 /* get 1 - 64 bits returned in a guint64 */
344 WS_DLL_PUBLIC guint64 tvb_get_bits64(tvbuff_t *tvb, guint bit_offset,
345     const gint no_of_bits, const guint encoding);
346
347 /**
348  *  This function has EXACTLY the same behavior as
349  *  tvb_get_bits32()
350  */
351 WS_DLL_PUBLIC guint32 tvb_get_bits(tvbuff_t *tvb, const guint bit_offset,
352     const gint no_of_bits, const guint encoding);
353
354 /** Returns target for convenience. Does not suffer from possible
355  * expense of tvb_get_ptr(), since this routine is smart enough
356  * to copy data in chunks if the request range actually exists in
357  * different TVBUFF_REAL_DATA tvbuffs. This function assumes that the
358  * target memory is already allocated; it does not allocate or free the
359  * target memory. */
360 WS_DLL_PUBLIC void *tvb_memcpy(tvbuff_t *tvb, void *target, const gint offset,
361     size_t length);
362
363 /** If scope is set to NULL it is the user's responsibility to g_free()
364  * the memory allocated by tvb_memdup(). Otherwise memory is
365  * automatically freed when the scope lifetime is reached.
366  * Calls tvb_memcpy() */
367 WS_DLL_PUBLIC void *tvb_memdup(wmem_allocator_t *scope, tvbuff_t *tvb,
368     const gint offset, size_t length);
369
370 /** WARNING! This function is possibly expensive, temporarily allocating
371  * another copy of the packet data. Furthermore, it's dangerous because once
372  * this pointer is given to the user, there's no guarantee that the user will
373  * honor the 'length' and not overstep the boundaries of the buffer.
374  *
375  * If you're thinking of using tvb_get_ptr, STOP WHAT YOU ARE DOING
376  * IMMEDIATELY. Go take a break. Consider that tvb_get_ptr hands you
377  * a raw, unprotected pointer that you can easily use to create a
378  * security vulnerability or otherwise crash Wireshark. Then consider
379  * that you can probably find a function elsewhere in this file that
380  * does exactly what you want in a much more safe and robust manner.
381  *
382  * The returned pointer is data that is internal to the tvbuff, so do not
383  * attempt to free it. Don't modify the data, either, because another tvbuff
384  * that might be using this tvbuff may have already copied that portion of
385  * the data (sometimes tvbuff's need to make copies of data, but that's the
386  * internal implementation that you need not worry about). Assume that the
387  * guint8* points to read-only data that the tvbuff manages.
388  *
389  * Return a pointer into our buffer if the data asked for via 'offset'/'length'
390  * is contiguous (which might not be the case for TVBUFF_COMPOSITE). If the
391  * data is not contiguous, a tvb_memdup() is called for the entire buffer
392  * and the pointer to the newly-contiguous data is returned. This dynamically-
393  * allocated memory will be freed when the tvbuff is freed, after the
394  * tvbuff_free_cb_t() is called, if any. */
395 WS_DLL_PUBLIC const guint8 *tvb_get_ptr(tvbuff_t *tvb, const gint offset,
396     const gint length);
397
398 /** Find first occurrence of needle in tvbuff, starting at offset. Searches
399  * at most maxlength number of bytes; if maxlength is -1, searches to
400  * end of tvbuff.
401  * Returns the offset of the found needle, or -1 if not found.
402  * Will not throw an exception, even if maxlength exceeds boundary of tvbuff;
403  * in that case, -1 will be returned if the boundary is reached before
404  * finding needle. */
405 WS_DLL_PUBLIC gint tvb_find_guint8(tvbuff_t *tvb, const gint offset,
406     const gint maxlength, const guint8 needle);
407
408 /** Find first occurrence of any of the needles in tvbuff, starting at offset.
409  * Searches at most maxlength number of bytes. Returns the offset of the
410  * found needle, or -1 if not found and the found needle.
411  * Will not throw an exception, even if
412  * maxlength exceeds boundary of tvbuff; in that case, -1 will be returned if
413  * the boundary is reached before finding needle. */
414 WS_DLL_PUBLIC gint tvb_pbrk_guint8(tvbuff_t *tvb, const gint offset,
415     const gint maxlength, const guint8 *needles, guchar *found_needle);
416
417 /** Find size of stringz (NUL-terminated string) by looking for terminating
418  * NUL.  The size of the string includes the terminating NUL.
419  *
420  * If the NUL isn't found, it throws the appropriate exception.
421  */
422 WS_DLL_PUBLIC guint tvb_strsize(tvbuff_t *tvb, const gint offset);
423
424 /** Find size of UCS-2 or UTF-16 stringz (NUL-terminated string) by
425  * looking for terminating 16-bit NUL.  The size of the string includes
426  * the terminating NUL.
427  *
428  * If the NUL isn't found, it throws the appropriate exception.
429  */
430 WS_DLL_PUBLIC guint tvb_unicode_strsize(tvbuff_t *tvb, const gint offset);
431
432 /** Find length of string by looking for end of zero terminated string, up to
433  * 'maxlength' characters'; if 'maxlength' is -1, searches to end
434  * of tvbuff.
435  * Returns -1 if 'maxlength' reached before finding EOS. */
436 WS_DLL_PUBLIC gint tvb_strnlen(tvbuff_t *tvb, const gint offset,
437     const guint maxlength);
438
439 /** Convert a string from Unicode to ASCII.  At the moment we fake it by
440  * assuming all characters are ASCII  )-:  The len parameter is the number
441  * of guint16's to convert from Unicode.
442  *
443  * XXX - These functions have been superceded by tvb_get_unicode_string()
444  *
445  * If scope is set to NULL, returned buffer is allocated by g_malloc()
446  * and must be g_free by the caller. Otherwise memory is automatically
447  * freed when the scope lifetime is reached.
448  */
449 WS_DLL_PUBLIC char *tvb_get_faked_unicode(wmem_allocator_t *scope,
450     tvbuff_t *tvb, int offset, const int len, const gboolean little_endian);
451
452 /**
453  * Format the data in the tvb from offset for size ...
454  */
455 WS_DLL_PUBLIC gchar *tvb_format_text(tvbuff_t *tvb, const gint offset,
456     const gint size);
457
458 /**
459  * Like "tvb_format_text()", but for 'wsp'; don't show
460  * the characters as C-style escapes.
461  */
462 WS_DLL_PUBLIC gchar *tvb_format_text_wsp(tvbuff_t *tvb, const gint offset,
463     const gint size);
464
465 /**
466  * Like "tvb_format_text()", but for null-padded strings; don't show
467  * the null padding characters as "\000".
468  */
469 extern gchar *tvb_format_stringzpad(tvbuff_t *tvb, const gint offset,
470     const gint size);
471
472 /**
473  * Like "tvb_format_text_wsp()", but for null-padded strings; don't show
474  * the null padding characters as "\000".
475  */
476 extern gchar *tvb_format_stringzpad_wsp(tvbuff_t *tvb, const gint offset,
477     const gint size);
478
479
480 /**
481  * Given a tvbuff, an offset, and a length, allocate a buffer big enough
482  * to hold a non-null-terminated string of that length at that offset,
483  * plus a trailing zero, copy the string into it, and return a pointer
484  * to the string.
485  *
486  * Throws an exception if the tvbuff ends before the string does.
487  *
488  * tvb_get_string() returns a string allocated.
489  *
490  * tvb_get_unicode_string() Unicode (UTF-16) version of above.
491  *
492  * tvb_get_string_enc() takes a string encoding as well, and converts to UTF-8
493  *                   from the encoding (only UTF-8 and EBCDIC supported).
494  *
495  * If scope is set to NULL it is the user's responsibility to g_free()
496  * the memory allocated by tvb_memdup(). Otherwise memory is
497  * automatically freed when the scope lifetime is reached.
498  */
499 WS_DLL_PUBLIC guint8 *tvb_get_string(wmem_allocator_t *scope, tvbuff_t *tvb,
500     const gint offset, const gint length);
501 WS_DLL_PUBLIC gchar  *tvb_get_unicode_string(wmem_allocator_t *scope,
502     tvbuff_t *tvb, const gint offset, gint length, const guint encoding);
503 WS_DLL_PUBLIC guint8 *tvb_get_string_enc(wmem_allocator_t *scope,
504     tvbuff_t *tvb, const gint offset, const gint length, const guint encoding);
505
506
507 /**
508  * Given a tvbuff and an offset, with the offset assumed to refer to
509  * a null-terminated string, find the length of that string (and throw
510  * an exception if the tvbuff ends before we find the null), allocate
511  * a buffer big enough to hold the string, copy the string into it,
512  * and return a pointer to the string.  Also return the length of the
513  * string (including the terminating null) through a pointer.
514  *
515  * tvb_get_stringz() returns a string
516  *
517  * tvb_get_stringz_enc() takes a string encoding as well, and converts to
518  *                   UTF-8 from the encoding (only UTF-8 and EBCDIC supported)
519  *
520  * tvb_get_const_stringz() returns a constant (unmodifiable) string that does
521  *                   not need to be freed, instead it will automatically be
522  *                   freed once the next packet is dissected.  It is slightly
523  *                   more efficient than the other routines.
524  *
525  * tvb_get_unicode_stringz() Unicode (UTF-16) version of above
526  *
527  * If scope is set to NULL it is the user's responsibility to g_free()
528  * the memory allocated by tvb_memdup(). Otherwise memory is
529  * automatically freed when the scope lifetime is reached.
530  */
531 WS_DLL_PUBLIC guint8 *tvb_get_stringz(wmem_allocator_t *scope, tvbuff_t *tvb,
532     const gint offset, gint *lengthp);
533 WS_DLL_PUBLIC guint8 *tvb_get_stringz_enc(wmem_allocator_t *scope,
534     tvbuff_t *tvb, const gint offset, gint *lengthp, const guint encoding);
535 WS_DLL_PUBLIC const guint8 *tvb_get_const_stringz(tvbuff_t *tvb,
536     const gint offset, gint *lengthp);
537 WS_DLL_PUBLIC gchar *tvb_get_unicode_stringz(wmem_allocator_t *scope,
538     tvbuff_t *tvb, const gint offset, gint *lengthp, const guint encoding);
539
540 /** Looks for a stringz (NUL-terminated string) in tvbuff and copies
541  * no more than bufsize number of bytes, including terminating NUL, to buffer.
542  * Returns length of string (not including terminating NUL), or -1 if the
543  * string was truncated in the buffer due to not having reached the terminating
544  * NUL.  In this way, it acts like g_snprintf().
545  *
546  * When processing a packet where the remaining number of bytes is less
547  * than bufsize, an exception is not thrown if the end of the packet
548  * is reached before the NUL is found. If no NUL is found before reaching
549  * the end of the short packet, -1 is still returned, and the string
550  * is truncated with a NUL, albeit not at buffer[bufsize - 1], but
551  * at the correct spot, terminating the string.
552  */
553 WS_DLL_PUBLIC gint tvb_get_nstringz(tvbuff_t *tvb, const gint offset,
554     const guint bufsize, guint8 *buffer);
555
556 /** Like tvb_get_nstringz(), but never returns -1. The string is guaranteed to
557  * have a terminating NUL. If the string was truncated when copied into buffer,
558  * a NUL is placed at the end of buffer to terminate it.
559  *
560  * bufsize MUST be greater than 0.
561  */
562 WS_DLL_PUBLIC gint tvb_get_nstringz0(tvbuff_t *tvb, const gint offset,
563     const guint bufsize, guint8 *buffer);
564
565 /**
566  * Given a tvbuff, an offset into the tvbuff, and a length that starts
567  * at that offset (which may be -1 for "all the way to the end of the
568  * tvbuff"), find the end of the (putative) line that starts at the
569  * specified offset in the tvbuff, going no further than the specified
570  * length.
571  *
572  * Return the length of the line (not counting the line terminator at
573  * the end), or, if we don't find a line terminator:
574  *
575  *  if "deseg" is true, return -1;
576  *
577  *  if "deseg" is false, return the amount of data remaining in
578  *  the buffer.
579  *
580  * Set "*next_offset" to the offset of the character past the line
581  * terminator, or past the end of the buffer if we don't find a line
582  * terminator.  (It's not set if we return -1.)
583  */
584 WS_DLL_PUBLIC gint tvb_find_line_end(tvbuff_t *tvb, const gint offset, int len,
585     gint *next_offset, const gboolean desegment);
586
587 /**
588  * Given a tvbuff, an offset into the tvbuff, and a length that starts
589  * at that offset (which may be -1 for "all the way to the end of the
590  * tvbuff"), find the end of the (putative) line that starts at the
591  * specified offset in the tvbuff, going no further than the specified
592  * length.
593  *
594  * However, treat quoted strings inside the buffer specially - don't
595  * treat newlines in quoted strings as line terminators.
596  *
597  * Return the length of the line (not counting the line terminator at
598  * the end), or the amount of data remaining in the buffer if we don't
599  * find a line terminator.
600  *
601  * Set "*next_offset" to the offset of the character past the line
602  * terminator, or past the end of the buffer if we don't find a line
603  * terminator.
604  */
605 WS_DLL_PUBLIC gint tvb_find_line_end_unquoted(tvbuff_t *tvb, const gint offset,
606     int len, gint *next_offset);
607
608 /**
609  * Copied from the mgcp dissector. (This function should be moved to /epan )
610  * tvb_skip_wsp - Returns the position in tvb of the first non-whitespace
611  *                character following offset or offset + maxlength -1 whichever
612  *                is smaller.
613  *
614  * Parameters:
615  * tvb - The tvbuff in which we are skipping whitespace.
616  * offset - The offset in tvb from which we begin trying to skip whitespace.
617  * maxlength - The maximum distance from offset that we may try to skip
618  * whitespace.
619  *
620  * Returns: The position in tvb of the first non-whitespace
621  *          character following offset or offset + maxlength -1 whichever
622  *          is smaller.
623  */
624
625 WS_DLL_PUBLIC gint tvb_skip_wsp(tvbuff_t *tvb, const gint offset,
626     const gint maxlength);
627
628 WS_DLL_PUBLIC gint tvb_skip_wsp_return(tvbuff_t *tvb, const gint offset);
629
630 /**
631  * Call strncmp after checking if enough chars left, returning 0 if
632  * it returns 0 (meaning "equal") and -1 otherwise, otherwise return -1.
633  */
634 WS_DLL_PUBLIC gint tvb_strneql(tvbuff_t *tvb, const gint offset,
635     const gchar *str, const size_t size);
636
637 /**
638  * Call g_ascii_strncasecmp after checking if enough chars left, returning
639  * 0 if it returns 0 (meaning "equal") and -1 otherwise, otherwise return -1.
640  */
641 WS_DLL_PUBLIC gint tvb_strncaseeql(tvbuff_t *tvb, const gint offset,
642     const gchar *str, const size_t size);
643
644 /**
645  * Call memcmp after checking if enough chars left, returning 0 if
646  * it returns 0 (meaning "equal") and -1 otherwise, otherwise return -1.
647  */
648 WS_DLL_PUBLIC gint tvb_memeql(tvbuff_t *tvb, const gint offset,
649     const guint8 *str, size_t size);
650
651 /**
652  * Format a bunch of data from a tvbuff as bytes, returning a pointer
653  * to the string with the formatted data, with "punct" as a byte
654  * separator.
655  */
656 WS_DLL_PUBLIC gchar *tvb_bytes_to_ep_str_punct(tvbuff_t *tvb, const gint offset,
657     const gint len, const gchar punct);
658
659 /**
660  * Format a bunch of data from a tvbuff as bytes, returning a pointer
661  * to the string with the formatted data.
662  */
663 WS_DLL_PUBLIC gchar *tvb_bytes_to_ep_str(tvbuff_t *tvb, const gint offset,
664     const gint len);
665
666 /**
667  * Given a tvbuff, an offset into the tvbuff, and a length that starts
668  * at that offset (which may be -1 for "all the way to the end of the
669  * tvbuff"), fetch BCD encoded digits from a tvbuff starting from either
670  * the low or high half byte, formatting the digits according to an input digit
671  * set, if NUL a default digit set of 0-9 returning "?" for overdecadic digits
672  * will be used.  A pointer to the EP allocated string will be returned.
673  * Note a tvbuff content of 0xf is considered a 'filler' and will end the
674  * conversion.
675  */
676 typedef struct dgt_set_t
677 {
678     const unsigned char out[16];
679 }
680 dgt_set_t;
681
682 WS_DLL_PUBLIC const gchar *tvb_bcd_dig_to_wmem_packet_str(tvbuff_t *tvb,
683     const gint offset, const gint len, dgt_set_t *dgt, gboolean skip_first);
684
685 /** Locate a sub-tvbuff within another tvbuff, starting at position
686  * 'haystack_offset'. Returns the index of the beginning of 'needle' within
687  * 'haystack', or -1 if 'needle' is not found. The index is relative
688  * to the start of 'haystack', not 'haystack_offset'. */
689 WS_DLL_PUBLIC gint tvb_find_tvb(tvbuff_t *haystack_tvb, tvbuff_t *needle_tvb,
690     const gint haystack_offset);
691
692 /**
693  * Uncompresses a zlib compressed packet inside a tvbuff at offset with
694  * length comprlen.  Returns an uncompressed tvbuffer if uncompression
695  * succeeded or NULL if uncompression failed.
696  */
697 WS_DLL_PUBLIC tvbuff_t *tvb_uncompress(tvbuff_t *tvb, const int offset,
698     int comprlen);
699
700 /**
701  * Uncompresses a zlib compressed packet inside a tvbuff at offset with
702  * length comprlen.  Returns an uncompressed tvbuffer attached to tvb if
703  * uncompression succeeded or NULL if uncompression failed.
704  */
705 extern tvbuff_t *tvb_child_uncompress(tvbuff_t *parent, tvbuff_t *tvb,
706     const int offset, int comprlen);
707
708 /************** END OF ACCESSORS ****************/
709
710 /** @} */
711
712 #ifdef __cplusplus
713 }
714 #endif /* __cplusplus */
715
716 #endif /* __TVBUFF_H__ */
717
718 /*
719  * Editor modelines  -  http://www.wireshark.org/tools/modelines.html
720  *
721  * Local variables:
722  * c-basic-offset: 4
723  * tab-width: 4
724  * indent-tabs-mode: nil
725  * End:
726  *
727  * vi: set shiftwidth=4 tabstop=4 expandtab:
728  * :indentSize=4:tabSize=4:noTabs=true:
729  */
730