| #ifndef MODINITTOOLS_LOGGING_H |
| #define MODINITTOOLS_LOGGING_H |
| |
| /* Do we use syslog for messages or stderr? */ |
| extern int logging; |
| |
| /* Do we want to silently drop all warnings? */ |
| extern int quiet; |
| |
| /* Do we want informative messages as well as errors? */ |
| extern int verbose; |
| |
| #ifdef __GNUC__ |
| #define _printf __attribute__((format(printf, 1, 2))) |
| #else |
| #define _printf |
| #endif |
| |
| extern void _printf fatal(const char *fmt, ...); |
| extern void _printf error(const char *fmt, ...); |
| extern void _printf warn(const char *fmt, ...); |
| extern void _printf info(const char *fmt, ...); |
| |
| typedef void _printf (*errfn_t)(const char *fmt, ...); |
| |
| static inline void grammar(const char *cmd, |
| const char *filename, unsigned int line) |
| { |
| warn("%s line %u: ignoring bad line starting with '%s'\n", |
| filename, line, cmd); |
| } |
| |
| #define NOFAIL(ptr) do_nofail((ptr), __FILE__, __LINE__, #ptr) |
| |
| #define nofail_asprintf(ptr, ...) \ |
| do { if (asprintf((ptr), __VA_ARGS__) < 0) \ |
| do_nofail(NULL, __FILE__, __LINE__, #ptr); \ |
| } while(0) |
| |
| static inline void *do_nofail(void *ptr, const char *file, int line, const char *expr) |
| { |
| if (!ptr) { |
| fatal("Memory allocation failure %s line %d: %s.\n", |
| file, line, expr); |
| } |
| return ptr; |
| } |
| |
| #endif /* MODINITTOOLS_LOGGING_H */ |