#ifndef ERROR_H
#define ERROR_H
#include <error.h>
#include <stdlib.h>
extern void (*error_func)(int, int, const char *, ...) __attribute__ ((format (printf, 3, 4)));
#define fail() exit(EXIT_FAILURE)
#define fatal_sys_error(errnum, ...) (error_func(EXIT_FAILURE, (errnum), __VA_ARGS__), fail())
#define fatal_error(...) (error_func(EXIT_FAILURE, 0, __VA_ARGS__), fail())
#define nonfatal_sys_error(errnum, ...) error_func(0, (errnum), __VA_ARGS__)
#define nonfatal_error(...) error_func(0, 0, __VA_ARGS__)
#define file_error(filename, msg) fatal_error("%s: %s", (filename), (msg))
#define file_error_errno(filename, msg) fatal_sys_error(errno, "%s: %s", (filename), (msg));
#endif