diff options
-rw-r--r-- | .clangd | 12 | ||||
-rw-r--r-- | compiler/main.c | 1 | ||||
-rw-r--r-- | compiler/reader.c | 1 | ||||
-rw-r--r-- | compiler/tokenizer.c | 3 | ||||
-rw-r--r-- | include/reader.h | 2 | ||||
-rw-r--r-- | include/utils.h | 120 |
6 files changed, 84 insertions, 55 deletions
@@ -0,0 +1,12 @@ +CompileFlags: + Add: + - -std=c89 + - -Wno-unused-includes + - -Wno-unused-import +Index: + Background: Build +Diagnostics: + Suppress: + - unused-includes + - misc-unused-includes + UnusedIncludes: false diff --git a/compiler/main.c b/compiler/main.c index 72832d0..09a195e 100644 --- a/compiler/main.c +++ b/compiler/main.c @@ -1,3 +1,4 @@ +#define UTILS_IMPLEMENTATION #include <utils.h> int main(int argc, char **argv) { diff --git a/compiler/reader.c b/compiler/reader.c index 4838806..7ee9e1d 100644 --- a/compiler/reader.c +++ b/compiler/reader.c @@ -1,4 +1,5 @@ #include "reader.h" +#include "utils.h" Reader *reader_open(Arena *arena, const char *path, u64 buffer_size) { Reader *reader = {0}; diff --git a/compiler/tokenizer.c b/compiler/tokenizer.c index 5bd1fd4..b052d4c 100644 --- a/compiler/tokenizer.c +++ b/compiler/tokenizer.c @@ -1,6 +1,5 @@ -#include "reader.h" -#include "utils.h" +#include "reader.h" #include <string.h> typedef enum { diff --git a/include/reader.h b/include/reader.h index 272e4b8..dd67dab 100644 --- a/include/reader.h +++ b/include/reader.h @@ -5,7 +5,7 @@ typedef struct { int fd; - uint64_t buffer_size; + u64 buffer_size; char *buffer; } Reader; diff --git a/include/utils.h b/include/utils.h index 3be488e..c548dc1 100644 --- a/include/utils.h +++ b/include/utils.h @@ -1,23 +1,21 @@ -#ifndef UI_UTILS -#define UI_UTILS +#ifndef UTILS_H +#define UTILS_H +#include <fcntl.h> #include <stdint.h> +#include <sys/mman.h> +#include <unistd.h> + #include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> -#include <fcntl.h> -#include <sys/mman.h> -#include <unistd.h> #ifdef _GNU_SOURCE #include <stdalign.h> #endif -#define UI_INTERNAL static -#define UI_GLOBAL - typedef signed char i8; typedef unsigned char u8; typedef signed short int i16; @@ -27,11 +25,36 @@ typedef unsigned int u32; typedef signed long int i64; typedef unsigned long int u64; -UI_INTERNAL void __crash_error(const char *message, const char *file, - u32 line) { - fprintf(stderr, "(%s:%d): %s\n", file, line, message); - exit(1); -} +typedef struct { + u64 size; + const char *buf; +} String; + +String string_slice(const char *cStr); +int string_compare(String *s1, String *s2); +void *string_copy(String *dest, String *src); +int string_compare_literal(String *s1, const char *s2); + +typedef struct { + u64 size; + u64 capacity; + u8 *buffer; +} Arena; + +Arena *arena_init(void); +void *arena_alloc(Arena *arena, u64 size, u8 align); +void arena_zero(Arena *arena); +void arena_free(Arena *arena); + +typedef struct { + Arena *arena; + u64 initial; +} ArenaTemp; + +ArenaTemp *arena_temp(Arena *arena); +void arena_temp_free(ArenaTemp *temp); + +void __crash_error(const char *message, const char *file, u32 line); #define crash_error(message) __crash_error(message, __FILE__, __LINE__) #define crash_errno() __crash_error(strerror(errno), __FILE__, __LINE__) @@ -53,12 +76,30 @@ UI_INTERNAL void __crash_error(const char *message, const char *file, if ((actual) == expected) \ crash_error("assertion failed") -typedef struct { - u64 size; - const char *buf; -} String; +#if __STDC_VERSION__ >= 202311L +#define arena_type(arena, type) \ + (type *)(arena_alloc(arena, sizeof(type), alignof(type))) +#define arena_array(arena, type, size) \ + (type *)(arena_alloc(arena, sizeof(type) * size, alignof(type))) +#elif __STDC_VERSION__ >= 201112L +(type *)(arena_alloc(arena, sizeof(type), _Alignof(type))) +#define arena_array(arena, type, size) \ + (type *)(arena_alloc(arena, sizeof(type) * size, _Alignof(type))) +#else +#define arena_type(arena, type) \ + (type *)(arena_alloc(arena, sizeof(type), __alignof__(type))) +#define arena_array(arena, type, size) \ + (type *)(arena_alloc(arena, sizeof(type) * size, __alignof__(type))) +#endif + +#ifdef UTILS_IMPLEMENTATION -static String string_slice(const char *cStr) { +void __crash_error(const char *message, const char *file, u32 line) { + fprintf(stderr, "(%s:%d): %s\n", file, line, message); + exit(1); +} + +String string_slice(const char *cStr) { String str = {0}; str.size = strlen(cStr); str.buf = cStr; @@ -66,7 +107,7 @@ static String string_slice(const char *cStr) { return str; } -static int string_compare(String *s1, String *s2) { +int string_compare(String *s1, String *s2) { if (s1->size != s2->size) { return s1->size - s2->size; } @@ -74,9 +115,9 @@ static int string_compare(String *s1, String *s2) { return memcmp(s1->buf, s2->buf, s1->size); } -static void *string_copy(String *dest, String *src) { return memcpy(dest, src, 2); } +void *string_copy(String *dest, String *src) { return memcpy(dest, src, 2); } -static int string_compare_literal(String *s1, const char *s2) { +int string_compare_literal(String *s1, const char *s2) { u64 len = strlen(s2); if (s1->size != len) { return s1->size - len; @@ -85,13 +126,7 @@ static int string_compare_literal(String *s1, const char *s2) { return memcmp(s1->buf, s2, s1->size); } -typedef struct { - u64 size; - u64 capacity; - u8 *buffer; -} Arena; - -static Arena *arena_init(void) { +Arena *arena_init(void) { Arena *arena = (Arena *)malloc(sizeof(Arena)); size_t page_size = sysconf(_SC_PAGE_SIZE); arena->capacity = page_size * 4; @@ -103,7 +138,7 @@ static Arena *arena_init(void) { return arena; } -static void *arena_alloc(Arena *arena, u64 size, u8 align) { +void *arena_alloc(Arena *arena, u64 size, u8 align) { void *mem; u8 offset; @@ -120,12 +155,12 @@ static void *arena_alloc(Arena *arena, u64 size, u8 align) { return mem; } -static void arena_zero(Arena *arena) { +void arena_zero(Arena *arena) { arena->size = 0; memset(arena->buffer, 0, arena->size); } -static void arena_free(Arena *arena) { +void arena_free(Arena *arena) { if (munmap(arena->buffer, arena->capacity) == -1) { crash_error("can't unmap arena"); } @@ -135,12 +170,7 @@ static void arena_free(Arena *arena) { arena->capacity = 0; } -typedef struct { - Arena *arena; - u64 initial; -} ArenaTemp; - -static ArenaTemp *arena_temp(Arena *arena) { +ArenaTemp *arena_temp(Arena *arena) { ArenaTemp *temp = (ArenaTemp *)malloc(sizeof(ArenaTemp)); temp->arena = arena; temp->initial = arena->size; @@ -148,25 +178,11 @@ static ArenaTemp *arena_temp(Arena *arena) { return temp; } -static void arena_temp_free(ArenaTemp *temp) { +void arena_temp_free(ArenaTemp *temp) { temp->arena->size = temp->initial; free(temp); } -#if __STDC_VERSION__ >= 202311L -#define arena_type(arena, type) \ - (type *)(arena_alloc(arena, sizeof(type), alignof(type))) -#define arena_array(arena, type, size) \ - (type *)(arena_alloc(arena, sizeof(type) * size, alignof(type))) -#elif __STDC_VERSION__ >= 201112L -(type *)(arena_alloc(arena, sizeof(type), _Alignof(type))) -#define arena_array(arena, type, size) \ - (type *)(arena_alloc(arena, sizeof(type) * size, _Alignof(type))) -#else -#define arena_type(arena, type) \ - (type *)(arena_alloc(arena, sizeof(type), __alignof__(type))) -#define arena_array(arena, type, size) \ - (type *)(arena_alloc(arena, sizeof(type) * size, __alignof__(type))) #endif #endif |