--- a/common.h Mon Jun 09 18:58:39 2008 +0300
+++ b/common.h Tue Jun 17 16:39:55 2008 +0300
@@ -3,18 +3,24 @@
* error handling
*/
-void _generic_err (const char *func, int perr, int do_exit, const char *fmt, ...)
- __attribute__ ((format (printf, 4, 5)));
+void _generic_err (const char *func, int perr, const char *fmt, ...)
+ __attribute__ ((format (printf, 3, 4)));
+
+// needs to be defined as its own function for the noreturn attribute
+void _generic_err_exit (const char *func, int perr, const char *fmt, ...)
+ __attribute__ ((format (printf, 3, 4)))
+ __attribute__ ((noreturn));
+
// various kinds of ways to handle an error, 2**3 of them, *g*
-#define error(...) _generic_err(NULL, 0, 0, __VA_ARGS__)
-#define err_exit(...) _generic_err(NULL, 0, 1, __VA_ARGS__)
-#define perr(...) _generic_err(NULL, 1, 0, __VA_ARGS__)
-#define perr_exit(...) _generic_err(NULL, 1, 1, __VA_ARGS__)
-#define err_func(func, ...) _generic_err(func, 0, 0, __VA_ARGS__)
-#define err_func_exit(func, ...) _generic_err(func, 0, 1, __VA_ARGS__)
-#define perr_func(func, ...) _generic_err(func, 1, 0, __VA_ARGS__)
-#define perr_func_exit(func, ...) _generic_err(func, 1, 1, __VA_ARGS__)
+#define error(...) _generic_err( NULL, 0, __VA_ARGS__)
+#define err_exit(...) _generic_err_exit( NULL, 0, __VA_ARGS__)
+#define perr(...) _generic_err( NULL, 1, __VA_ARGS__)
+#define perr_exit(...) _generic_err_exit( NULL, 1, __VA_ARGS__)
+#define err_func(func, ...) _generic_err( func, 0, __VA_ARGS__)
+#define err_func_exit(func, ...) _generic_err_exit( func, 0, __VA_ARGS__)
+#define perr_func(func, ...) _generic_err( func, 1, __VA_ARGS__)
+#define perr_func_exit(func, ...) _generic_err_exit( func, 1, __VA_ARGS__)
// error(func + colon + msg, ...) + goto error
#define ERROR(...) do { err_func(__func__, __VA_ARGS__); goto error; } while (0)