11 if ((buf == NULL) || (storage == NULL) || (capacity == 0U))
33 if ((buf == NULL) || (buf->
data == NULL))
47 if ((buf == NULL) || (buf->
data == NULL) || (src == NULL))
57 (void)memcpy(buf->
data, src, src_len);
68 if ((buf == NULL) || (buf->
data == NULL) || (dest == NULL) || (out_copied == NULL))
72 if (buf->
length > dest_capacity)
87 if ((buf == NULL) || (buf->
data == NULL) || (out_view == NULL))
106 if (buf->
data == NULL)
135 dest = (
unsigned char *)buf->
data;
136 (void)memcpy(&dest[buf->
length], bytes, n);
153 unsigned char *out_bytes,
size_t n)
155 const unsigned char *src;
157 if ((buf == NULL) || (out_bytes == NULL) || (buf->
data == NULL))
161 if ((offset > buf->
length) || ((buf->
length - offset) < n))
165 src = (
const unsigned char *)buf->
data;
166 (void)memcpy(out_bytes, &src[offset], n);
172 unsigned char bytes[2];
173 bytes[0] = (
unsigned char)(value & 0xFFU);
174 bytes[1] = (
unsigned char)((value >> 8) & 0xFFU);
180 unsigned char bytes[2];
181 bytes[0] = (
unsigned char)((value >> 8) & 0xFFU);
182 bytes[1] = (
unsigned char)(value & 0xFFU);
188 unsigned char bytes[4];
189 bytes[0] = (
unsigned char)(value & 0xFFU);
190 bytes[1] = (
unsigned char)((value >> 8) & 0xFFU);
191 bytes[2] = (
unsigned char)((value >> 16) & 0xFFU);
192 bytes[3] = (
unsigned char)((value >> 24) & 0xFFU);
198 unsigned char bytes[4];
199 bytes[0] = (
unsigned char)((value >> 24) & 0xFFU);
200 bytes[1] = (
unsigned char)((value >> 16) & 0xFFU);
201 bytes[2] = (
unsigned char)((value >> 8) & 0xFFU);
202 bytes[3] = (
unsigned char)(value & 0xFFU);
208 unsigned char bytes[8];
210 for (i = 0U; i <
sizeof(bytes); i++)
212 bytes[i] = (
unsigned char)((value >> (8U * (uint64_t)i)) & 0xFFU);
219 unsigned char bytes[8];
221 for (i = 0U; i <
sizeof(bytes); i++)
223 size_t shift = (
sizeof(bytes) - 1U - i) * 8U;
224 bytes[i] = (
unsigned char)((value >> (uint64_t)shift) & 0xFFU);
231 unsigned char bytes[2];
235 if (out_value == NULL)
244 v = (uint32_t)bytes[0] | ((uint32_t)bytes[1] << 8);
245 *out_value = (uint16_t)v;
251 unsigned char bytes[2];
255 if (out_value == NULL)
264 v = ((uint32_t)bytes[0] << 8) | (uint32_t)bytes[1];
265 *out_value = (uint16_t)v;
271 unsigned char bytes[4];
274 if (out_value == NULL)
283 *out_value = (uint32_t)bytes[0]
284 | ((uint32_t)bytes[1] << 8)
285 | ((uint32_t)bytes[2] << 16)
286 | ((uint32_t)bytes[3] << 24);
292 unsigned char bytes[4];
295 if (out_value == NULL)
304 *out_value = ((uint32_t)bytes[0] << 24)
305 | ((uint32_t)bytes[1] << 16)
306 | ((uint32_t)bytes[2] << 8)
307 | (uint32_t)bytes[3];
313 unsigned char bytes[8];
318 if (out_value == NULL)
327 for (i = 0U; i <
sizeof(bytes); i++)
329 v |= ((uint64_t)bytes[i]) << (8U * (uint64_t)i);
337 unsigned char bytes[8];
342 if (out_value == NULL)
351 for (i = 0U; i <
sizeof(bytes); i++)
353 size_t shift = (
sizeof(bytes) - 1U - i) * 8U;
354 v |= ((uint64_t)bytes[i]) << (uint64_t)shift;
sapi_status_t sapi_buffer_write_u16_le(sapi_buffer_t *buf, uint16_t value)
Appends a little-endian uint16_t at buf's current length.
sapi_status_t sapi_buffer_write_u32_be(sapi_buffer_t *buf, uint32_t value)
Appends a big-endian uint32_t. See sapi_buffer_write_u32_le().
sapi_status_t sapi_buffer_write_u64_le(sapi_buffer_t *buf, uint64_t value)
Appends a little-endian uint64_t at buf's current length.
sapi_status_t sapi_buffer_write_u32_le(sapi_buffer_t *buf, uint32_t value)
Appends a little-endian uint32_t at buf's current length.
sapi_status_t sapi_buffer_clear(sapi_buffer_t *buf)
Resets length to 0; capacity and data are unchanged.
sapi_status_t sapi_buffer_read_u64_le(const sapi_buffer_t *buf, size_t offset, uint64_t *out_value)
Reads a little-endian uint64_t at the given offset.
sapi_status_t sapi_buffer_read_u16_be(const sapi_buffer_t *buf, size_t offset, uint16_t *out_value)
Reads a big-endian uint16_t. See sapi_buffer_read_u16_le().
sapi_status_t sapi_buffer_read_u64_be(const sapi_buffer_t *buf, size_t offset, uint64_t *out_value)
Reads a big-endian uint64_t. See sapi_buffer_read_u64_le().
sapi_status_t sapi_buffer_copy_out(const sapi_buffer_t *buf, void *dest, size_t dest_capacity, size_t *out_copied)
Bounds-checked copy of the buffer's valid bytes to an external destination.
sapi_status_t sapi_buffer_read_u16_le(const sapi_buffer_t *buf, size_t offset, uint16_t *out_value)
Reads a little-endian uint16_t at the given offset.
sapi_status_t sapi_buffer_read_u32_le(const sapi_buffer_t *buf, size_t offset, uint32_t *out_value)
Reads a little-endian uint32_t at the given offset.
sapi_status_t sapi_buffer_write_u64_be(sapi_buffer_t *buf, uint64_t value)
Appends a big-endian uint64_t. See sapi_buffer_write_u64_le().
sapi_status_t sapi_buffer_init(sapi_buffer_t *buf, void *storage, size_t capacity)
Binds a buffer view to caller-owned storage. Initial length is 0.
sapi_status_t sapi_buffer_set_length(sapi_buffer_t *buf, size_t length)
Marks length bytes of already-written storage as valid.
sapi_status_t sapi_buffer_copy_in(sapi_buffer_t *buf, const void *src, size_t src_len)
Bounds-checked copy of external data into the buffer; sets length.
sapi_status_t sapi_buffer_read_u32_be(const sapi_buffer_t *buf, size_t offset, uint32_t *out_value)
Reads a big-endian uint32_t. See sapi_buffer_read_u32_le().
bool sapi_buffer_is_valid(const sapi_buffer_t *buf)
Defensive validity check: non-null data and length <= capacity.
sapi_status_t sapi_buffer_as_const(const sapi_buffer_t *buf, sapi_const_buffer_t *out_view)
Produces a read-only view of the buffer's current valid bytes. The view is only valid as long as the ...
sapi_status_t sapi_buffer_write_u16_be(sapi_buffer_t *buf, uint16_t value)
Appends a big-endian uint16_t. See sapi_buffer_write_u16_le().
sapi_status_t
Common result/status codes.
@ SAPI_STATUS_INTERNAL_ERROR
@ SAPI_STATUS_INVALID_PARAM
@ SAPI_STATUS_RESOURCE_EXHAUSTED
static sapi_status_t sapi_buffer_append_bytes(sapi_buffer_t *buf, const unsigned char *bytes, size_t n)
Appends n raw bytes at buf's current length, advancing it. Shared by every sapi_buffer_write_*_le/be ...
static sapi_status_t sapi_buffer_peek_bytes(const sapi_buffer_t *buf, size_t offset, unsigned char *out_bytes, size_t n)
Reads n raw bytes starting at offset, without mutating buf. Shared by every sapi_buffer_read_*_le/be ...
Cross-layer data buffer abstraction (ADR-002).
Mutable, bounds-tracked view over caller-owned storage.
Read-only view of a buffer's currently valid bytes. Grants no write access to the underlying storage.