/*
    libparted - a library for manipulating disk partitions
    Copyright (C) 2000, 2005, 2007 Free Software Foundation, Inc.

    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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/

#include <config.h>
#include <parted/parted.h>
#include <parted/debug.h>

#if ENABLE_NLS
#  include <libintl.h>
#  define _(String) dgettext (PACKAGE, String)
#else
#  define _(String) (String)
#endif /* ENABLE_NLS */

#ifdef DEBUG

#if HAVE_BACKTRACE
#include <execinfo.h>
#endif

static void default_handler ( const int level, const char* file, int line,
                const char* function, const char* msg );
static PedDebugHandler* debug_handler = &default_handler;


/**
 * Default debug handler.
 * Will print all information to stderr.
 */
static void default_handler ( const int level, const char* file, int line,
                const char* function, const char* msg )
{
        fprintf ( stderr, "[%d] %s:%d (%s): %s\n",
                        level, file, line, function, msg );
}

/**
 * Send a debug message.
 * Do not call this directly -- use PED_DEBUG() instead.
 *
 * level        log level, 0 ~= "print definitely"
 */
void ped_debug ( const int level, const char* file, int line,
                 const char* function, const char* msg, ... )
{
        va_list         arg_list;
        char*           msg_concat = ped_malloc(8192);
        
        va_start ( arg_list, msg );
                vsnprintf ( msg_concat, 8192, msg, arg_list );
        va_end ( arg_list );
        
        debug_handler ( level, file, line, function, msg_concat );

        ped_free ( msg_concat );
}

/*
 * handler      debug handler; NULL for default handler
 */
void ped_debug_set_handler ( PedDebugHandler* handler )
{
        debug_handler = ( handler ? handler : default_handler );
}

/*
 * Check an assertion.
 * Do not call this directly -- use PED_ASSERT() instead.
 */
int ped_assert ( int cond, const char* cond_text,
	    const char* file, int line, const char* function )
{
	PedExceptionOption	opt;

	if ( cond )
		return 1;

#if HAVE_BACKTRACE
	/* Print backtrace stack */
	void *stack[20];
	char **strings, **string;
        int size = backtrace(stack, 20);
	strings = backtrace_symbols(stack, size);

	if (strings) {
		printf(_("Backtrace has %d calls on stack:\n"), size);
		for (string = strings; size > 0; size--, string++)
			printf("  %d: %s\n", size, *string);

		free(strings);
	}
#endif

	/* Throw the exception */
	opt = ped_exception_throw (
		PED_EXCEPTION_BUG,
		PED_EXCEPTION_IGNORE_CANCEL,
		_("Assertion (%s) at %s:%d in function %s() failed."),
		cond_text, file, line, function );

	return ( opt == PED_EXCEPTION_IGNORE );
}

#endif /* DEBUG */

