/*
    libparted - a library for manipulating disk partitions
    Copyright (C) 1999, 2000, 2001, 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 "configmake.h"

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

#ifdef linux
#  include <parted/linux.h>
#elif defined(__BEOS__)
#  include <parted/beos.h>
#else
#  include <parted/gnu.h>
#endif

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

const PedArchitecture* ped_architecture;

/* ped_malloc() debugging.  Stick the address and size of memory blocks that
 * weren't ped_free()d in here, and an exception will be thrown when it is
 * allocated.  That way, you can find out what, exactly, the allocated thing
 * is, and where it is created.
 */
typedef struct
{
    void*	pointer;
    size_t	size;
} pointer_size_type;

#ifdef DEBUG
static pointer_size_type dodgy_malloc_list[] = {
 {0,		0},
 {0,		0},
 {0,		0},
 {0,		0},
 {0,		0},
 {0,		0},
 {0,		0},
 {0,		0},
 {0,		0},
 {0,		0}
};

static int	dodgy_memory_active[100];
#endif /* DEBUG */

int
ped_set_architecture (const PedArchitecture* arch)
{
	PED_ASSERT (ped_device_get_next (NULL) == NULL, return 0);

	ped_architecture = arch;
	return 1;
}

extern void ped_disk_aix_init ();
extern void ped_disk_bsd_init ();
extern void ped_disk_dvh_init ();
extern void ped_disk_gpt_init ();
extern void ped_disk_loop_init ();
extern void ped_disk_mac_init ();
extern void ped_disk_msdos_init ();
extern void ped_disk_pc98_init ();
extern void ped_disk_sun_init ();
extern void ped_disk_amiga_init ();
extern void ped_disk_dasd_init ();

static void
init_disk_types ()
{
	ped_disk_loop_init ();	/* must be last in the probe list */

#if defined(__s390__) || defined(__s390x__)
	ped_disk_dasd_init();
#endif

	ped_disk_sun_init ();
#ifdef ENABLE_PC98
	ped_disk_pc98_init ();
#endif
	ped_disk_msdos_init ();
	ped_disk_mac_init ();
	ped_disk_gpt_init ();
	ped_disk_dvh_init ();
	ped_disk_bsd_init ();
	ped_disk_amiga_init ();
	ped_disk_aix_init ();
}

#ifdef ENABLE_FS
extern void ped_file_system_amiga_init (void);
extern void ped_file_system_xfs_init (void);
extern void ped_file_system_ufs_init (void);
extern void ped_file_system_reiserfs_init (void);
extern void ped_file_system_ntfs_init (void);
extern void ped_file_system_linux_swap_init (void);
extern void ped_file_system_jfs_init (void);
extern void ped_file_system_hfs_init (void);
extern void ped_file_system_fat_init (void);
extern void ped_file_system_ext2_init (void);

static void
init_file_system_types ()
{
	ped_file_system_amiga_init ();
	ped_file_system_xfs_init ();
	ped_file_system_ufs_init ();
	ped_file_system_reiserfs_init ();
	ped_file_system_ntfs_init ();
	ped_file_system_linux_swap_init ();
	ped_file_system_jfs_init ();
	ped_file_system_hfs_init ();
	ped_file_system_fat_init ();
	ped_file_system_ext2_init ();
}
#endif /* ENABLE_FS */

extern void ped_disk_aix_done ();
extern void ped_disk_bsd_done ();
extern void ped_disk_dvh_done ();
extern void ped_disk_gpt_done ();
extern void ped_disk_loop_done ();
extern void ped_disk_mac_done ();
extern void ped_disk_msdos_done ();
extern void ped_disk_pc98_done ();
extern void ped_disk_sun_done ();
extern void ped_disk_amiga_done ();
extern void ped_disk_dasd_done ();

static void
done_disk_types ()
{
#if defined(__s390__) || (__s390x__)
	ped_disk_dasd_done ();
#endif
	ped_disk_sun_done ();
#ifdef ENABLE_PC98
	ped_disk_pc98_done ();
#endif
	ped_disk_msdos_done ();
	ped_disk_mac_done ();
	ped_disk_loop_done ();
	ped_disk_gpt_done ();
	ped_disk_dvh_done ();
	ped_disk_bsd_done ();
	ped_disk_amiga_done ();
	ped_disk_aix_done ();
}

