commit bc8504d072ea2b0e14d9e17100aefc59bdfc89c4
parent aaae8317a67be4e122c123de6fa7849ea7bcc257
Author: citbl <citbl@citbl.org>
Date: Wed, 13 May 2026 20:50:49 +1000
arr impl
Diffstat:
2 files changed, 28 insertions(+), 13 deletions(-)
diff --git a/src/array.h b/src/array.h
@@ -0,0 +1,26 @@
+#pragma once
+// array_push
+#define ARRAY_PUSH(dest, len, cap, item) \
+ do { \
+ size_t arr_newcap, arr_itemsize; \
+ void* arr_newptr; \
+ if ((len) >= (cap)) { \
+ arr_newcap = (cap) == 0 ? 256 : (cap) * 2; \
+ arr_itemsize = sizeof(*(dest)); \
+ if (arr_newcap <= (cap) || arr_newcap > SIZE_MAX / arr_itemsize) { \
+ fprintf(stderr, "array: capacity overflow (cap=%zu)\n", (size_t)(cap)); \
+ exit(1); \
+ } \
+ \
+ arr_newptr = realloc((dest), arr_newcap * arr_itemsize); \
+ if (!arr_newptr) { \
+ fprintf(stderr, "array: could not reallocate\n"); \
+ exit(1); \
+ } \
+ (dest) = arr_newptr; \
+ (cap) = arr_newcap; \
+ } \
+ \
+ (dest)[(len)++] = (item); \
+ } while (0)
+
diff --git a/src/lexer.c b/src/lexer.c
@@ -3,22 +3,11 @@
#include <ctype.h>
#include "lexer.h"
+#include "array.h"
static void add_token(Lexer* lex, Token t)
{
- size_t new_cap;
- Token* p;
-
- if (lex->len >= lex->cap) {
- new_cap = lex->cap == 0 ? 256 : lex->cap * 2;
- check(new_cap <= lex->cap || new_cap > SIZE_MAX / sizeof(Token), "token capacity overflow\n");
- p = realloc(lex->tokens, new_cap * sizeof(Token));
- check(!p, "token reallocation failed\n");
- lex->tokens = p;
- lex->cap = new_cap;
- }
-
- lex->tokens[lex->len++] = t;
+ ARRAY_PUSH(lex->tokens, lex->len, lex->cap, t);
}
void print_tokens(Lexer* lex)