// Code for error type

/*

    Copyright (C) 1991-2001 The National Gallery

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU Lesser 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 Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser 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

 */

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif /*HAVE_CONFIG_H*/
#include <vips/intl.h>

#include <cstdio>
#include <cstdlib>

#include <iostream>

#include <vips/vips.h>

#include <vips/vipscpp.h>

#ifdef WITH_DMALLOC
#include <dmalloc.h>
#endif /*WITH_DMALLOC*/

VIPS_NAMESPACE_START

void VError::perror() 
{ 
	std::cerr << _what; 
	exit( 1 );
}

void VError::perror( const char *name ) 
{ 
	std::cerr << name << ": " << _what; 
	exit( 1 );
}

// Add a new bit to the end of the error buffer
VError &VError::app( const int i )
{ 
	char buf[ 256 ];

	sprintf( buf, "%d", i );
	_what += buf;

	return( *this );
}

VError &VError::app( std::string txt ) 
{ 
	_what += txt; 

	return( *this );
}; 

void VError::ostream_print( std::ostream &file ) const
{
	file << _what;
}

void verror( std::string str ) throw( VError )
{
	VError err;

	err.app( "VIPS error: " );
	if( str == "" ) {
		err.app( im_error_buffer() );
		im_error_clear();
	}
	else 
		err.app( str ).app( "\n" );

	throw( err );
}

VIPS_NAMESPACE_END
