#include "error.h" #include "arena.h" #include #include #include #include void error_init(ErrorList* list, Arena* a) { list->capacity = 64; list->errors = arena_alloc(a, list->capacity * sizeof(ErrorInfo)); list->count = 0; list->arena = a; if (!list->errors) list->capacity = 0; } void error_add(ErrorList* list, const char* filename, int line, int col, const char* fmt, ...) { if (!list->errors) return; if (list->count >= list->capacity) { size_t new_cap = list->capacity + 64; ErrorInfo* new_errs = arena_alloc(list->arena, new_cap * sizeof(ErrorInfo)); if (!new_errs) return; memcpy(new_errs, list->errors, list->capacity * sizeof(ErrorInfo)); list->errors = new_errs; list->capacity = new_cap; } char buf[512]; va_list args; va_start(args, fmt); int n = vsnprintf(buf, sizeof(buf), fmt, args); va_end(args); if (n < 0) return; char* msg = arena_strdup(list->arena, buf); char* fname = arena_strdup(list->arena, filename); if (!msg || !fname) return; list->errors[list->count++] = (ErrorInfo){ .message = msg, .filename = fname, .line = line, .col = col, }; } void error_print(const ErrorList* list) { for (size_t i = 0; i < list->count; i++) { const ErrorInfo* e = &list->errors[i]; fprintf(stderr, "\033[1;31m错误:\033[0m %s:%d:%d: %s\n", e->filename, e->line, e->col, e->message); } }