This is the mail archive of the
gsl-discuss@sourceware.org
mailing list for the GSL project.
Re: Feedback from GSL folks on libflame 4.0
- From: Brian Gough <bjg at gnu dot org>
- To: "Field G. Van Zee" <field at cs dot utexas dot edu>
- Cc: gsl-discuss mailing list <gsl-discuss at sourceware dot org>,Rhys Ulerich <rhys dot ulerich at gmail dot com>,jungman at lanl dot gov
- Date: Fri, 19 Feb 2010 19:40:49 +0000
- Subject: Re: Feedback from GSL folks on libflame 4.0
- References: <4a00655d1002171047t4e87fb85w88b609245e3f9a8e@mail.gmail.com><4B7D90B5.4020707@cs.utexas.edu>
> It seemed like a better idea to just get our attention so we could
> fix the problem. We agree that using return values would be a more
> standard way of handling errors, but we're also somewhat cynical in
> that we don't trust our users to check return values.
The approach in GSL is to have an abort() by default, for the same
reason. But the user can turn off the abort() and use the error
return values instead by providing an alternative error handler as a
function pointer. Here's how it would look with your functions:
=== FLA_macro_defs.h ===
// Error code translation and output macro definition.
#define FLA_Check_error_code( code ) \
do { \
if (code != FLA_SUCCESS) { \
FLA_Check_error_code_helper( code, __FILE__, __LINE__ ); \
return code; \ /* see comment below about void functions */
} \
} while (0)
=== FLA_main_prototypes.h ===
typedef void FLA_error_handler_t (int code, const char * file, int line);
=== FLA_Check.c ===
static FLA_error_handler_t * FLA_error_handler = NULL;
void FLA_Check_error_code_helper( int code, char* file, int line )
{
if ( code == FLA_SUCCESS )
return;
if (FLA_error_handler)
{
(*FLA_error_handler) (code, file, line);
return ;
}
if ( FLA_ERROR_CODE_MAX <= code && code <= FLA_ERROR_CODE_MIN )
{
FLA_Print_message( FLA_Error_string_for_code( code ),
file, line );
FLA_Abort();
}
else
{
FLA_Print_message( FLA_Error_string_for_code( FLA_UNDEFINED_ERROR_CODE ),
file, line );
FLA_Abort();
}
}
(We actually have three macro GSL_ERROR, GSL_ERROR_VOID and
GSL_ERROR_VAL to handle different types of return value - error code,
void, and "other". This is to avoid warnings about "returning a value
from a void function" etc).