From 3126be5782627b641f1f5bbc4668a7dc33437d14 Mon Sep 17 00:00:00 2001 From: LaEntropiaa Date: Wed, 4 Mar 2026 19:30:56 -0600 Subject: [PATCH] Added functionality for the basic array functionality, i'm going to make tests even thoug they are tedius as fuck, i'm way more interested in making tests for the lexer itself --- include/lexer.h | 1 + src/lexer.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+) diff --git a/include/lexer.h b/include/lexer.h index 2056711..30f01fc 100644 --- a/include/lexer.h +++ b/include/lexer.h @@ -23,6 +23,7 @@ typedef enum { ARRAY_EMPTY, ARRAY_OUT_OF_BOUNDS, ARRAY_NULL_ARG, + ARRAY_ALLOC, } ASTNodeArrayErr; typedef enum { diff --git a/src/lexer.c b/src/lexer.c index 7ab73c9..3f6f86b 100644 --- a/src/lexer.c +++ b/src/lexer.c @@ -1,8 +1,80 @@ #include "lexer.h" +#include +#include +#define NODE_ARRAY_DEFAULT_SIZE 64 // Helps state machine for the lexer :) typedef enum { WAIT_FOR_NUMBER, WAIT_FOR_OPERATOR, } LexerState; +ASTNodeArray ASTNodeArray_init(size_t size) { + ASTNodeArray new; + new.len = 0; // if 0 then use default + new.cap = size == 0 ? NODE_ARRAY_DEFAULT_SIZE : size; + new.data = malloc(new.cap * sizeof(ASTNode)); + return new; +} + +void ASTNodeArray_free(ASTNodeArray *arr) { + free(arr->data); + arr->cap = 0; + arr->len = 0; +} + +ASTNodeArrayErr ASTNodeArray_get(const ASTNodeArray arr, size_t index, ASTNode *out) { + if (out == NULL) { + return ARRAY_NULL_ARG; + } + + if (arr.len == 0) { + return ARRAY_EMPTY; + } + + if (index >= arr.len) { + return ARRAY_OUT_OF_BOUNDS; + } + + *out = arr.data[index]; + + return ARRAY_OK; +} + +ASTNodeArrayErr ASTNodeArray_push(ASTNodeArray arr, ASTNode node) { + if (arr.len >= arr.cap) { + size_t new_cap = arr.cap * 2; + ASTNode *tmp = realloc(arr.data, new_cap * sizeof(ASTNode)); + if (tmp == NULL) { + return ARRAY_ALLOC; + } + arr.data = tmp; + arr.cap = new_cap; + } + + arr.data[arr.len] = node; + arr.len += 1; + + return ARRAY_OK; +} + +ASTNodeArrayErr ASTNodeArray_pop(ASTNodeArray arr, size_t index, ASTNode *out) { + if (arr.len == 0) { + return ARRAY_EMPTY; + } + + if (index >= arr.len) { + return ARRAY_OUT_OF_BOUNDS; + } + + if (out != NULL) { + ASTNode node_to_delete = arr.data[index]; + *out = node_to_delete; + } + + for (size_t i = index; i < arr.len - 1; i++) { + arr.data[index] = arr.data[index + 1]; + } + + return ARRAY_OK; +}