#pragma once #include "src/kernel/stream.h" #include "src/lib/string.h" extern stream_t *kernel_log; #ifndef LOG_LEVEL #define LOG_LEVEL 1 #endif #define LOG_LEVEL_INFO 1 #define LOG_LEVEL_STEP 2 #define LOG_LEVEL_DATA 3 #define LOG_LEVEL_TRACE 4 static uint64_t print_size; static char print_buffer[512]; #define PRINT(stream, fmt, ...) \ print_size = string_format(fmt, sizeof(print_buffer) - 1, print_buffer, ##__VA_ARGS__); \ stream->write(stream, print_buffer, print_size); #define PRINT_LN(stream, fmt, ...) \ print_size = string_format(fmt, sizeof(print_buffer) - 1, print_buffer, ##__VA_ARGS__); \ stream->write(stream, __func__, string_length(__func__)); \ stream->write(stream, ": ", 2); \ stream->write(stream, print_buffer, print_size); \ stream->write(stream, "\n", 1); #define PRINT_VAL(stream, v, f) PRINT_LN(#v = f, v) #define LOG(level, fmt, ...) \ if (LOG_LEVEL >= level) { \ PRINT(kernel_log, fmt, ##__VA_ARGS__) \ } #define LOG_LN(level, fmt, ...) \ if (LOG_LEVEL >= level) { \ PRINT_LN(kernel_log, fmt, ##__VA_ARGS__) \ } #define LOG_VAL(level, v, f) LOG_LN(level, #v "=" f, v) #define LOG_INFO(fmt, ...) LOG(LOG_LEVEL_INFO, fmt, ##__VA_ARGS__) #define LOG_STEP(fmt, ...) LOG(LOG_LEVEL_STEP, fmt, ##__VA_ARGS__) #define LOG_DATA(fmt, ...) LOG(LOG_LEVEL_DATA, fmt, ##__VA_ARGS__) #define LOG_TRACE(fmt, ...) LOG(LOG_LEVEL_TRACE, fmt, ##__VA_ARGS__) #define LOG_LN_INFO(fmt, ...) LOG_LN(LOG_LEVEL_INFO, fmt, ##__VA_ARGS__) #define LOG_LN_STEP(fmt, ...) LOG_LN(LOG_LEVEL_STEP, fmt, ##__VA_ARGS__) #define LOG_LN_DATA(fmt, ...) LOG_LN(LOG_LEVEL_DATA, fmt, ##__VA_ARGS__) #define LOG_LN_TRACE(fmt, ...) LOG_LN(LOG_LEVEL_TRACE, fmt, ##__VA_ARGS__) #define LOG_VAL_INFO(v, f) LOG_VAL(LOG_LEVEL_INFO, v, f) #define LOG_VAL_STEP(v, f) LOG_VAL(LOG_LEVEL_STEP, v, f) #define LOG_VAL_DATA(v, f) LOG_VAL(LOG_LEVEL_DATA, v, f) #define LOG_VAL_TRACE(v, f) LOG_VAL(LOG_LEVEL_TRACE, v, f) void log_init(stream_t *log);