static void _init() __attribute__ ((constructor));

static void
_init()
{
#ifdef ENABLE_NLS
	bindtextdomain (PACKAGE, LOCALEDIR);
#endif

	init_disk_types ();

#ifdef ENABLE_FS
	init_file_system_types ();
#endif

	/* FIXME: a better way of doing this? */
#ifdef linux
	ped_set_architecture (&ped_linux_arch);
#elif defined(__BEOS__)
	ped_set_architecture (&ped_beos_arch);
#else
	ped_set_architecture (&ped_gnu_arch);
#endif

#ifdef DEBUG
	memset (dodgy_memory_active, 0, sizeof (dodgy_memory_active));
#endif
}

#ifdef ENABLE_FS
extern void ped_file_system_ext2_done (void);
extern void ped_file_system_fat_done (void);
extern void ped_file_system_hfs_done (void);
extern void ped_file_system_jfs_done (void);
extern void ped_file_system_linux_swap_done (void);
extern void ped_file_system_ntfs_done (void);
extern void ped_file_system_reiserfs_done (void);
extern void ped_file_system_ufs_done (void);
extern void ped_file_system_xfs_done (void);
extern void ped_file_system_amiga_done (void);

static void
done_file_system_types ()
{
	ped_file_system_ext2_done ();
	ped_file_system_fat_done ();
	ped_file_system_hfs_done ();
	ped_file_system_jfs_done ();
	ped_file_system_linux_swap_done ();
	ped_file_system_ntfs_done ();
	ped_file_system_reiserfs_done ();
	ped_file_system_ufs_done ();
	ped_file_system_xfs_done ();
	ped_file_system_amiga_done ();
}
#endif /* ENABLE_FS */

static void _done() __attribute__ ((destructor));

static void
_done()
{
	ped_device_free_all ();

	done_disk_types ();

#ifdef ENABLE_FS
	done_file_system_types ();
#endif
}

const char*
ped_get_version ()
{
	return VERSION;
}

#ifdef DEBUG
static void
_check_dodgy_pointer (const void* ptr, size_t size, int is_malloc)
{
	int		i;

	for (i=0; dodgy_malloc_list[i].pointer; i++) {
		if (dodgy_malloc_list[i].pointer != ptr)
 			continue;
		if (is_malloc && dodgy_malloc_list[i].size != size)
			continue;
		if (!is_malloc && !dodgy_memory_active[i])
			continue;


		if (is_malloc) {
			ped_exception_throw (
				PED_EXCEPTION_INFORMATION,
				PED_EXCEPTION_OK,
				"Dodgy malloc(%x) == %p occurred (active==%d)",
				size, ptr, dodgy_memory_active[i]);
			dodgy_memory_active[i]++;
		} else {
			ped_exception_throw (
				PED_EXCEPTION_INFORMATION,
				PED_EXCEPTION_OK,
				"Dodgy free(%p) occurred (active==%d)",
				ptr, dodgy_memory_active[i]);
			dodgy_memory_active[i]--;
		}

		return;
	}
}
#endif /* DEBUG */

void*
ped_malloc (size_t size)
{
	void*		mem;

	mem = (void*) malloc (size);
	if (!mem) {
		ped_exception_throw (PED_EXCEPTION_FATAL, PED_EXCEPTION_CANCEL,
				     _("Out of memory."));
		return NULL;
	}

#ifdef DEBUG
	memset (mem, 0xff, size);
	_check_dodgy_pointer (mem, size, 1);
#endif

	return mem;
}

int
ped_realloc (void** old, size_t size)
{
	void*		mem;

	mem = (void*) realloc (*old, size);
	if (!mem) {
		ped_exception_throw (PED_EXCEPTION_FATAL, PED_EXCEPTION_CANCEL,
				     _("Out of memory."));
		return 0;
	}
	*old = mem;
	return 1;
}


void* ped_calloc (size_t size)
{
        void* buf = ped_malloc (size);

        memset (buf, 0, size);

        return buf;
}


void
ped_free (void* ptr)
{
#ifdef DEBUG
	_check_dodgy_pointer (ptr, 0, 0);
#endif

	free (ptr);
}

