#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*/