* for (uint8_t *it = pack_head(pack); it != pack_tail(pack); it = pack_obj_next(it))
*/
#define pack_head(pack) \
- (&(pack).at[0])
+ ((pack).len > 0 ? &((pack).at[0]) : NULL)
/** Return pack end pointer. */
#define pack_tail(pack) \
- (&(pack).at[(pack).len])
+ ((pack).len > 0 ? &((pack).at[(pack).len]) : NULL)
/** Return packed object length. */
static inline pack_objlen_t pack_obj_len(uint8_t *it)
{
pack_objlen_t len = 0;
- if (it)
+ if (it != NULL)
memcpy(&len, it, sizeof(len));
return len;
}
/** Return packed object value. */
static inline uint8_t *pack_obj_val(uint8_t *it)
{
+ if (it == NULL) {
+ assert(it);
+ return NULL;
+ }
return it + sizeof(pack_objlen_t);
}
/** Return pointer to next packed object. */
static inline uint8_t *pack_obj_next(uint8_t *it)
{
+ if (it == NULL) {
+ assert(it);
+ return NULL;
+ }
return pack_obj_val(it) + pack_obj_len(it);
}
return kr_error(ENOSPC);
}
- uint8_t *endp = pack_tail(*pack);
+ uint8_t *endp = pack->at + pack->len;
memcpy(endp, (char *)&len, sizeof(len));
memcpy(endp + sizeof(len), obj, len);
pack->len += packed_len;
static inline uint8_t *pack_obj_find(pack_t *pack, const uint8_t *obj, pack_objlen_t len)
{
if (pack == NULL || obj == NULL) {
- assert(false);
+ assert(obj != NULL);
return NULL;
}
uint8_t *endp = pack_tail(*pack);
static inline int pack_obj_del(pack_t *pack, const uint8_t *obj, pack_objlen_t len)
{
if (pack == NULL || obj == NULL) {
- assert(false);
+ assert(obj != NULL);
return kr_error(EINVAL);
}
uint8_t *endp = pack_tail(*pack);
pack_init(pack);
assert_int_equal(pack.len, 0);
+ /* Test that iterator on empty pack works */
+ assert_null(pack_head(pack));
+ assert_null(pack_tail(pack));
+ assert_null(pack_obj_find(&pack, U8(""), 1));
+ assert_int_equal(pack_obj_len(pack_head(pack)), 0);
+ assert_int_equal(pack_obj_del(&pack, U8(""), 1), -1);
+
/* Push/delete without reservation. */
assert_int_not_equal(pack_obj_push(&pack, U8(""), 1), 0);
assert_int_not_equal(pack_obj_del(&pack, U8(""), 1), 0);