#include "tlibc/errors.h" #include "tlibc/string/StringBuilder.h" #define ERRMSG_LENGTH 1024 Error* Error_create(const char* msg, bool is_msg_on_heap, ErrorCallPos p, u16 error_code_page, u32 error_code) { Error* e = (Error*)malloc(sizeof(Error)); e->msg = str_construct((char*)(void*)msg, strlen(msg), true); e->is_msg_on_heap = is_msg_on_heap; e->error_code_page = error_code_page; e->error_code = error_code; e->call_stack = List_alloc(ErrorCallPos, 16); Error_addCallPos(e, p); return e; } void Error_free(Error* e){ if(e->is_msg_on_heap) free(e->msg.data); free(e->call_stack.data); free(e); } void Error_addCallPos(Error* e, ErrorCallPos p){ List_push(&e->call_stack, ErrorCallPos, p); } str Error_toStr(Error* e){ u32 len = List_len(e->call_stack, ErrorCallPos); StringBuilder b = StringBuilder_alloc(e->msg.size + 80 * len); StringBuilder_append_str(&b, STR("Catched Error: ")); StringBuilder_append_str(&b, e->msg); for(u32 i = 0; i < len; i++){ ErrorCallPos* ep = (ErrorCallPos*)e->call_stack.data + i; StringBuilder_append_str(&b, STR("\n at ")); StringBuilder_append_cstr(&b, ep->file); StringBuilder_append_char(&b, ':'); StringBuilder_append_i64(&b, ep->line); StringBuilder_append_char(&b, ' '); StringBuilder_append_cstr(&b, ep->func); StringBuilder_append_str(&b, STR("()")); } return StringBuilder_getStr(&b); } void Error_printAndExit(Error* e){ str e_str = Error_toStr(e); printfe("\n"FMT_str"\n", e_str.size, e_str.data); free(e_str.data); Error_free(e); exit(111); } ErrorCodePage_define(TLIBC); ErrorCodePage_define(LIBC_ERRNO); static u16 _error_code_page_last = 0; void _ErrorCodePage_register(u16* error_code_page_ptr){ *error_code_page_ptr = ++_error_code_page_last; }