diff options
Diffstat (limited to 'protocols/Tox/libtox/src/toxcore/bin_pack.c')
-rw-r--r-- | protocols/Tox/libtox/src/toxcore/bin_pack.c | 72 |
1 files changed, 55 insertions, 17 deletions
diff --git a/protocols/Tox/libtox/src/toxcore/bin_pack.c b/protocols/Tox/libtox/src/toxcore/bin_pack.c index 3575803aed..56bdc9ec75 100644 --- a/protocols/Tox/libtox/src/toxcore/bin_pack.c +++ b/protocols/Tox/libtox/src/toxcore/bin_pack.c @@ -5,11 +5,12 @@ #include "bin_pack.h" #include <assert.h> -#include <stdlib.h> #include <string.h> #include "../third_party/cmp/cmp.h" +#include "attributes.h" #include "ccompat.h" +#include "logger.h" struct Bin_Pack { uint8_t *bytes; @@ -26,15 +27,16 @@ static bool null_reader(cmp_ctx_t *ctx, void *data, size_t limit) } non_null() -static bool null_skipper(cmp_ctx_t *ctx, size_t limit) +static bool null_skipper(cmp_ctx_t *ctx, size_t count) { - assert(limit == 0); + assert(count == 0); return false; } non_null() static size_t buf_writer(cmp_ctx_t *ctx, const void *data, size_t count) { + const uint8_t *bytes = (const uint8_t *)data; Bin_Pack *bp = (Bin_Pack *)ctx->buf; assert(bp != nullptr); const uint32_t new_pos = bp->bytes_pos + count; @@ -47,7 +49,7 @@ static size_t buf_writer(cmp_ctx_t *ctx, const void *data, size_t count) // Buffer too small. return 0; } - memcpy(bp->bytes + bp->bytes_pos, data, count); + memcpy(&bp->bytes[bp->bytes_pos], bytes, count); } bp->bytes_pos += count; return count; @@ -62,34 +64,71 @@ static void bin_pack_init(Bin_Pack *bp, uint8_t *buf, uint32_t buf_size) cmp_init(&bp->ctx, bp, null_reader, null_skipper, buf_writer); } -bool bin_pack_obj(bin_pack_cb *callback, const void *obj, uint8_t *buf, uint32_t buf_size) +uint32_t bin_pack_obj_size(bin_pack_cb *callback, const void *obj, const Logger *logger) +{ + Bin_Pack bp; + bin_pack_init(&bp, nullptr, 0); + if (!callback(obj, logger, &bp)) { + return UINT32_MAX; + } + return bp.bytes_pos; +} + +bool bin_pack_obj(bin_pack_cb *callback, const void *obj, const Logger *logger, uint8_t *buf, uint32_t buf_size) { Bin_Pack bp; bin_pack_init(&bp, buf, buf_size); - return callback(&bp, obj); + return callback(obj, logger, &bp); } -uint32_t bin_pack_obj_size(bin_pack_cb *callback, const void *obj) +uint32_t bin_pack_obj_array_b_size(bin_pack_array_cb *callback, const void *arr, uint32_t arr_size, const Logger *logger) { Bin_Pack bp; bin_pack_init(&bp, nullptr, 0); - callback(&bp, obj); + if (arr == nullptr) { + assert(arr_size == 0); + } + for (uint32_t i = 0; i < arr_size; ++i) { + if (!callback(arr, i, logger, &bp)) { + return UINT32_MAX; + } + } return bp.bytes_pos; } -Bin_Pack *bin_pack_new(uint8_t *buf, uint32_t buf_size) +bool bin_pack_obj_array_b(bin_pack_array_cb *callback, const void *arr, uint32_t arr_size, const Logger *logger, uint8_t *buf, uint32_t buf_size) { - Bin_Pack *bp = (Bin_Pack *)calloc(1, sizeof(Bin_Pack)); - if (bp == nullptr) { - return nullptr; + Bin_Pack bp; + bin_pack_init(&bp, buf, buf_size); + if (arr == nullptr) { + assert(arr_size == 0); + } + for (uint32_t i = 0; i < arr_size; ++i) { + if (!callback(arr, i, logger, &bp)) { + return false; + } } - bin_pack_init(bp, buf, buf_size); - return bp; + return true; } -void bin_pack_free(Bin_Pack *bp) +bool bin_pack_obj_array(Bin_Pack *bp, bin_pack_array_cb *callback, const void *arr, uint32_t arr_size, const Logger *logger) { - free(bp); + if (arr == nullptr) { + assert(arr_size == 0); + return bin_pack_array(bp, 0); + } + + if (!bin_pack_array(bp, arr_size)) { + return false; + } + + for (uint32_t i = 0; i < arr_size; ++i) { + if (!callback(arr, i, logger, bp)) { + return false; + } + } + + return true; } bool bin_pack_array(Bin_Pack *bp, uint32_t size) @@ -164,4 +203,3 @@ bool bin_pack_bin_b(Bin_Pack *bp, const uint8_t *data, uint32_t length) { return bp->ctx.write(&bp->ctx, data, length) == length; } - |