146 lines
4.2 KiB
C
146 lines
4.2 KiB
C
/* See the end of this file for copyright and license terms. */
|
|
|
|
#pragma once
|
|
|
|
#include "neo/_toolchain.h"
|
|
#include "neo/_types.h"
|
|
|
|
/**
|
|
* @defgroup nbuf Buffers
|
|
*
|
|
* @{
|
|
*/
|
|
|
|
/**
|
|
* @brief Create a new buffer of fixed size.
|
|
*
|
|
* If allocation fails or `size` is 0, an error is yeeted.
|
|
*
|
|
* @param size Size in bytes
|
|
* @param err Error pointer
|
|
* @returns The buffer, except if an error occurred
|
|
*/
|
|
nbuf_t *nbuf_create(usize size, error *err);
|
|
|
|
/**
|
|
* @brief Create a new buffer of fixed size and copy `data` into it.
|
|
*
|
|
* The original pointer is neither modified nor deallocated.
|
|
* If allocation fails, `data` is `nil`, or `size` is 0, an error is yeeted.
|
|
*
|
|
* @param data Raw data to fill the buffer with
|
|
* @param size How many bytes are read from `data`, and the buffer size
|
|
* @param err Error pointer
|
|
* @returns The buffer, except if an error occurred
|
|
*/
|
|
nbuf_t *nbuf_from(const void *restrict data, usize size, error *err);
|
|
|
|
/**
|
|
* @brief Create a new buffer of fixed size and copy a string into it.
|
|
*
|
|
* The original string is neither modified nor deallocated.
|
|
* If allocation fails or `s` is `nil`, an error is yeeted.
|
|
*
|
|
* @param s String to fill the buffer with
|
|
* @param err Error pointer
|
|
* @returns The buffer, except if an error occurred
|
|
*/
|
|
nbuf_t *nbuf_from_str(const char *restrict s, error *err);
|
|
|
|
/**
|
|
* @brief Create a new buffer of fixed size and copy a neo string into it.
|
|
*
|
|
* The original string is unmodified.
|
|
* If allocation fails or `s` is `nil`, an error is yeeted.
|
|
*
|
|
* @param s Neo string to fill the buffer with
|
|
* @param err Error pointer
|
|
* @returns The buffer, except if an error occurred
|
|
*/
|
|
nbuf_t *nbuf_from_nstr(nstr_t *s, error *err);
|
|
|
|
/**
|
|
* @brief Return a new copy of `buf`.
|
|
*
|
|
* If `buf` is `nil` or allocation fails, an error is yeeted.
|
|
*
|
|
* @param buf Buffer to create a copy of
|
|
* @param err Error pointer
|
|
* @returns A copy of `buf`, unless an error occurred
|
|
*/
|
|
nbuf_t *nbuf_clone(nbuf_t *buf, error *err);
|
|
|
|
/**
|
|
* @brief Get the byte at the specified index.
|
|
*
|
|
* If `buf` is `nil` or `index` is out of bounds, an error is yeeted.
|
|
*
|
|
* @param buf `nbuf_t *` to get the byte from
|
|
* @param index Byte index (counting from 0)
|
|
* @param err Error pointer
|
|
* @returns The byte at position `index` (as a `u8`), unless an error occurred
|
|
*/
|
|
#define nbuf_byte(buf, index, err) ({ \
|
|
u8 __byte = 0; \
|
|
if (nlen(buf) <= index) { \
|
|
yeet(err, ERANGE, "Buffer index out of bounds"); \
|
|
} else { \
|
|
neat(err); \
|
|
__byte = buf->_data[index]; \
|
|
} \
|
|
__byte; \
|
|
})
|
|
|
|
/**
|
|
* @brief Iterate over every byte in a buffer.
|
|
*
|
|
* @param cursor A `const u8 *` to be used as an iteration cursor
|
|
* @param buf `nbuf_t *` to iterate over
|
|
*/
|
|
#define nbuf_foreach(cursor, buf) \
|
|
for (cursor = &buf->_data[0]; \
|
|
cursor != &buf->_data[nlen(buf)]; \
|
|
cursor++)
|
|
|
|
/**
|
|
* @brief Compare two buffers.
|
|
*
|
|
* If the first buffer is found to be greater than the second one, the return
|
|
* value is greater than 0.\n
|
|
* If the two buffers are equal, the return value is zero.\n
|
|
* If the first buffer is found to be less than the second one, the return
|
|
* value is less than 0.
|
|
*
|
|
* If `buf1` or `buf2` is `nil`, an error is yeeted.
|
|
*
|
|
* @param buf1 First buffer to compare
|
|
* @param buf2 Second buffer to compare
|
|
* @param err Error pointer
|
|
* @returns The difference between the buffers, unless an error occurred
|
|
*/
|
|
int nbuf_cmp(const nbuf_t *buf1, const nbuf_t *buf2, error *err);
|
|
|
|
/**
|
|
* @brief Determine whether two buffers are equal.
|
|
*
|
|
* @param buf1 First `nbuf_t *` to compare
|
|
* @param buf2 Second `nbuf_t *` to compare
|
|
* @param err Error pointer
|
|
* @returns `true` if the two buffers are found to be equal, `false` if not
|
|
*/
|
|
#define nbuf_eq(buf1, buf2, err) ( (bool)(nbuf_cmp(buf1, buf2, err) == 0) )
|
|
|
|
/** @} */
|
|
|
|
/*
|
|
* This file is part of libneo.
|
|
* Copyright (c) 2021 Fefie <owo@fef.moe>.
|
|
*
|
|
* libneo is non-violent software: you may only use, redistribute,
|
|
* and/or modify it under the terms of the CNPLv6+ as found in
|
|
* the LICENSE file in the source code root directory or at
|
|
* <https://git.pixie.town/thufie/CNPL>.
|
|
*
|
|
* libneo comes with ABSOLUTELY NO WARRANTY, to the extent
|
|
* permitted by applicable law. See the CNPLv6+ for details.
|
|
*/
|