From a486ed62f4c4bf14214309cff55c43be845eefc7 Mon Sep 17 00:00:00 2001 From: LaEntropiaa Date: Thu, 26 Mar 2026 10:01:17 -0600 Subject: [PATCH] Rework: moved ASTNodeArray logic to it's own c file --- include/lexer.h | 1 - src/ASTNodeArray.c | 108 +++++++++++++++++++++++++++++++++++++++++++++ src/lexer.c | 102 +----------------------------------------- 3 files changed, 109 insertions(+), 102 deletions(-) create mode 100644 src/ASTNodeArray.c diff --git a/include/lexer.h b/include/lexer.h index 1fa8dfb..9ca60c0 100644 --- a/include/lexer.h +++ b/include/lexer.h @@ -59,7 +59,6 @@ typedef struct { ASTNode *data; } ASTNodeArray; -// Basic array functionality ASTNodeArray ASTNodeArray_init(size_t size); void ASTNodeArray_free(ASTNodeArray *arr); ASTNodeArrayErr ASTNodeArray_push(ASTNodeArray *arr, ASTNode node); diff --git a/src/ASTNodeArray.c b/src/ASTNodeArray.c new file mode 100644 index 0000000..a9f2053 --- /dev/null +++ b/src/ASTNodeArray.c @@ -0,0 +1,108 @@ +#include "lexer.h" +#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 (arr == NULL) { + return ARRAY_NULL; + } + + 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 == NULL) { + return ARRAY_NULL; + } + + 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 = arr->len + 1; + + return ARRAY_OK; +} + +ASTNodeArrayErr ASTNodeArray_pop(ASTNodeArray *arr, size_t index, ASTNode *out) { + if (arr == NULL) { + return ARRAY_NULL; + } + + if (arr->len == 0) { + return ARRAY_EMPTY; + } + + if (index >= arr->len) { + return ARRAY_OUT_OF_BOUNDS; + } + + if (arr->cap / 4 > arr->len) { + 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; + } + + 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; +} + +size_t ASTNodeArray_len(ASTNodeArray *arr) { + if (arr == NULL) { + return 0; + } + return arr->len; +} diff --git a/src/lexer.c b/src/lexer.c index 4847e20..7febdfc 100644 --- a/src/lexer.c +++ b/src/lexer.c @@ -6,111 +6,11 @@ #include #include -#define NODE_ARRAY_DEFAULT_SIZE 64 -// Helps state machine for the lexer :) typedef enum { WAIT_FOR_NUMBER, - WAIT_FOR_OPERATOR, + 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 (arr == NULL) { - return ARRAY_NULL; - } - - 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 == NULL) { - return ARRAY_NULL; - } - - 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 = arr->len + 1; - - return ARRAY_OK; -} - -ASTNodeArrayErr ASTNodeArray_pop(ASTNodeArray *arr, size_t index, ASTNode *out) { - if (arr == NULL) { - return ARRAY_NULL; - } - - if (arr->len == 0) { - return ARRAY_EMPTY; - } - - if (index >= arr->len) { - return ARRAY_OUT_OF_BOUNDS; - } - - if (arr->cap / 4 > arr->len) { - 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; - } - - 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; -} - -size_t ASTNodeArray_len(ASTNodeArray *arr) { - if (arr == NULL) { - return 0; - } - return arr->len; -} LexerErr tokenize(const char *input, ASTNodeArray *out) { size_t offset = 0;