diff options
author | Dario Lombardo <lomato@gmail.com> | 2016-02-18 11:32:07 +0100 |
---|---|---|
committer | Evan Huus <eapache@gmail.com> | 2016-02-22 19:55:33 +0000 |
commit | 37acf433dbb2ef1d443c9ee09a315b0b4ce136d8 (patch) | |
tree | 1738745a8073d6ad9fa6454253503816455c8b7f /epan/wmem | |
parent | 13332353607ac00158bc36ab08e7442c9722ef24 (diff) | |
download | wireshark-37acf433dbb2ef1d443c9ee09a315b0b4ce136d8.tar.gz |
wmem: add null-terminator support.
This change makes wmem_array more similar to GArray by adding
two functions that mimic the first two params of g_array_new().
Change-Id: Iaec999cd2e44f79f44d766be5d39741b73602e5a
Reviewed-on: https://code.wireshark.org/review/13989
Petri-Dish: Evan Huus <eapache@gmail.com>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Evan Huus <eapache@gmail.com>
Diffstat (limited to 'epan/wmem')
-rw-r--r-- | epan/wmem/wmem_array.c | 27 | ||||
-rw-r--r-- | epan/wmem/wmem_array.h | 8 | ||||
-rw-r--r-- | epan/wmem/wmem_test.c | 10 |
3 files changed, 45 insertions, 0 deletions
diff --git a/epan/wmem/wmem_array.c b/epan/wmem/wmem_array.c index b4088fb051..6ac45989b2 100644 --- a/epan/wmem/wmem_array.c +++ b/epan/wmem/wmem_array.c @@ -45,6 +45,8 @@ struct _wmem_array_t { guint elem_count; guint alloc_count; + + gboolean null_terminated; }; wmem_array_t * @@ -59,6 +61,7 @@ wmem_array_sized_new(wmem_allocator_t *allocator, gsize elem_size, array->elem_size = elem_size; array->elem_count = 0; array->alloc_count = alloc_count ? alloc_count : 1; + array->null_terminated = FALSE; array->buf = (guint8 *)wmem_alloc(array->allocator, array->elem_size * array->alloc_count); @@ -98,6 +101,28 @@ wmem_array_grow(wmem_array_t *array, const guint to_add) array->alloc_count = new_alloc_count; } +static void +wmem_array_write_null_terminator(wmem_array_t *array) +{ + if (array->null_terminated) { + wmem_array_grow(array, 1); + memset(&array->buf[array->elem_count * array->elem_size], 0x0, array->elem_size); + } +} + +void +wmem_array_set_null_terminator(wmem_array_t *array) +{ + array->null_terminated = TRUE; + wmem_array_write_null_terminator(array); +} + +void +wmem_array_bzero(wmem_array_t *array) +{ + memset(array->buf, 0x0, array->elem_size * array->elem_count); +} + void wmem_array_append(wmem_array_t *array, const void *in, guint count) { @@ -107,6 +132,8 @@ wmem_array_append(wmem_array_t *array, const void *in, guint count) count * array->elem_size); array->elem_count += count; + + wmem_array_write_null_terminator(array); } void * diff --git a/epan/wmem/wmem_array.h b/epan/wmem/wmem_array.h index 2c5481950b..30738d696d 100644 --- a/epan/wmem/wmem_array.h +++ b/epan/wmem/wmem_array.h @@ -59,6 +59,14 @@ G_GNUC_MALLOC; WS_DLL_PUBLIC void +wmem_array_set_null_terminator(wmem_array_t *array); + +WS_DLL_PUBLIC +void +wmem_array_bzero(wmem_array_t *array); + +WS_DLL_PUBLIC +void wmem_array_append(wmem_array_t *array, const void *in, guint count); #define wmem_array_append_one(ARRAY, VAL) \ diff --git a/epan/wmem/wmem_test.c b/epan/wmem/wmem_test.c index f57ae5ee78..b9da385181 100644 --- a/epan/wmem/wmem_test.c +++ b/epan/wmem/wmem_test.c @@ -475,6 +475,8 @@ wmem_test_array(void) unsigned int i, j, k; guint32 val, *buf; guint32 vals[8]; + guint32 *raw; + guint32 lastint; allocator = wmem_allocator_new(WMEM_ALLOCATOR_STRICT); @@ -498,6 +500,7 @@ wmem_test_array(void) } array = wmem_array_sized_new(allocator, sizeof(guint32), 73); + wmem_array_set_null_terminator(array); for (i=0; i<CONTAINER_ITERS; i++) { for (j=0; j<8; j++) { @@ -535,6 +538,13 @@ wmem_test_array(void) } g_assert(k == wmem_array_get_count(array)); + lastint = 77; + wmem_array_append_one(array, lastint); + + raw = (guint32*)wmem_array_get_raw(array); + g_assert(raw[wmem_array_get_count(array)] == 0); + g_assert(raw[wmem_array_get_count(array) - 1] == lastint); + wmem_destroy_allocator(allocator); } |