/* Error handling.
 */

/*

    Copyright (C) 1991-2005 The National Gallery

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

 */

/*

    These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk

 */

#ifndef IM_ERROR_H
#define IM_ERROR_H

#ifdef __cplusplus
extern "C" {
#endif /*__cplusplus*/

const char *im_error_buffer( void );
void im_error_clear( void );

void im_error( const char *domain, const char *fmt, ... )
	__attribute__((format(printf, 2, 3)));
void im_verror( const char *domain, const char *fmt, va_list ap );
void im_error_system( int err, const char *domain, const char *fmt, ... )
	__attribute__((format(printf, 3, 4)));
void im_verror_system( int err, const char *domain, 
	const char *fmt, va_list ap );
void im_warn( const char *domain, const char *fmt, ... )
	__attribute__((format(printf, 2, 3)));
void im_vwarn( const char *domain, const char *fmt, va_list ap );
void im_diag( const char *domain, const char *fmt, ... )
	__attribute__((format(printf, 2, 3)));
void im_vdiag( const char *domain, const char *fmt, va_list ap );

void error_exit( const char *fmt, ... )
	__attribute__((noreturn, format(printf, 1, 2)));

#ifdef __cplusplus
}
#endif /*__cplusplus*/

#endif /*!IM_ERROR_H*/
