/* 
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of either:
 * 
 *   a) The GNU Lesser General Public License as published by the Free
 *      Software Foundation; either version 2.1, or (at your option) any
 *      later version,
 * 
 *   OR
 * 
 *   b) The two-clause BSD license.
 *
 * These licenses can be found with the distribution in the file LICENSES
 */


#include "spf_alt/spf_sys_config.h"


#ifdef STDC_HEADERS
# include <stdlib.h>       /* malloc / free */
# include <stdarg.h>
# include <stdio.h>
#endif

#include "spf_alt/spf.h"
#include "spf_alt/spf_internal.h"


/*
 * standard expanded error formating routines
 */

void SPF_errorx( const char *file, int line, const char *format, ... )
{
    char	errmsg[SPF_SYSLOG_SIZE];
    va_list ap;
    va_start(ap, format);
    
    if ( SPF_error_handler == NULL )
	abort();
    
    vsnprintf( errmsg, sizeof( errmsg ), format, ap );
    SPF_error_handler( file, line, errmsg );
    va_end( ap );

    abort();
}


void SPF_warningx( const char *file, int line, const char *format, ... )
{
    char	errmsg[SPF_SYSLOG_SIZE];
    va_list ap;
    va_start(ap, format);
    
    if ( SPF_warning_handler == NULL )
	return;
    
    vsnprintf( errmsg, sizeof( errmsg ), format, ap );
    SPF_warning_handler( file, line, errmsg );
    va_end( ap );
}


void SPF_infox( const char *file, int line, const char *format, ... )
{
    char	errmsg[SPF_SYSLOG_SIZE];
    va_list ap;
    va_start(ap, format);
    
    if ( SPF_info_handler == NULL )
	return;
    
    vsnprintf( errmsg, sizeof( errmsg ), format, ap );
    SPF_info_handler( file, line, errmsg );
    va_end( ap );
}


void SPF_debugx( const char *file, int line, const char *format, ... )
{
    char	errmsg[SPF_SYSLOG_SIZE];
    va_list ap;
    va_start(ap, format);
    
    if ( SPF_debug_handler == NULL )
	return;
    
    vsnprintf( errmsg, sizeof( errmsg ), format, ap );
    SPF_debug_handler( file, line, errmsg );
    va_end( ap );
}



/*
 * error reporting routines that accept a va_list
 */

void SPF_errorv( const char *file, int line, const char *format, va_list ap )
{
    char	errmsg[SPF_SYSLOG_SIZE];
    
    if ( SPF_error_handler == NULL )
	abort();
    
    vsnprintf( errmsg, sizeof( errmsg ), format, ap );
    SPF_error_handler( file, line, errmsg );

    abort();
}


void SPF_warningv( const char *file, int line, const char *format, va_list ap )
{
    char	errmsg[SPF_SYSLOG_SIZE];
    
    if ( SPF_warning_handler == NULL )
	return;
    
    vsnprintf( errmsg, sizeof( errmsg ), format, ap );
    SPF_warning_handler( file, line, errmsg );
}


void SPF_infov( const char *file, int line, const char *format, va_list ap )
{
    char	errmsg[SPF_SYSLOG_SIZE];
    
    if ( SPF_info_handler == NULL )
	return;
    
    vsnprintf( errmsg, sizeof( errmsg ), format, ap );
    SPF_info_handler( file, line, errmsg );
}


void SPF_debugv( const char *file, int line, const char *format, va_list ap )
{
    char	errmsg[SPF_SYSLOG_SIZE];
    
    if ( SPF_debug_handler == NULL )
	return;
    
    vsnprintf( errmsg, sizeof( errmsg ), format, ap );
    SPF_debug_handler( file, line, errmsg );
}


/*
 * reporting routines for braindead compilers
 */

void SPF_errorx2( const char *format, ... )
{
    va_list ap;
    va_start( ap, format );
    SPF_errorv( NULL, 0, format, ap );
    va_end( ap );
}

void SPF_warningx2( const char *format, ... )
{
    va_list ap;
    va_start( ap, format );
    SPF_warningv( NULL, 0, format, ap );
    va_end( ap );
}

void SPF_infox2( const char *format, ... )
{
    va_list ap;
    va_start( ap, format );
    SPF_infov( NULL, 0, format, ap );
    va_end( ap );
}

void SPF_debugx2( const char *format, ... )
{
    va_list ap;
    va_start( ap, format );
    SPF_debugv( NULL, 0, format, ap );
    va_end( ap );
}


syntax highlighted by Code2HTML, v. 0.9.1