/* Copyright (c) 2024 Freya Murphy */ #ifndef __MERROR_H__ #define __MERROR_H__ #include #include /* Error codes */ #define M_SUCCESS 0 #define M_ERROR 1 #define M_EOF 2 #define __DEBUG 1 #define __WARNING 2 #define __ERROR 3 #define __BUG 4 __attribute__((format(printf, 4, 5))) void __log_impl_pos(int line, int column, int type, const char *format, ...); void __log_impl(int type, const char *format, ...); #define DEBUG(format, ...) \ __log_impl(__DEBUG, format, ##__VA_ARGS__) #define WARNING(format, ...) \ __log_impl(__WARNING, format, ##__VA_ARGS__) #define BUG(format, ...) \ __log_impl(__BUG, format, ##__VA_ARGS__) #define ERROR(format, ...) \ __log_impl(__ERROR, format, ##__VA_ARGS__) #define DEBUG_POS(pos, format, ...) \ __log_impl_pos(pos.y, pos.x, __DEBUG, format, ##__VA_ARGS__) #define WARNING_POS(pos, format, ...) \ __log_impl_pos(pos.y, pos.x, __WARNING, format, ##__VA_ARGS__) #define ERROR_POS(pos, format, ...) \ __log_impl_pos(pos.y, pos.x, __ERROR, format, ##__VA_ARGS__) #define PERROR(format, ...) \ __log_impl(__ERROR, format ": %s", ##__VA_ARGS__, (strerror(errno))) #endif /* __MERROR_H__ */