From b5e9f50df26baaeffd4b06565e0e17ed2b292865 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Vavru=C5=A1a?= <marek.vavrusa@nic.cz> Date: Fri, 29 May 2015 18:15:08 +0200 Subject: [PATCH] generic/pack: support for lookup --- lib/generic/pack.h | 37 +++++++++++++++++++++++++------------ tests/test_pack.c | 6 ++++++ 2 files changed, 31 insertions(+), 12 deletions(-) diff --git a/lib/generic/pack.h b/lib/generic/pack.h index 5bad8f0c1..613505e58 100644 --- a/lib/generic/pack.h +++ b/lib/generic/pack.h @@ -129,24 +129,37 @@ static inline int pack_obj_push(pack_t *pack, const uint8_t *obj, pack_objlen_t return 0; } +/** Returns a pointer to packed object. + * @return pointer to packed object or NULL + */ +static inline uint8_t *pack_obj_find(pack_t *pack, const uint8_t *obj, pack_objlen_t len) +{ + uint8_t *endp = pack_tail(*pack); + uint8_t *it = pack_head(*pack); + while (it != endp) { + uint8_t *val = pack_obj_val(it); + if (pack_obj_len(it) == len && memcmp(obj, val, len) == 0) { + return it; + } + it = pack_obj_next(it); + } + return NULL; +} + /** Delete object from the pack * @return 0 on success, negative number on failure */ static inline int pack_obj_del(pack_t *pack, const uint8_t *obj, pack_objlen_t len) { uint8_t *endp = pack_tail(*pack); - uint8_t *it = pack_head(*pack); - while (it != endp) { - uint8_t *val = pack_obj_val(it); - if (pack_obj_len(it) == len && memcmp(obj, val, len) == 0) { - size_t packed_len = len + sizeof(len); - memmove(it, it + packed_len, endp - it - packed_len); - pack->len -= packed_len; - return 0; - } - it = pack_obj_next(it); - } - return -1; + uint8_t *it = pack_obj_find(pack, obj, len); + if (it) { + size_t packed_len = len + sizeof(len); + memmove(it, it + packed_len, endp - it - packed_len); + pack->len -= packed_len; + return 0; + } + return -1; } #ifdef __cplusplus diff --git a/tests/test_pack.c b/tests/test_pack.c index f5ad501cd..c2a470b4a 100644 --- a/tests/test_pack.c +++ b/tests/test_pack.c @@ -49,6 +49,12 @@ static void test_pack_std(void **state) count += 1; } + /* Find */ + it = pack_obj_find(&pack, U8("de"), 2); + assert_non_null(it); + it = pack_obj_find(&pack, U8("ed"), 2); + assert_null(it); + /* Delete */ assert_int_not_equal(pack_obj_del(&pack, U8("be"), 2), 0); assert_int_equal(pack_obj_del(&pack, U8("de"), 2), 0); -- GitLab