| #ifndef DEBUG_H |
| #define DEBUG_H |
| |
| #include <stdlib.h> |
| #include <stdio.h> |
| |
| #define unlikely(expr) __builtin_expect (expr, 0) |
| #define likely(expr) __builtin_expect (expr, 1) |
| |
| #ifdef DEBUG |
| |
| #define FAILIF(cond, msg...) do { \ |
| if (unlikely(cond)) { \ |
| fprintf(stderr, "%s(%d): ", __FILE__, __LINE__); \ |
| fprintf(stderr, ##msg); \ |
| exit(1); \ |
| } \ |
| } while(0) |
| |
| /* Debug enabled */ |
| #define ASSERT(x) do { \ |
| if (unlikely(!(x))) { \ |
| fprintf(stderr, \ |
| "ASSERTION FAILURE %s:%d: [%s]\n", \ |
| __FILE__, __LINE__, #x); \ |
| exit(1); \ |
| } \ |
| } while(0) |
| |
| #else |
| |
| #define FAILIF(cond, msg...) do { \ |
| if (unlikely(cond)) { \ |
| fprintf(stderr, ##msg); \ |
| exit(1); \ |
| } \ |
| } while(0) |
| |
| /* No debug */ |
| #define ASSERT(x) do { } while(0) |
| |
| #endif/* DEBUG */ |
| |
| #define FAILIF_LIBELF(cond, function) \ |
| FAILIF(cond, "%s(): %s\n", #function, elf_errmsg(elf_errno())); |
| |
| static inline void *MALLOC(unsigned int size) { |
| void *m = malloc(size); |
| FAILIF(NULL == m, "malloc(%d) failed!\n", size); |
| return m; |
| } |
| |
| static inline void *CALLOC(unsigned int num_entries, unsigned int entry_size) { |
| void *m = calloc(num_entries, entry_size); |
| FAILIF(NULL == m, "calloc(%d, %d) failed!\n", num_entries, entry_size); |
| return m; |
| } |
| |
| static inline void *REALLOC(void *ptr, unsigned int size) { |
| void *m = realloc(ptr, size); |
| FAILIF(NULL == m, "realloc(%p, %d) failed!\n", ptr, size); |
| return m; |
| } |
| |
| static inline void FREE(void *ptr) { |
| free(ptr); |
| } |
| |
| static inline void FREEIF(void *ptr) { |
| if (ptr) FREE(ptr); |
| } |
| |
| #define PRINT(x...) do { \ |
| extern int quiet_flag; \ |
| if(likely(!quiet_flag)) \ |
| fprintf(stdout, ##x); \ |
| } while(0) |
| |
| #define ERROR PRINT |
| |
| #define INFO(x...) do { \ |
| extern int verbose_flag; \ |
| if(unlikely(verbose_flag)) \ |
| fprintf(stdout, ##x); \ |
| } while(0) |
| |
| /* Prints a hex and ASCII dump of the selected buffer to the selected stream. */ |
| int dump_hex_buffer(FILE *s, void *b, size_t l, size_t elsize); |
| |
| #endif/*DEBUG_H*/ |