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