Implement buffer_t functions to make it stretchy

This commit is contained in:
2024-12-03 00:21:42 +00:00
parent c824772fc7
commit 82eec8b529
2 changed files with 53 additions and 4 deletions

49
lib.c
View File

@@ -13,11 +13,56 @@ buffer_t *buffer_init_str(const char *name, const char *str, size_t str_size)
buffer_t *buf = malloc(sizeof(*buf) + str_size + 1);
buf->name = name;
buf->size = str_size;
memcpy(buf->data, str, str_size);
buf->data[str_size] = '\0';
buf->capacity = str_size;
if (str)
{
memcpy(buf->data, str, str_size);
buf->data[str_size] = '\0';
}
return buf;
}
bool buffer_ensure(buffer_t **buffer, u64 expected)
{
if (!buffer)
return false;
else if (!*buffer)
{
*buffer = buffer_init_str(NULL, NULL, expected);
}
else if (buffer[0]->capacity <= expected)
{
buffer[0]->capacity = MAX(buffer[0]->capacity * 2, expected);
*buffer = realloc(*buffer, sizeof(**buffer) + buffer[0]->capacity);
}
return true;
}
bool buffer_ensure_relative(buffer_t **buffer, u64 expected)
{
return buffer_ensure(buffer,
buffer && *buffer ? buffer[0]->size + expected : 0);
}
bool buffer_append(buffer_t **buffer, u8 datum)
{
bool ret = buffer_ensure_relative(buffer, 1);
if (ret)
buffer[0]->data[buffer[0]->size++] = datum;
return ret;
}
bool buffer_append_bytes(buffer_t **buffer, u8 *data, u64 size)
{
bool ret = buffer_ensure_relative(buffer, size);
if (ret)
{
memcpy(buffer[0]->data + buffer[0]->size, data, size);
buffer[0]->size += size;
}
return ret;
}
void print_error(const char *handle, size_t row, size_t column,
const char *reason)
{

8
lib.h
View File

@@ -28,9 +28,13 @@ void print_error(const char *handle, size_t row, size_t column,
typedef struct Buffer
{
const char *name;
size_t size;
char data[];
u64 size, capacity;
u8 data[];
} buffer_t;
buffer_t *buffer_init_str(const char *name, const char *str, size_t str_size);
bool buffer_ensure(buffer_t **buffer, u64 expected);
bool buffer_ensure_relative(buffer_t **buffer, u64 expected);
bool buffer_append(buffer_t **buffer, u8 datum);
bool buffer_append_bytes(buffer_t **buffer, u8 *data, u64 size);
#endif