#ifndef _UTILS_H #define _UTILS_H #include #include #include /* Is A == B ? */ #define streq(a,b) (strcmp((a),(b)) == 0) /* Does A start with B ? */ #define strstarts(a,b) (strncmp((a),(b),strlen(b)) == 0) /* Does A end in B ? */ static inline bool strends(const char *a, const char *b) { if (strlen(a) < strlen(b)) return false; return streq(a + strlen(a) - strlen(b), b); } #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) #define ___stringify(x) #x #define __stringify(x) ___stringify(x) /* Convenient wrappers for malloc and realloc. Use them. */ #define new(type) ((type *)malloc_nofail(sizeof(type))) #define new_array(type, num) realloc_array((type *)0, (num)) #define realloc_array(ptr, num) ((__typeof__(ptr))_realloc_array((ptr), sizeof((*ptr)), (num))) void *malloc_nofail(size_t size); void *realloc_nofail(void *ptr, size_t size); void *_realloc_array(void *ptr, size_t size, size_t num); void barf(const char *fmt, ...) __attribute__((noreturn)); void barf_perror(const char *fmt, ...) __attribute__((noreturn)); /* This version adds one byte (for nul term) */ void *grab_file(const char *filename, unsigned long *size); void release_file(void *data, unsigned long size); /* Signal handling: returns fd to listen on. */ int signal_to_fd(int signal); void close_signal(int fd); void xprintf(const char *fmt, ...); #define eprintf(_fmt, _args...) xprintf("[ERR] %s" _fmt, __FUNCTION__, ##_args) #define iprintf(_fmt, _args...) xprintf("[INF] %s" _fmt, __FUNCTION__, ##_args) #ifdef DEBUG #define dprintf(_fmt, _args...) xprintf("[DBG] %s" _fmt, __FUNCTION__, ##_args) #else #define dprintf(_fmt, _args...) ((void)0) #endif /* * Mux errno values onto returned pointers. */ static inline void *ERR_PTR(long error) { return (void *)error; } static inline long PTR_ERR(const void *ptr) { return (long)ptr; } static inline long IS_ERR(const void *ptr) { return ((unsigned long)ptr > (unsigned long)-1000L); } #endif /* _UTILS_H */ /* * Local variables: * c-file-style: "linux" * indent-tabs-mode: t * c-indent-level: 8 * c-basic-offset: 8 * tab-width: 8 * End: */