Libevhtp  1.2.13
internal.h
Go to the documentation of this file.
1 
5 #ifndef __EVHTP_INTERNAL_H__
6 #define __EVHTP_INTERNAL_H__
7 
8 #ifdef __cplusplus
9 extern "C" {
10 #endif
11 
12 
13 #if defined __GNUC__ || defined __llvm__
14 # define evhtp_likely(x) __builtin_expect(!!(x), 1)
15 # define evhtp_unlikely(x) __builtin_expect(!!(x), 0)
16 #else
17 # define evhtp_likely(x) (x)
18 # define evhtp_unlikely(x) (x)
19 #endif
20 
21 #ifndef TAILQ_FOREACH_SAFE
22 #define TAILQ_FOREACH_SAFE(var, head, field, tvar) \
23  for ((var) = TAILQ_FIRST((head)); \
24  (var) && ((tvar) = TAILQ_NEXT((var), field), 1); \
25  (var) = (tvar))
26 #endif
27 
28 
29 #define __FILENAME__ \
30  (strrchr(__FILE__, '/') ? \
31  strrchr(__FILE__, '/') + 1 : __FILE__)
32 
33 #define clean_errno() \
34  (errno == 0 ? "None" : strerror(errno))
35 
36 #define __log_debug_color(X) "[\x1b[1;36m" X "\x1b[0;39m]"
37 #define __log_error_color(X) "[\x1b[1;31m" X "\x1b[0;39m]"
38 #define __log_warn_color(X) "[\x1b[1;33m" X "\x1b[0;39m]"
39 #define __log_info_color(X) "[\x1b[32m" X "\x1b[0;39m]"
40 #define __log_func_color(X) "\x1b[33m" X "\x1b[39m"
41 #define __log_args_color(X) "\x1b[94m" X "\x1b[39m"
42 #define __log_errno_color(X) "\x1b[35m" X "\x1b[39m"
43 
44 
45 #if !defined(EVHTP_DEBUG)
46 /* compile with all debug messages removed */
47 #define log_debug(M, ...)
48 #else
49 #define log_debug(M, ...) \
50  fprintf(stderr, __log_debug_color("DEBUG") " " \
51  __log_func_color("%s/%s:%-9d") \
52  __log_args_color(M) \
53  "\n", \
54  __FILENAME__, __FUNCTION__, __LINE__, ## __VA_ARGS__)
55 #endif
56 
57 #define log_error(M, ...) \
58  fprintf(stderr, __log_error_color("ERROR") " " \
59  __log_func_color("%s:%-9d") \
60  __log_args_color(M) \
61  " :: " \
62  __log_errno_color("(errno: %s)") \
63  "\n", \
64  __FILENAME__, __LINE__, ## __VA_ARGS__, clean_errno())
65 
66 
67 #define log_warn(M, ...) \
68  fprintf(stderr, __log_warn_color("WARN") " " \
69  __log_func_color("%s:%-9d") \
70  __log_args_color(M) \
71  " :: " \
72  __log_errno_color("(errno: %s)") \
73  "\n", \
74  __FILENAME__, __LINE__, ## __VA_ARGS__, clean_errno())
75 
76 #define log_info(M, ...) \
77  fprintf(stderr, __log_info_color("INFO") " " \
78  __log_func_color("%4s:%-9d") \
79  __log_args_color(M) "\n", \
80  __FILENAME__, __LINE__, ## __VA_ARGS__)
81 
82 #ifndef NDEBUG
83 #define evhtp_assert(x) \
84  do { \
85  if (evhtp_unlikely(!(x))) { \
86  fprintf(stderr, "Assertion failed: %s (%s:%s:%d)\n", # x, \
87  __func__, __FILE__, __LINE__); \
88  fflush(stderr); \
89  abort(); \
90  } \
91  } while (0)
92 
93 #define evhtp_alloc_assert(x) \
94  do { \
95  if (evhtp_unlikely(!x)) { \
96  fprintf(stderr, "Out of memory (%s:%s:%d)\n", \
97  __func__, __FILE__, __LINE__); \
98  fflush(stderr); \
99  abort(); \
100  } \
101  } while (0)
102 
103 #define evhtp_assert_fmt(x, fmt, ...) \
104  do { \
105  if (evhtp_unlikely(!(x))) { \
106  fprintf(stderr, "Assertion failed: %s (%s:%s:%d) " fmt "\n", \
107  # x, __func__, __FILE__, __LINE__, __VA_ARGS__); \
108  fflush(stderr); \
109  abort(); \
110  } \
111  } while (0)
112 
113 #define evhtp_errno_assert(x) \
114  do { \
115  if (evhtp_unlikely(!(x))) { \
116  fprintf(stderr, "%s [%d] (%s:%s:%d)\n", \
117  strerror(errno), errno, \
118  __func__, __FILE__, __LINE__); \
119  fflush(stderr); \
120  abort(); \
121  } \
122  } while (0)
123 #else
124 #define evhtp_assert(x)
125 #define evhtp_alloc_assert(x)
126 #define evhtp_assert_fmt(x)
127 #define evhtp_errno_assert(x)
128 #endif
129 
130 
131 
132 
133 #ifdef __cplusplus
134 }
135 #endif
136 
137 #endif
138