Compare commits

..

4 Commits

Author SHA1 Message Date
kilroy
5976d6b5a6 Added basic arena implementation w/ linear allocator 2025-11-30 22:37:18 -05:00
kilroy
767085b160 Started work on implementing Markdown parser 2025-11-29 21:19:07 -05:00
kilroy
2a7bd4bef7 Added feature to run after compiling in Makefile 2025-11-28 19:43:53 -05:00
kilroy
b222c27f46 Fixed tests 2025-11-28 19:41:37 -05:00
5 changed files with 112 additions and 2 deletions

View File

@@ -29,6 +29,10 @@ $(OBJS): dir
@mkdir -p $(BUILD_DIR)/$(@D)
@$(CC) $(CFLAGS) -o $(BUILD_DIR)/$@ -c $*.c
# Compiles and runs
run: dir $(OBJS) $(NAME)
@$(BIN_DIR)/$(NAME)
# Runs CUnit tests
# test: dir
# @$(CC) $(CFLAGS) -lcunit -o $(BIN_DIR)/$(NAME)_test $(TESTS_DIR)/*.c

27
include/arena.h Normal file
View 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
View 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;
}

View File

@@ -1,12 +1,17 @@
#include "../include/lenstr.h"
#include <ctype.h>
#include <stdbool.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
string a = StrLit("Hello, world!");
PrintStr(a);
FILE *mdFile = fopen("../tests/markdown_specification.md", "r");
return 0;
}

5
tests/other_src.c Normal file
View File

@@ -0,0 +1,5 @@
/* For adding all necessary source files.
* I could just do symlinks rather than this.
*/
#include "../src/lenstr.c"