From 85b69110adcd030e304cddce20e1f69abcbb728b Mon Sep 17 00:00:00 2001 From: =?utf8?q?Vladim=C3=ADr=20=C4=8Cun=C3=A1t?= Date: Tue, 10 Apr 2018 14:35:49 +0200 Subject: [PATCH] pack_clone: new function --- lib/generic/pack.h | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/lib/generic/pack.h b/lib/generic/pack.h index b42fd18fc..ddabb0b2a 100644 --- a/lib/generic/pack.h +++ b/lib/generic/pack.h @@ -182,6 +182,25 @@ static inline int pack_obj_del(pack_t *pack, const uint8_t *obj, pack_objlen_t l return -1; } +/** Clone a pack into a mempool (can be NULL). + * @return NULL on allocation failure. */ +static inline pack_t * pack_clone(const pack_t *src, knot_mm_t *pool) +{ + pack_t *dst = mm_alloc(pool, sizeof(pack_t)); + if (!dst) return dst; + pack_init(*dst); + /* Clone data only if needed */ + if (!pack_head(*src)) return dst; + int ret = array_reserve_mm(*dst, src->len, kr_memreserve, pool); + if (ret < 0) { + mm_free(pool, dst); + return NULL; + } + memcpy(dst->at, src->at, src->len); + dst->len = src->len; + return dst; +} + #ifdef __cplusplus } #endif -- 2.47.2