Skip to content

Instantly share code, notes, and snippets.

@rexim
Created February 2, 2021 11:09
Show Gist options
  • Save rexim/13218fbff17cb64952737a3669c27c12 to your computer and use it in GitHub Desktop.
Save rexim/13218fbff17cb64952737a3669c27c12 to your computer and use it in GitHub Desktop.
Stretching Buffer in C
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
size_t size;
size_t capacity;
char *data;
} Buffer;
void buffer_resize(Buffer *buffer, size_t new_capacity)
{
buffer->capacity = new_capacity;
buffer->data = realloc(buffer->data, buffer->capacity);
}
void buffer_write(Buffer *buffer, const char *data, size_t size)
{
if (buffer->size + size > buffer->capacity) {
buffer_resize(buffer, buffer->capacity * 2 + size);
}
memcpy(buffer->data + buffer->size, data, size);
buffer->size += size;
}
void buffer_write_cstr(Buffer *buffer, const char *cstr)
{
buffer_write(buffer, cstr, strlen(cstr));
}
void buffer_clean(Buffer *buffer)
{
buffer->size = 0;
}
void buffer_free(Buffer *buffer)
{
free(buffer->data);
buffer->data = NULL;
buffer->size = 0;
buffer->capacity = 0;
}
int main(int argc, char *argv[])
{
Buffer buffer = {0};
buffer_write_cstr(&buffer, "hello");
buffer_write_cstr(&buffer, "world");
buffer_write_cstr(&buffer, "foo");
buffer_write_cstr(&buffer, "bar");
buffer_write_cstr(&buffer, "baz");
buffer_free(&buffer);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment