Compare commits
2 Commits
2a7bd4bef7
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5976d6b5a6 | ||
|
|
767085b160 |
27
include/arena.h
Normal file
27
include/arena.h
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
#ifndef ARENA_H
|
||||||
|
#define ARENA_H
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint8_t *buffer;
|
||||||
|
size_t capacity;
|
||||||
|
size_t offset;
|
||||||
|
} Arena;
|
||||||
|
|
||||||
|
Arena *ArenaInit(size_t capacity);
|
||||||
|
void ArenaDestroy(Arena *arena);
|
||||||
|
|
||||||
|
void *ArenaAlloc(Arena *arena, size_t size);
|
||||||
|
void *ArenaAllocZero(Arena *arena, size_t size);
|
||||||
|
|
||||||
|
void ArenaFree(Arena *arena, size_t size);
|
||||||
|
void ArenaFreeAndNullify(Arena *arena, size_t size, void **ptrAddress);
|
||||||
|
|
||||||
|
// Fundamentally returns how many bytes have been allocated
|
||||||
|
size_t ArenaGetOffset(Arena *arena);
|
||||||
|
|
||||||
|
void ArenaSetOffsetBack(Arena *arena, size_t offset);
|
||||||
|
void ArenaClear(Arena *arena);
|
||||||
|
|
||||||
|
#endif // ARENA_H
|
||||||
69
src/arena.c
Normal file
69
src/arena.c
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
#include "../include/arena.h"
|
||||||
|
|
||||||
|
//#include <string.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
Arena *ArenaInit(size_t capacity)
|
||||||
|
{
|
||||||
|
Arena arena;
|
||||||
|
arena.buffer = malloc(capacity);
|
||||||
|
arena.capacity = capacity;
|
||||||
|
arena.offset = 0;
|
||||||
|
return &arena;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ArenaDestroy(Arena *arena)
|
||||||
|
{
|
||||||
|
free(arena->buffer);
|
||||||
|
arena->buffer = NULL;
|
||||||
|
arena->capacity = 0;
|
||||||
|
arena->offset = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *ArenaAlloc(Arena *arena, size_t size)
|
||||||
|
{
|
||||||
|
void *ptr = arena->buffer + arena->offset;
|
||||||
|
arena->offset += size;
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
void *ArenaAllocZero(Arena *arena, size_t size)
|
||||||
|
{
|
||||||
|
void *ptr = arena->buffer + arena->offset;
|
||||||
|
arena->offset += size;
|
||||||
|
// should I just use memset?
|
||||||
|
for (void *i = ptr; i != ptr + size; ++i) {
|
||||||
|
*(uint8_t*)i = 0;
|
||||||
|
}
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ArenaFree(Arena *arena, size_t size)
|
||||||
|
{
|
||||||
|
arena->offset -= size;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Frees the memory in the arena *and* sets the pointer to null
|
||||||
|
void ArenaFreeAndNullify(Arena *arena, size_t size, void **ptrAddress)
|
||||||
|
{
|
||||||
|
arena->offset -= size;
|
||||||
|
*ptrAddress = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fundamentally returns how many bytes have been allocated
|
||||||
|
size_t ArenaGetOffset(Arena *arena)
|
||||||
|
{
|
||||||
|
return arena->offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ArenaSetOffsetBack(Arena *arena, size_t offset)
|
||||||
|
{
|
||||||
|
if (offset > arena->offset) {
|
||||||
|
*(int*)0 = 0; // Should crash here
|
||||||
|
}
|
||||||
|
arena->offset = offset;
|
||||||
|
}
|
||||||
|
void ArenaClear(Arena *arena)
|
||||||
|
{
|
||||||
|
arena->offset = 0;
|
||||||
|
}
|
||||||
@@ -1,12 +1,17 @@
|
|||||||
#include "../include/lenstr.h"
|
#include "../include/lenstr.h"
|
||||||
|
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <stdbool.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
string a = StrLit("Hello, world!");
|
FILE *mdFile = fopen("../tests/markdown_specification.md", "r");
|
||||||
PrintStr(a);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user