50 lines
1.4 KiB
C
50 lines
1.4 KiB
C
#ifndef __errors_h
|
|
#define __errors_h
|
|
|
|
#include <unistd.h>
|
|
#include <errno.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
/*
|
|
* Define a macro that can be used for diagnostic output from
|
|
* examples. When compiled -DDEBUG, it results in calling printf
|
|
* with the specified argument list. When DEBUG is not defined, it
|
|
* expands to nothing.
|
|
*/
|
|
#ifdef DEBUG
|
|
# define DPRINTF(arg) printf arg
|
|
#else
|
|
# define DPRINTF(arg)
|
|
#endif
|
|
|
|
/*
|
|
* NOTE: the "do {" ... "} while (0);" bracketing around the macros
|
|
* allows the err_abort and errno_abort macros to be used as if they
|
|
* were function calls, even in contexts where a trailing ";" would
|
|
* generate a null statement. For example,
|
|
*
|
|
* if (status != 0)
|
|
* err_abort (status, "message");
|
|
* else
|
|
* return status;
|
|
*
|
|
* will not compile if err_abort is a macro ending with "}", because
|
|
* C does not expect a ";" to follow the "}". Because C does expect
|
|
* a ";" following the ")" in the do...while construct, err_abort and
|
|
* errno_abort can be used as if they were function calls.
|
|
*/
|
|
#define err_abort(code,text) do { \
|
|
fprintf (stderr, "%s at \"%s\":%d: %s\n", \
|
|
text, __FILE__, __LINE__, strerror (code)); \
|
|
abort (); \
|
|
} while (0)
|
|
#define errno_abort(text) do { \
|
|
fprintf (stderr, "%s at \"%s\":%d: %s\n", \
|
|
text, __FILE__, __LINE__, strerror (errno)); \
|
|
abort (); \
|
|
} while (0)
|
|
|
|
#endif
|