implemented Error struct
This commit is contained in:
53
src/errors.c
53
src/errors.c
@@ -1,10 +1,53 @@
|
||||
#include "tlibc/errors.h"
|
||||
#include "tlibc/string/StringBuilder.h"
|
||||
|
||||
#define ERRMSG_LENGTH 1024
|
||||
|
||||
char* _genErrorMessage(cstr file, i32 line, cstr func, char* msg, bool free_msg){
|
||||
char* result = sprintf_malloc(1024, "[%s:%i] %s() throwed error: %s", file, line, func, msg);
|
||||
if(free_msg)
|
||||
free(msg);
|
||||
return result;
|
||||
Error* Error_create(const char* msg, bool is_msg_on_heap, ErrorCallPos){
|
||||
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->call_stack = List_alloc(ErrorCallPos, 1);
|
||||
return e;
|
||||
}
|
||||
|
||||
void Error_destroy(Error* e){
|
||||
if(e->is_msg_on_heap)
|
||||
free(e->msg.data);
|
||||
free(e->call_stack.data);
|
||||
}
|
||||
|
||||
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("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_str(&b, ep->file);
|
||||
StringBuilder_append_char(&b, ':');
|
||||
StringBuilder_append_i64(&b, ep->line);
|
||||
StringBuilder_append_char(&b, ' ');
|
||||
StringBuilder_append_str(&b, ep->func);
|
||||
StringBuilder_append_str(&b, STR("()\n"));
|
||||
}
|
||||
|
||||
return StringBuilder_getStr(&b);
|
||||
}
|
||||
|
||||
|
||||
void Error_printAndExit(Error* e){
|
||||
Error_addCallPos(e, ErrorCallPos_here());\
|
||||
str e_str = Error_toStr(e);
|
||||
printfe("%s\n", e_str.data);
|
||||
free(e_str.data);
|
||||
Error_destroy(e);
|
||||
free(e);
|
||||
exit(111);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user