1 #include <kiba/core/error.h>
5 #define KB_MAX_ERRORS 8
6 #define KB_MAX_ERROR_DATA KB_KILOBYTE(KB_MAX_ERRORS)
9 usize next_error_idx = 0;
10 kb_error error_chain[KB_MAX_ERRORS] = {0};
11 usize next_data_idx = 0;
12 u8 error_data[KB_MAX_ERROR_DATA] = {0};
14 void kb_errors_reset(
void) {
20 void kb_errors_new(
enum kb_error_code code,
const char *file,
const char *
function, i32 line) {
22 error_chain[next_error_idx++] = (
kb_error){
30 void kb_errors_append(
enum kb_error_code code,
const char *file,
const char *
function, i32 line) {
31 if (next_error_idx == KB_MAX_ERRORS) {
32 KB_WARN(
"error chain has reached its maximum length, cannot append error");
35 error_chain[next_error_idx] = (
kb_error){
40 .data_start = next_data_idx,
41 .data_end = next_data_idx,
42 .next = next_error_idx ? error_chain + next_error_idx - 1 :
KB_NULL,
47 const void *kb_error_add_data(
const void *src, usize size) {
48 if (!next_error_idx) {
49 KB_WARN(
"no error to append data to, ignoring this call");
52 if (next_data_idx + size > KB_MAX_ERROR_DATA) {
53 KB_WARN(
"data to append to error would exceed buffer, ignoring this call");
57 next_error_idx += size;
58 error_chain[next_error_idx - 1].data_end = next_data_idx;
62 kb_error *kb_errors_last_error(
void) {
63 if (!next_error_idx) {
66 return error_chain + next_error_idx - 1;
70 void *kb_error_get_data(
kb_error *error,
void *dst, usize size) {
71 if (error->data_start + size > error->data_end) {
72 KB_WARN(
"attempted to read more data for error than was initially added");
75 memory_copy(dst, error_data + error->data_start, size);
76 error->data_start += size;
void * memory_copy(void *dst, const void *src, usize size)
Copy memory.
void * memory_zero(void *mem, usize size)
Zero out memory.
Lightweight layer between platform and other engine components to enable tracing/monitoring.
#define KB_NULL
Value of an invalid ptr (nullptr).
#define KB_WARN(...)
Log entry with warn log level.