#include <exec/memory.h>

#include <stdio.h>

#include <proto/exec.h>

#include "maker.h"
#include "proto.h"

ULONG		gTotMem = 0L;

BOOL GetMem(void **ptr, ULONG size)
{
	if (*ptr != 0L)
		printf("Entry to GetMem() with non-zero pointer!\n");

	*ptr = AllocMem(size, MEMF_CLEAR);

	if (*ptr == 0L)
	{
		printf("Error...Out of Memory!");
		return FALSE;
	}
	gTotMem += size;

	return TRUE;
}

BOOL DropMem(void **ptr, long size)
{
	if (*ptr != 0L && size != 0L)
	{
		FreeMem(*ptr, size);
		*ptr = 0L;
		gTotMem -= size;
	}
	return TRUE;
}

BOOL	RemLink(void **root, void *node)
{
	LinkNode		*tempptr;

/*		Find the node in the linked list		*/

	tempptr = (LinkNode *) root;
	while(tempptr->next != 0L && tempptr->next != node)
		tempptr = tempptr->next;
	
	if (tempptr->next == 0L)
	{
		printf("Error: missing node in remlink() ... (corrupted memory)");
		return FALSE;
	}
	else
	{

/*		Remove the node	*/

		tempptr->next =  ((LinkNode *) node)->next;
		((LinkNode *) node)->next = 0L;
		return TRUE; 
	}
}

BOOL	AddLink(void **root, void *node)
{
	LinkNode		*tempptr;

/*		Skip to the end of the linked list		*/

	tempptr = (LinkNode *) root;
	while (tempptr->next != 0L)
		tempptr = tempptr->next;

/*		Add the new node to the end of the linked list		*/

	tempptr->next = node;

/*		Set the node->next to point to nothing	*/

	((LinkNode *) node)->next = 0L;

	return TRUE;
}

BOOL	InsertLink(void **root, void *node, USHORT pos)
{
	LinkNode 	*tempptr;
	USHORT		i;

/* find the column header just before the desired position */

	tempptr = (LinkNode *) root;
	if (tempptr->next != 0L && pos)
	{
		for (i=0; i<pos; i++)
		{
			tempptr = tempptr->next;
			if (tempptr->next == 0L)
				break;
		}
	}

/*		Add the new node to the linked list		*/

	((LinkNode *) node)->next = tempptr->next;
	tempptr->next = node;

	return TRUE;
}

USHORT NodeCount(void **root)
{
	USHORT			i = 0;
	LinkNode			*tempptr;

	if (!root)
		return 0L;

	tempptr = (LinkNode *) root;
	while(tempptr = tempptr->next)
		i++;

	return i;
}

/*
	Find node number nodenum in a linked list, return its address
*/

LinkNode *FindNode(LinkNode **root, register short nodenum)
{
	register LinkNode 	*tempptr;

	if (!root)
		return 0L;

	tempptr = *root;

	while (tempptr && --nodenum >= 0)
		tempptr = tempptr->next;

	return (void *) tempptr;
}
		
short NodeNum(LinkNode **root, register LinkNode *targetNode)
{
	register LinkNode 	*node;
	register short			nodeNum;

	if (!root)
		return -1;

	for (node=*root, nodeNum=0; node; node=node->next, nodeNum++)
		if (node == targetNode)
			break;
			
	if (!node)
		nodeNum = -1;

	return nodeNum;
}
		
