sic

The sic programming language, compiler and tools (WIP)
Log | Files | Refs

commit bc8504d072ea2b0e14d9e17100aefc59bdfc89c4
parent aaae8317a67be4e122c123de6fa7849ea7bcc257
Author: citbl <citbl@citbl.org>
Date:   Wed, 13 May 2026 20:50:49 +1000

arr impl

Diffstat:
Asrc/array.h | 26++++++++++++++++++++++++++
Msrc/lexer.c | 15++-------------
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)