#pragma once #include #include // ANSII colors #define BLK "\x1b[30m" #define RED "\x1b[31m" #define GRN "\x1b[32m" #define YLW "\x1b[33m" #define BLU "\x1b[34m" #define VIO "\x1b[35m" #define CYN "\x1b[36m" #define WHT "\x1b[37m" // ANSII "Bright" colors #define BBLK "\x1b[90m" #define BRED "\x1b[91m" #define BGRN "\x1b[92m" #define BYLW "\x1b[93m" #define BBLU "\x1b[94m" #define BVIO "\x1b[95m" #define BCYN "\x1b[96m" #define BWHT "\x1b[97m" // Reset sequence #define NL "\n" #define RST "\x1b[0m" #define NLRST "\n\x1b[0m" // Naming convention: // L[ |V|F|VF|P|PV] // L stands for Log // log-level is: DEBUG, INFO, WARN, ERR, CRIT // V stands for Verbose: include information about location in source // F stands for format: needed to have printf-style formatting // P stands for perror #if defined(LOG_DEBUG) || defined(DEBUG) || defined(DBG) || defined(Debug) || defined(debug) // Log debug # define LDEBUG(msg) fputs("[DEBUG] " msg NL, stderr) # define LDEBUGV(msg) fprintf(stderr, "[DEBUG %s:%i@%s] " msg NL, __FILE__, __LINE__, __func__) # define LDEBUGF(fmt, ...) fprintf(stderr, "[DEBUG] " fmt NL, __VA_ARGS__) # define LDEBUGVF(fmt, ...) fprintf(stderr, "[DEBUG %s:%i@%s] " fmt NL, __FILE__, __LINE__, __func__, __VA_ARGS__) #else # define LDEBUG(msg) # define LDEBUGV(msg) # define LDEBUGF(fmt, ...) # define LDEBUGVF(fmt, ...) #endif // LOG_DEBUG // Log info #define LINFO(msg) fputs(WHT "[INFO] " msg NLRST, stderr) #define LINFOV(msg) fprintf(stderr, WHT "[INFO %s:%i@%s] " msg NLRST, __FILE__, __LINE__, __func__) #define LINFOF(fmt, ...) fprintf(stderr, WHT "[INFO] " fmt NLRST , __VA_ARGS__) #define LINFOVF(fmt, ...) fprintf(stderr, WHT "[INFO %s:%i@%s] " fmt NLRST, __FILE__, __LINE__, __func__, __VA_ARGS__) // Log warning #define LWARN(msg) fputs(YLW "[WARNING] " msg NLRST, stderr) #define LWARNV(msg) fprintf(stderr, YLW "[WARNING %s:%i@%s] " msg NLRST, __FILE__, __LINE__, __func__) #define LWARNF(fmt, ...) fprintf(stderr, YLW "[WARNING] " fmt NLRST, __VA_ARGS__) #define LWARNVF(fmt, ...) fprintf(stderr, YLW "[WARNING %s:%i@%s] " fmt NLRST, __FILE__, __LINE__, __func__, __VA_ARGS__) #define LWARNP(msg) do { fputs(YLW "[WARNING]", stderr); perror(msg); fputs(RST, stderr); } while (0) #define LWARNPV(msg) do { fprintf(stderr, YLW "[WARNING %s:%i@%s] ", __FILE__, __LINE__, __func__); perror(msg); fputs(RST, stderr); } while(0) // Log error #define LERR(msg) fputs(RED "[ERROR] " msg NLRST, stderr) #define LERRV(msg) fprintf(stderr, RED "[ERROR %s:%i@%s] " msg NLRST, __FILE__, __LINE__, __func__) #define LERRF(fmt, ...) fprintf(stderr, RED "[ERROR] " fmt NLRST, __VA_ARGS__) #define LERRVF(fmt, ...) fprintf(stderr, RED "[ERROR %s:%i@%s] " fmt NLRST, __FILE__, __LINE__, __func__, __VA_ARGS__) #define LERRP(msg) do { fputs(RED "[ERROR] ", stderr); perror(msg); fputs(RST, stderr); } while (0) #define LERRPV(msg) do { fprintf(stderr, RED "[ERROR %s:%i@%s] ", __FILE__, __LINE__, __func__); perror(msg); fputs(RST, stderr); } while(0) // Log critical: log and abort with exit status `ex` #define LCRIT(ex, msg) do { fputs(RED "[CRITICAL] " msg NLRST, stderr); exit(ex); } while (0) #define LCRITV(ex, msg) do { fprintf(stderr, RED "[CRITICAL %s:%i@%s] " msg NLRST, __FILE__, __LINE__, __func__); exit(ex); } while (0) #define LCRITF(ex, fmt, ...) do { fprintf(stderr, RED "[CRITICAL] " fmt NLRST, __VA_ARGS__); exit(ex); } while (0) #define LCRITVF(ex, fmt, ...) do { fprintf(stderr, RED "[CRITICAL %s:%i@%s] " fmt NLRST, __FILE__, __LINE__, __func__, __VA_ARGS__); exit(ex); } while (0) #define LCRITP(ex, msg) do { fputs(RED "[CRITICAL] ", stderr); perror(msg); fputs(NLRST, stderr); exit(ex); } while (0) #define LCRITPV(ex, msg) do { fprintf(stderr, RED "[CRITICAL %s:%i@%s] ", __FILE__, __LINE__, __func__); perror(msg); fputs(NLRST, stderr); exit(ex); } while(0) // exit status already specified to EXIT_FAILURE #define LFAIL(msg) do { fputs(RED "[CRITICAL] ", stderr); perror(msg); fputs(NLRST, stderr); exit(EXIT_FAILURE); } while (0) #define LFAILV(msg) do { fprintf(stderr, RED "[CRITICAL %s:%i@%s] ", __FILE__, __LINE__, __func__); perror(msg); fputs(NLRST, stderr); exit(EXIT_FAILURE); } while(0) /* vim: set ts=8 noet: */