More flexible error handling introducing variadic function rather than
macro (macro can be #define'd away but speed increase questionable; C89
does not have variadic macros).