1 #ifndef DEBUG_H
2 #define DEBUG_H
3
4 #include <stdlib.h>
5 #include <stdio.h>
6
7 #define unlikely(expr) __builtin_expect (expr, 0)
8 #define likely(expr) __builtin_expect (expr, 1)
9
10 #ifdef DEBUG
11
12 #define FAILIF(cond, msg...) do { \
13 if (unlikely(cond)) { \
14 fprintf(stderr, "%s(%d): ", __FILE__, __LINE__); \
15 fprintf(stderr, ##msg); \
16 exit(1); \
17 } \
18 } while(0)
19
20 /* Debug enabled */
21 #define ASSERT(x) do { \
22 if (unlikely(!(x))) { \
23 fprintf(stderr, \
24 "ASSERTION FAILURE %s:%d: [%s]\n", \
25 __FILE__, __LINE__, #x); \
26 exit(1); \
27 } \
28 } while(0)
29
30 #else
31
32 #define FAILIF(cond, msg...) do { \
33 if (unlikely(cond)) { \
34 fprintf(stderr, ##msg); \
35 exit(1); \
36 } \
37 } while(0)
38
39 /* No debug */
40 #define ASSERT(x) do { } while(0)
41
42 #endif/* DEBUG */
43
44 #define FAILIF_LIBELF(cond, function) \
45 FAILIF(cond, "%s(): %s\n", #function, elf_errmsg(elf_errno()));
46
MALLOC(unsigned int size)47 static inline void *MALLOC(unsigned int size) {
48 void *m = malloc(size);
49 FAILIF(NULL == m, "malloc(%d) failed!\n", size);
50 return m;
51 }
52
CALLOC(unsigned int num_entries,unsigned int entry_size)53 static inline void *CALLOC(unsigned int num_entries, unsigned int entry_size) {
54 void *m = calloc(num_entries, entry_size);
55 FAILIF(NULL == m, "calloc(%d, %d) failed!\n", num_entries, entry_size);
56 return m;
57 }
58
REALLOC(void * ptr,unsigned int size)59 static inline void *REALLOC(void *ptr, unsigned int size) {
60 void *m = realloc(ptr, size);
61 FAILIF(NULL == m, "realloc(%p, %d) failed!\n", ptr, size);
62 return m;
63 }
64
FREE(void * ptr)65 static inline void FREE(void *ptr) {
66 free(ptr);
67 }
68
FREEIF(void * ptr)69 static inline void FREEIF(void *ptr) {
70 if (ptr) FREE(ptr);
71 }
72
73 #define PRINT(x...) do { \
74 extern int quiet_flag; \
75 if(likely(!quiet_flag)) \
76 fprintf(stdout, ##x); \
77 } while(0)
78
79 #define ERROR PRINT
80
81 #define INFO(x...) do { \
82 extern int verbose_flag; \
83 if(unlikely(verbose_flag)) \
84 fprintf(stdout, ##x); \
85 } while(0)
86
87 /* Prints a hex and ASCII dump of the selected buffer to the selected stream. */
88 int dump_hex_buffer(FILE *s, void *b, size_t l, size_t elsize);
89
90 #endif/*DEBUG_H*/
91