/* * Copyright (c) 2018 Foundries.io * * SPDX-License-Identifier: Apache-2.0 */ #ifndef ZEPHYR_INCLUDE_BUF_UTIL_H_ #define ZEPHYR_INCLUDE_BUF_UTIL_H_ #include #include #include #ifdef __cplusplus extern "C" { #endif /* append */ static inline int buf_append(uint8_t *dst, uint16_t *dst_len, uint16_t dst_size, const uint8_t *src, uint16_t src_len) { if (!dst || !src) { return -EINVAL; } if (*dst_len + src_len > dst_size) { return -ENOMEM; } memcpy(dst + *dst_len, src, src_len); *dst_len += src_len; return 0; } /* insert */ static inline int buf_insert(uint8_t *dst, uint16_t *dst_len, uint16_t dst_size, uint16_t offset, uint8_t *src, uint16_t src_len) { if (!dst || !src) { return -EINVAL; } if (*dst_len + src_len > dst_size) { return -ENOMEM; } /* shift everything in fbuf after offset by len */ memmove(dst + offset + src_len, dst + offset, *dst_len - offset); /* copy src into fbuf at offset */ memcpy(dst + offset, src, src_len); *dst_len += src_len; return 0; } /* read */ static inline int buf_read(uint8_t *dst, uint16_t len, uint8_t *src, uint16_t src_len, uint16_t *offset) { if (!src) { return -EINVAL; } if (*offset + len > src_len) { return -ENODATA; } if (dst) { /* copy data at offset into dst */ memcpy(dst, src + *offset, len); } *offset += len; return 0; } static inline int buf_skip(uint16_t len, uint8_t *src, uint16_t src_len, uint16_t *offset) { return buf_read(NULL, len, src, src_len, offset); } static inline int buf_read_u8(uint8_t *value, uint8_t *src, uint16_t src_len, uint16_t *offset) { return buf_read(value, sizeof(uint8_t), src, src_len, offset); } static inline int buf_read_u16(uint16_t *value, uint8_t *src, uint16_t src_len, uint16_t *offset) { return buf_read((uint8_t *)value, sizeof(uint16_t), src, src_len, offset); } static inline int buf_read_be16(uint16_t *value, uint8_t *src, uint16_t src_len, uint16_t *offset) { int ret; uint8_t v16[2]; ret = buf_read(v16, sizeof(uint16_t), src, src_len, offset); *value = v16[0] << 8 | v16[1]; return ret; } static inline int buf_read_u32(uint32_t *value, uint8_t *src, uint16_t src_len, uint16_t *offset) { return buf_read((uint8_t *)value, sizeof(uint32_t), src, src_len, offset); } static inline int buf_read_be32(uint32_t *value, uint8_t *src, uint16_t src_len, uint16_t *offset) { int ret; uint8_t v32[4]; ret = buf_read(v32, sizeof(uint32_t), src, src_len, offset); *value = v32[0] << 24 | v32[1] << 16 | v32[2] << 8 | v32[3]; return ret; } #ifdef __cplusplus } #endif #endif /* ZEPHYR_INCLUDE_BUF_UTIL_H_ */