fix array allocation
This commit is contained in:
parent
0d4d2c2f99
commit
b64b6f7027
1 changed files with 195 additions and 159 deletions
100
slibs.h
100
slibs.h
|
@ -9,7 +9,8 @@
|
||||||
|
|
||||||
#pragma region Memory
|
#pragma region Memory
|
||||||
|
|
||||||
typedef struct sl_metadata {
|
typedef struct sl_metadata
|
||||||
|
{
|
||||||
uint8_t magic;
|
uint8_t magic;
|
||||||
uint32_t size;
|
uint32_t size;
|
||||||
} sl_metadata;
|
} sl_metadata;
|
||||||
|
@ -26,42 +27,51 @@ sl_mem __sl_serialize_struct(void* struc, size_t size);
|
||||||
#define sl_serialize_struct(struc) __sl_serialize_struct((void *)&struc, sizeof(struc))
|
#define sl_serialize_struct(struc) __sl_serialize_struct((void *)&struc, sizeof(struc))
|
||||||
|
|
||||||
#ifdef SL_IMPLEMENTATION
|
#ifdef SL_IMPLEMENTATION
|
||||||
sl_mem sl_get_memory(sl_metadata* md) {
|
sl_mem sl_get_memory(sl_metadata *md)
|
||||||
|
{
|
||||||
return (sl_mem)((uintptr_t)md + MD_SZ);
|
return (sl_mem)((uintptr_t)md + MD_SZ);
|
||||||
}
|
}
|
||||||
|
|
||||||
sl_metadata* sl_get_metadata(sl_mem ptr) {
|
sl_metadata *sl_get_metadata(sl_mem ptr)
|
||||||
|
{
|
||||||
sl_metadata *md = (sl_metadata *)((uintptr_t)ptr - MD_SZ);
|
sl_metadata *md = (sl_metadata *)((uintptr_t)ptr - MD_SZ);
|
||||||
assert(md->magic == MD_MAGIC && "Metadata magic does not match.");
|
assert(md->magic == MD_MAGIC && "Metadata magic does not match.");
|
||||||
return md;
|
return md;
|
||||||
}
|
}
|
||||||
|
|
||||||
sl_mem sl_malloc(uint32_t size) {
|
sl_mem sl_malloc(uint32_t size)
|
||||||
|
{
|
||||||
sl_metadata *md = (sl_metadata *)malloc(size + MD_SZ);
|
sl_metadata *md = (sl_metadata *)malloc(size + MD_SZ);
|
||||||
md->magic = MD_MAGIC;
|
md->magic = MD_MAGIC;
|
||||||
md->size = size;
|
md->size = size;
|
||||||
return sl_get_memory(md);
|
return sl_get_memory(md);
|
||||||
}
|
}
|
||||||
|
|
||||||
void* sl_realloc(sl_mem ptr, uint32_t size) {
|
void *sl_realloc(sl_mem ptr, uint32_t size)
|
||||||
|
{
|
||||||
sl_metadata *md = (sl_metadata *)realloc(sl_get_metadata(ptr), size);
|
sl_metadata *md = (sl_metadata *)realloc(sl_get_metadata(ptr), size);
|
||||||
md->size = size;
|
md->size = size;
|
||||||
return sl_get_memory(md);
|
return sl_get_memory(md);
|
||||||
}
|
}
|
||||||
|
|
||||||
sl_mem __sl_serialize_struct(sl_mem struc, size_t size) {
|
sl_mem __sl_serialize_struct(sl_mem struc, size_t size)
|
||||||
|
{
|
||||||
sl_mem mem = NULL;
|
sl_mem mem = NULL;
|
||||||
size_t offset = 0;
|
size_t offset = 0;
|
||||||
|
|
||||||
for(int i = 0; i < size / sizeof(uintptr_t); i++) {
|
for (int i = 0; i < size / sizeof(uintptr_t); i++)
|
||||||
|
{
|
||||||
sl_mem ptr = *(sl_mem *)(struc + i * sizeof(void *));
|
sl_mem ptr = *(sl_mem *)(struc + i * sizeof(void *));
|
||||||
sl_metadata *md = sl_get_metadata(ptr);
|
sl_metadata *md = sl_get_metadata(ptr);
|
||||||
|
|
||||||
size_t full_size = md->size + MD_SZ;
|
size_t full_size = md->size + MD_SZ;
|
||||||
|
|
||||||
if(mem == NULL) {
|
if (mem == NULL)
|
||||||
|
{
|
||||||
mem = sl_malloc(full_size);
|
mem = sl_malloc(full_size);
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
sl_metadata *mem_md = sl_get_metadata(mem);
|
sl_metadata *mem_md = sl_get_metadata(mem);
|
||||||
mem = sl_realloc(mem, mem_md->size + full_size);
|
mem = sl_realloc(mem, mem_md->size + full_size);
|
||||||
}
|
}
|
||||||
|
@ -116,7 +126,8 @@ sl_mem __sl_serialize_struct(sl_mem struc, size_t size) {
|
||||||
#pragma region Vector
|
#pragma region Vector
|
||||||
|
|
||||||
#define sl_vec(type) \
|
#define sl_vec(type) \
|
||||||
struct { \
|
struct \
|
||||||
|
{ \
|
||||||
type *data; \
|
type *data; \
|
||||||
size_t size; \
|
size_t size; \
|
||||||
size_t capacity; \
|
size_t capacity; \
|
||||||
|
@ -125,8 +136,12 @@ sl_mem __sl_serialize_struct(sl_mem struc, size_t size) {
|
||||||
#define sl_vec_grow(vec) \
|
#define sl_vec_grow(vec) \
|
||||||
{ \
|
{ \
|
||||||
(vec).capacity = (vec).capacity * 2 + 1; \
|
(vec).capacity = (vec).capacity * 2 + 1; \
|
||||||
void *ptr = sl_realloc((vec).data, (vec).capacity * sizeof(*(vec).data)); \
|
void *ptr; \
|
||||||
if (ptr) \
|
if ((vec).data == NULL) \
|
||||||
|
ptr = sl_malloc((vec).capacity * sizeof(*(vec).data)); \
|
||||||
|
else \
|
||||||
|
ptr = sl_realloc((vec).data, (vec).capacity * sizeof(*(vec).data)); \
|
||||||
|
assert(ptr != NULL); \
|
||||||
(vec).data = ptr; \
|
(vec).data = ptr; \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -148,7 +163,8 @@ sl_mem __sl_serialize_struct(sl_mem struc, size_t size) {
|
||||||
|
|
||||||
#define sl_vec_pop(vec) \
|
#define sl_vec_pop(vec) \
|
||||||
{ \
|
{ \
|
||||||
if ((vec).size > 0) { \
|
if ((vec).size > 0) \
|
||||||
|
{ \
|
||||||
(vec).size--; \
|
(vec).size--; \
|
||||||
} \
|
} \
|
||||||
}
|
}
|
||||||
|
@ -206,18 +222,22 @@ typedef sl_vec(char) sl_string;
|
||||||
#pragma region Pointers
|
#pragma region Pointers
|
||||||
|
|
||||||
#define sl_ptr(type) \
|
#define sl_ptr(type) \
|
||||||
struct { \
|
struct \
|
||||||
|
{ \
|
||||||
type *ptr; \
|
type *ptr; \
|
||||||
int ref_count; \
|
int ref_count; \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define sl_ptr_make(raw_ptr) \
|
#define sl_ptr_make(raw_ptr) \
|
||||||
{ raw_ptr, 1 }
|
{ \
|
||||||
|
raw_ptr, 1 \
|
||||||
|
}
|
||||||
|
|
||||||
#define sl_ptr_release(smart_ptr) \
|
#define sl_ptr_release(smart_ptr) \
|
||||||
({ \
|
({ \
|
||||||
smart_ptr.ref_count--; \
|
smart_ptr.ref_count--; \
|
||||||
if (smart_ptr.ref_count <= 0) { \
|
if (smart_ptr.ref_count <= 0) \
|
||||||
|
{ \
|
||||||
free(smart_ptr.ptr); \
|
free(smart_ptr.ptr); \
|
||||||
} \
|
} \
|
||||||
})
|
})
|
||||||
|
@ -245,9 +265,11 @@ void sl_write_metadata(const char* filename, sl_metadata* m);
|
||||||
void sl_write_memory(const char *filename, void *ptr);
|
void sl_write_memory(const char *filename, void *ptr);
|
||||||
|
|
||||||
#ifdef SL_IMPLEMENTATION
|
#ifdef SL_IMPLEMENTATION
|
||||||
void sl_read_file(const char *filename, sl_string *buffer) {
|
void sl_read_file(const char *filename, sl_string *buffer)
|
||||||
|
{
|
||||||
FILE *file = fopen(filename, "r");
|
FILE *file = fopen(filename, "r");
|
||||||
if (!file) {
|
if (!file)
|
||||||
|
{
|
||||||
fprintf(stderr, "Error: could not open file %s\n", filename);
|
fprintf(stderr, "Error: could not open file %s\n", filename);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
@ -256,36 +278,43 @@ void sl_read_file(const char *filename, sl_string *buffer) {
|
||||||
size_t file_size = ftell(file);
|
size_t file_size = ftell(file);
|
||||||
fseek(file, 0, SEEK_SET);
|
fseek(file, 0, SEEK_SET);
|
||||||
|
|
||||||
for (size_t i = 0; i < file_size; i++) {
|
for (size_t i = 0; i < file_size; i++)
|
||||||
|
{
|
||||||
sl_vec_push(*buffer, fgetc(file));
|
sl_vec_push(*buffer, fgetc(file));
|
||||||
}
|
}
|
||||||
|
|
||||||
fclose(file);
|
fclose(file);
|
||||||
}
|
}
|
||||||
|
|
||||||
void sl_write_file(const char *filename, const sl_string *buffer) {
|
void sl_write_file(const char *filename, const sl_string *buffer)
|
||||||
|
{
|
||||||
FILE *file = fopen(filename, "w");
|
FILE *file = fopen(filename, "w");
|
||||||
if (!file) {
|
if (!file)
|
||||||
|
{
|
||||||
fprintf(stderr, "Error: could not open file %s\n", filename);
|
fprintf(stderr, "Error: could not open file %s\n", filename);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (size_t i = 0; i < buffer->size; i++) {
|
for (size_t i = 0; i < buffer->size; i++)
|
||||||
|
{
|
||||||
fputc(buffer->data[i], file);
|
fputc(buffer->data[i], file);
|
||||||
}
|
}
|
||||||
|
|
||||||
fclose(file);
|
fclose(file);
|
||||||
}
|
}
|
||||||
|
|
||||||
void sl_write_bytes(const char *filename, const uint8_t *data, size_t length) {
|
void sl_write_bytes(const char *filename, const uint8_t *data, size_t length)
|
||||||
|
{
|
||||||
FILE *file = fopen(filename, "wb");
|
FILE *file = fopen(filename, "wb");
|
||||||
if (!file) {
|
if (!file)
|
||||||
|
{
|
||||||
fprintf(stderr, "Error: could not open file %s\n", filename);
|
fprintf(stderr, "Error: could not open file %s\n", filename);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t written = fwrite(data, sizeof(uint8_t), length, file);
|
size_t written = fwrite(data, sizeof(uint8_t), length, file);
|
||||||
if (written != length) {
|
if (written != length)
|
||||||
|
{
|
||||||
fprintf(stderr, "Error: could not write all data to file %s\n", filename);
|
fprintf(stderr, "Error: could not write all data to file %s\n", filename);
|
||||||
fclose(file);
|
fclose(file);
|
||||||
exit(1);
|
exit(1);
|
||||||
|
@ -294,9 +323,11 @@ void sl_write_bytes(const char *filename, const uint8_t *data, size_t length) {
|
||||||
fclose(file);
|
fclose(file);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t* sl_read_bytes(const char *filename, size_t *length) {
|
uint8_t *sl_read_bytes(const char *filename, size_t *length)
|
||||||
|
{
|
||||||
FILE *file = fopen(filename, "rb");
|
FILE *file = fopen(filename, "rb");
|
||||||
if (!file) {
|
if (!file)
|
||||||
|
{
|
||||||
fprintf(stderr, "Error: could not open file %s\n", filename);
|
fprintf(stderr, "Error: could not open file %s\n", filename);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
@ -306,14 +337,16 @@ uint8_t* sl_read_bytes(const char *filename, size_t *length) {
|
||||||
fseek(file, 0, SEEK_SET);
|
fseek(file, 0, SEEK_SET);
|
||||||
|
|
||||||
uint8_t *data = (uint8_t *)sl_malloc(file_size);
|
uint8_t *data = (uint8_t *)sl_malloc(file_size);
|
||||||
if (!data) {
|
if (!data)
|
||||||
|
{
|
||||||
fprintf(stderr, "Error: could not allocate memory\n");
|
fprintf(stderr, "Error: could not allocate memory\n");
|
||||||
fclose(file);
|
fclose(file);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t read = fread(data, sizeof(uint8_t), file_size, file);
|
size_t read = fread(data, sizeof(uint8_t), file_size, file);
|
||||||
if (read != file_size) {
|
if (read != file_size)
|
||||||
|
{
|
||||||
fprintf(stderr, "Error: could not read all data from file %s\n", filename);
|
fprintf(stderr, "Error: could not read all data from file %s\n", filename);
|
||||||
free(data);
|
free(data);
|
||||||
fclose(file);
|
fclose(file);
|
||||||
|
@ -321,15 +354,18 @@ uint8_t* sl_read_bytes(const char *filename, size_t *length) {
|
||||||
}
|
}
|
||||||
|
|
||||||
fclose(file);
|
fclose(file);
|
||||||
if(length != NULL) *length = file_size;
|
if (length != NULL)
|
||||||
|
*length = file_size;
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
void sl_write_metadata(const char* filename, sl_metadata* m) {
|
void sl_write_metadata(const char *filename, sl_metadata *m)
|
||||||
|
{
|
||||||
sl_write_bytes(filename, sl_get_memory(m), m->size);
|
sl_write_bytes(filename, sl_get_memory(m), m->size);
|
||||||
}
|
}
|
||||||
|
|
||||||
void sl_write_memory(const char* filename, void* ptr) {
|
void sl_write_memory(const char *filename, void *ptr)
|
||||||
|
{
|
||||||
sl_write_metadata(filename, sl_get_metadata(ptr));
|
sl_write_metadata(filename, sl_get_metadata(ptr));
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Reference in a new issue