aboutsummaryrefslogtreecommitdiffstats
path: root/include/log.h
blob: 489d6c2d88a79ce5d7fe95f9d4366332bfe6cadd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#pragma once

#include <stdio.h>
#include <stdlib.h>

// 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<log-level>[ |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: */