67 lines
1.8 KiB
C
Executable File
67 lines
1.8 KiB
C
Executable File
#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;
|
|
}
|